美文网首页
第三方sdk原理

第三方sdk原理

作者: ModestStorm | 来源:发表于2022-11-05 22:32 被阅读0次

    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

    相关文章

      网友评论

          本文标题:第三方sdk原理

          本文链接:https://www.haomeiwen.com/subject/hcvazrtx.html