- 博客(27)
- 收藏
- 关注

原创 Android屏幕适配—最易懂的今日头条适配方案解析
屏幕参数基础概念硬件/物理参数 物理属性 名称 定义 单位 尺寸 对角线的长度 inch,约等于2.54厘米 分辨率 屏幕方向上的像素个数 pixel,个 像素密度 单位英寸上的像素个数 ppi,point per inch 其中:(此处应该是height^2 + width^2 但是优快云不支持此类型的maekdown我就不
2020-12-08 22:55:59
1315
1

原创 Android 根Activity启动流程简单整理
Android 应用启动流程简单整理应用启动流程简单分为三个模块,其中最后由ActivityThread启动Activity是常见的面试高频问题,所以前面两个部分简单整理(有空再上源码分析),第三部分从源码分析,讲的比较详细。一.Launcher请求ActivityManageService点击图标,调用 launcher类 的 startActivitySafely 方法,其中调用了内部方法 startActivity,方法里设置了 intent.addFlags(Intent.FLAG_A
2020-05-15 14:27:38
4503
6

原创 Android生物认证Biometric 四十行代码轻松实现面部识别、指纹认证
BiometricBiometric是谷歌官方提供的生物识别验证类库,能调用包括目前Android设备上搭载的指纹、人脸、虹膜等系统级的生物认证。要使用 Biometric 库添加生物识别身份验证,需要添加 Biometric 库的依赖项: dependencies { implementation 'androidx.biometric:biometric:1.0.0...
2020-04-08 11:24:04
7134
15
原创 AndroidNDK JNI中调用java方法
做NDK开发的时候,有需求需要在JNI直接调用和获取Java中的方法和变量,比如回调,系统信息参数等…在JNI中调用Java方法,就需要使用FindClass和这两个类。
2022-11-25 16:01:35
1023
原创 Android NDK 在Linux下使用mk文件生成SO库
一般我们可以通过在项目中导入C/C++代码,使用AS中的cmake文件编译成so库,但是我这个库里的代码使用在ndk中的stdio库中的文件操作方法总是报错或者编译不通过,于是只能选择在Linux下直接使用ndk编译成so库了。最近有一个Linux下的C语言实现的文件操作库需要移植到Android上,而嵌入式的同事直接扔了一堆源码给到我,我一脸懵逼的同时也只能硬着头皮上了。目录,其中libs目录里就是我们可以直接在Android里调用的so库了。此时找到你的C/C++项目下的源码位置,新建。...
2022-08-26 12:02:03
1260
原创 Android 计算View的深度
这次遇到一个需求,需要计算当前View的深度,基本上就是大学时候数据结构里求二叉树的解法,记录一下,理论上也可以用于性能优化和性能监控 private int maxDeep(View view) { //view不会有子view所以就返回0 if (!(view instanceof ViewGroup)) { return 0; } ViewGroup viewGroup = (ViewGroup) view;
2022-04-28 15:17:34
1869
原创 Android EventBus保姆级源码解析(三)黏性事件原理
EventBus除了可以发送普通事件,还可以支持发送粘性事件,就是先发送事件之后再订阅也能收到该事件,类似于粘性广播,第三篇我们就来解析一下黏性事件的原理。Android 轻量级线程间通信EventBusAndroid EventBus保姆级源码解析(一)注册方法registerAndroid EventBus保姆级源码解析(二)发送事件postAndroid EventBus保姆级源码解析(三)黏性事件原理总结惯例总结(太长不看版):黏性事件是通过stickyEvents这个Map去实
2021-12-20 18:10:02
2468
原创 Android EventBus保姆级源码解析(二)发送事件post
前一篇文章我们分析了订阅事件的方法register,这篇我们继续淦发送事件的方法postAndroid 轻量级线程间通信EventBusAndroid EventBus保姆级源码解析(一)注册方法registerAndroid EventBus保姆级源码解析(二)发送事件postAndroid EventBus保姆级源码解析(三)黏性事件原理总结按照惯例,先上总结(太长不看版):获取当前线程的Event事件list,把post的事件(Event)加入list,如果当前没有开始分发,则遍历
2021-12-17 16:25:21
2512
原创 Android EventBus保姆级源码解析(一)注册方法register
记得上次写EventBus还是在上次(一年前,哈哈),转眼间又是一年了,发现对于EventBus的源码细节有点模糊,挖个坑捋捋EventBus的源码由于项目中使用且当前最新版本源码变化不大,本文贴出的源码基于EventBus3.0.0,关于EventBus的用法可以移步我之前的文章:Android EventBus你需要了解的都在这Android EventBus保姆级源码解析(二)发送事件post先上总结:EventBus.register方法开始订阅,先通过反射获取注册类中使用@Su
2021-12-15 18:30:30
3775
2
原创 AndroidQ 获取、设置锁屏密码
AndroidQ 获取、设置锁屏密码本文中贴出的源码均为AndroidQ(9.0)源码LockPatternUtils说到密码相关的一定要提到LockPatternUtils这个类,它是Android系统中管理锁屏密码的工具类,其中:设置密码:class LockPatternUtils{ /** * 修改密码 * * @param password 原密码,没有设置密码时为null * @param savedPassword 新密码 *
2021-11-12 15:47:22
3641
2
原创 Android 设置系统亮度
Android 设置系统亮度最近在做定制Android系统,Setting的源码看的我头疼,记录一下小小的知识点:首先需要在Manifest申请权限<uses-permission android:name="android.permission.SET_WALLPAPER" />亮度的值一般在0~255获取当前亮度: /** * 获取系统默认屏幕亮度值 屏幕亮度值范围(0-255) **/ private int getScreenBrightne
2021-09-09 16:20:58
1292
原创 设计模式之设计原则
设计模式之设计原则本文部分节选和引用自如何学好设计,做好架构? 核心思想才是关键感谢作者提供的高质量文章1.单一设计原则单一设计原则很好理解,指一个函数或者一个类再或者一个模块,职责越单一复用性就越强,同时能够降低耦合性。案例:获取本地用户信息,提交到网络fun post() { //创建数据库访问对象DAO val userDao = ... //从本地获取数据 val name = userDao.getName() val age
2021-06-02 18:06:21
134
原创 Flutter拖拽控件Draggable
Draggable最近做了一个Flutter项目,其中有一个需求是做出三个可以互相拖拽的任务列表,平时在做Android项目时,拖动的控件基本上都是自定义View来实现的,想看看在Fluter上大家都是怎么实现的,没想到flutter提供了一个非常方便的拖拽控件Draggable。Draggable的构造函数我个人在Flutter开发时,遇到没有见过的控件时,点开源码观察它的构造函数一定是了解它的功能的最优解,我们看Draggable的构造函数: const Draggable({ Key
2021-01-26 09:51:12
2465
原创 Android应用启动流程
最近看皇叔的《Android进阶解密》,前三张对Android启动讲的很明白,感觉把以前零散的知识点都穿起来了,推荐大家入手一本,非常值得。Android应用启动流程点击桌面应用图标,Launcher进程将启动Activity(MainActivity)的请求以Binder的方式发送给了AMS。AMS接收到启动请求后,交付ActivityStarter处理Intent和Flag等信息,然后再交给ActivityStackSupervisior/ActivityStack 处理Activity进栈相关
2021-01-22 15:48:39
277
3
原创 Android系统怎么启动
Android系统启动笔记启动电源以及系统启动:当电源按下时引导芯片从预定义的地方(固化在ROM)开始执行,加载引导程序BootLoader到RAM,然后执行。引导程序BootLoader:BootLoader是在Android系统开始运行前的引导程序,主要用于把系统OS拉起来并运行。Linux内核启动:当内核启动时,设置缓存、被保护存储器、计划列表、加载驱动。当其完成系统设置时,会先在系统文件中寻找init.rc文件,并启动init进程。init进程启动:初始化和启动属性服务,并且
2021-01-22 15:31:15
1084
原创 你的安卓手机为什么会卡-Android混乱生态的缺位者:推送
跟同事聊天聊到推送相关的问题,有感而发,正好可以水一篇…安卓手机为什么会卡安卓手机为什么会卡或者说国内的安卓手机为什么会这么容易卡,国内混乱的Android生态可能就是罪魁祸首。其中我认为缺少统一的推送服务、监管有力的应用市场是最为严重的问题,今天聊聊推送。推送是现在APP必备的功能之一,你需要推送来提醒微信的新消息,或者淘宝最新的促销,提前设置好的日程…Android如何推送国内的各大Android定制系统由于Google服务在大陆地区的使用很不稳定,往往会为了更好的用户体验而精简掉Goog
2020-11-06 15:26:21
535
原创 HashMap的put、get方法源码解析-HashMap笔记(二)
HashMap的put方法先看put方法的代码: public V put(K key, V value) { return putVal(hash(key), key, value, false, true); }从代码来看,显然put主要是调用了putVal方法,值得一提是参数中的hash(key),hash()就是HashMap中计算元素Hash值的方法: static final int hash(Object key) { int h;
2020-08-19 10:12:31
184
原创 HashMap的实现原理-HashMap笔记(一)
hashMap是Java集合框架下的一个实现类,用于存储Key-Value键值对的集合,每一个键值对也叫做Entry。这些个键值对(Entry)分散存储在一个数组(Table)当中,这个数组就是HashMap的主干。提示:这篇文章会涉及到JDK7和8的对比,但文中贴出的代码均是JDK8的HashMap源码。HashMap的实现原理在JDK1.8之前的版本中,HashMap采用数组+链表实现,即使用链表处理冲突,同一hash值的链表都存储在一个链表里。但是当位于一个桶中的元素较多,即hash值相.
2020-08-19 10:11:12
164
原创 Swift UIView draw方法无限调用-IOS开发问题记录
先上结论:调用 UIView.font = XX 会触发UIView的draw(_ rect: CGRect)方法记一次IOS开发中遇到的问题:接到某某同事的代码,跳转到某一画面时,用户A进入画面操作没有问题,但是用户B进入的时候就会卡死到崩溃,使用DebugMemoryGraph,查看了运行时内存使用的情况,发现点击画面入口后,内存用量不断增大,最后到3g左右程序就崩溃了经过一番调查:问题处在自定义的控件中,该同事在draw方法中,调用spuer.draw后,对控件的属性进行了设置,其中设置到sel
2020-08-14 14:47:03
828
原创 Java内存模型-深入理解JAVA虚拟机-笔记(一)
运行时数据区域Java虚拟机在执行Java程序的过程中,会把所有它管理的内存划分为若干个不同的数据区域.这些区域都有各自的用途,.根据的规定,java虚拟机所管理的内存将会包括以下几个运行时数据区域,如图所示:1. 程序计数器程序计数器(Program Counter Register)是一块较小的内存空间,它可以看做是当前线程所执行的字节码的行号指示器。在虚拟机的概念模型里(仅是概念模型,各种虚拟机可能会通过一些更高效的方式去实现),字节码解释器工作时就是通过改变这个计数器的值来选取下一条需要执
2020-07-24 13:53:25
158
原创 Android常用颜色大全
前段时间需要用到颜色信息,之前也是在网上寻找整理的,分享一下 <color name="colorPrimary">#6200EE</color> <color name="colorPrimaryDark">#262626</color> <color name="colorAccent">#03DAC5</color> <color name="white">#ffffff</col
2020-06-12 16:24:44
3169
原创 synchronized 锁升级(锁膨胀)机制 线程之间的爱恨纠葛
synchronized 简介synchronized是Java的关键字,可用来给对象和方法或者代码块加锁,当它锁定一个方法或者一个代码块的时候,同一时刻最多只有一个线程执行这段代码。Java1.6之前是悲观锁也就是现在的重量级锁,开销非常大,1.6之后JVM引入了偏向锁和轻量级锁,采用了现在的锁升级机制,使得性能有了很大的提高。相信大家多少在项目中也用到过这个关键字处理并发问题,今天话不多说...
2020-04-27 16:58:17
688
原创 Android 轻量级线程间通信EventBus
Android 轻量级线程间通信EventBus什么是EventBusEventBus是一个Android事件发布/订阅的轻量级框架,基于发布/订阅模式,将事件的接收者和发送者分离,主要是替代intent,Handler,BroadCast在Fragment,activity,service线程之间传递消息,轻松实现线程间通信。作为GitHub上的人气开源项目,截止现在(2020-04-26)已经有22.4k个star。EventBus-GitHub对于EventBus有基础的同学们推荐看一下后
2020-04-26 16:02:51
568
原创 Android 内存泄漏的原因以及解决方案
内存泄露是什么内存泄露即ML (Memory Leak)指 程序在申请内存后,当该内存不需再使用 但 却无法被释放 & 归还给 程序的现象内存泄露的原因以及解决方案内存泄露的原因归根到底就是当需要被回收变量的内存被其他变量引用持有,导致内存回收失败常见的原因有:1.非静态内部类/匿名类原因1:非静态内部类/匿名类 Handler持有外部的Activity/Fragment...
2020-04-24 13:44:33
4178
原创 Android View的事件分发机制源码分析
View的事件分发机制最近看到事件分发机制的讨论,可是细节都忘的差不多了,看以前的笔记写的比较简单,就趁这个机会整(shui)理(wen)吧。事件分发机制的传递规则时间分发机制的传递规则可以用以下伪代码表示: public boolean dispatchTouchEvent(MotionEvent ev) { boolean result = false;//事件是...
2020-04-20 10:58:53
190
原创 Android为什么能在子线程中更新UI
Android为什么能在子线程中更新UI刚学习Android开发的时候经常有需要在子线程里更新UI的操作,总是会遇到报错:Only the original thread that created a view hierarchy can touch its views.“只有创建视图层次结构的原始线程才能触摸其视图。”因为大部分的View创建都是在UI线程(主线程),所以我们都有一个共识:...
2020-04-09 15:59:31
457
原创 RecyclerView只有一行数据的解决方案
作为一个刚开始学习Android的菜鸟,今天学习做一个简单的聊天界面 刚开始使用了RecyclerView 就碰到了只显示一行数据的问题。上网查阅一番后发现几个解决方案。1.初始化布局的时候把第二个参数设置为空,或者只设置两个参数,第一个为布局ID,第二个参数为空。上一下我的初始化布局代码public ViewHolder onCreateViewHolder(View
2017-09-20 00:12:01
1109
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人