第三方sdk原理

LeakCanary内存泄漏检测原理:

(1).application中注册Activity生命周期onActivityDestory回调,同样的检测fragment也是通过监听Fragment的生命周期,利用fragmentManager.registerFragmentLifecycleCallbacks可以实现Fragment是在onFragmentDestroy()中检测Fragment对象是否泄露。

(2).在回调方法中创建引用队列关联activity弱引用对象KeyedWeakReference实例,并将KeyedWeakReference对象存放在集合中保存
KeyedWeakReference reference = new KeyedWeakReference(activity,referenceQueue);KeyedWeakReference继承自WeakReference
(3).首先遍历集合判断弱引用队列中是否包含activity,如果包含说明对象被回收将其从集合中删除,不包含说明可能存在内存泄漏需要进一步检查
(4).在主线程空闲的时候(Looper.getMainLooper().addIdle())再次检查引用队列中是否包含activity,如果依然不包含,调用System.gc()进行gc回收,因为gc操作不是同步操作,所以sleep(100)ms后再次检查是否发生内存泄漏
(5).发生了内存泄漏:Debug.dumpHprofData(String fileName)文件分析内存泄漏对象到GC root的引用链并发送泄漏信息给RD.

LMK杀死进程优先级
1.前台进程:与用户正在交互的进程
2.可见进程:用户可见但不可交互,比如Activity上弹出对话框这种情境下,Activity虽然可见但失去了焦点
3.服务进程:app处于后台,使用service在播放音乐或者下载文件这种情景下
4.后台进程:app处于后台,页面组件不可见,比如执行了Actity的onStop
5.空进程:app处于后台但是没有活动的组件在运行,空进程存在的目的在于能够快速响应用户点击图标唤醒进程。
当两个应用的进程优先级相同时,LMK优先杀死占有内存高的进程。

监听进程内存状态
两种实现方式
(1).Application和Activity中的onTrimMemory(int level)系统回调,level等级有应用处于前台,系统内存不足,该进程马上要被kill掉等
(2).调用activityManager.getMemoryInfo()查询内存信息,包括应用剩下可用内存,应用总内存以及布尔值的系统是否处于低内存状态等信息。

LocalBordcastManager线程安全的单例实现类,通过handler发送消息切换到主线程来执行,适合进程内通信

Class ReceiverRecord{

BroadcastReceiver receiver;

IntentFilter filter;

boolean broadcasting;

}

class BroadcastRecord{
Intent intent;
ArrayList<ReceiverRecord> receivers;
}

HashMap<BroadcastReceiver, ArrayList<ReceiverRecord>> mReceivers = new HashMap<>();//注册时保存receiver的对应关系

HashMap<String, ArrayList<ReceiverRecord>> mActions = new HashMap<>();//注册时保存action和receiver对应关系,方便发送广播时查找对应的ReceiverRecord,一对多的关系

ArrayList<BroadcastRecord> mPendingBroadcasts = new ArrayList<>();//正在执行的BroadcastReceiver

注册时
registerReceiver(BroadcastReceiver receiver,IntentFiler filter);
保存receiver和ReceiverRecord的对应关系:一对多(因为一个receiver可以对应多个intentFilter)
保存action和ReceiverRecord的对应关系:一对多(因为一个action可以对应多个receiver)

发送广播
sendBroadcast(Intent intent)
从intent中获取action匹配的receiver,然后将receiver加入到执行集合中,发送handler消息开始执行

反注册
unregisterReceiver(BroadCastReceiver receiver)
从两个map集合中删除对应的receiver

©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • update time 2021年04月27日19:50:07,文章版本:V 1.4,阅读时间40分钟,建议先收藏...
    _明川阅读 23,275评论 22 108
  • 、主要分为以下几部分: (1)java面试题 (2)Android面试题 (3)高级开发技术面试题 (4)跨平台H...
    索尼自行车阅读 4,721评论 0 1
  • 0×01 五大在线检测平台 腾讯的金刚审计系统 http://service.security.tencent.c...
    CQ_TYL阅读 11,903评论 0 2
  • 面试已经过一段落,前前后后面试了有10几家公司,遇到的Android基础知识考核大同小异,借此机会对Android...
    YoungTa0阅读 12,011评论 1 68
  • 线程和进程的区别是啥 详见 http://www.jianshu.com/p/04c3706521b5 线程切换如...
    MrWang915阅读 4,892评论 0 2

友情链接更多精彩内容