原文:https://weread.qq.com/web/reader/d82322e0813ab6e2eg015684
起因:使用Dialog未dismiss时Activity关闭了,导致内存泄露
解决:给Dialog添加生命周期监听
1 | class TipDialog(context: Context) : Dialog(context), LifecycleObserver { |
androidx.core.app.ComponentActivity默认实现了LifecycleOwner接口,getLifecycle返回的实际是一个LifecycleRegistry对象,LifecycleRegistry是Lifecycle的唯一实现类。
Lifecycle抽象类定义了添加观察者addObserver()、移除观察者removeObserver()、获取当前状态getCurrentState()
androidx.core.app.ComponentActivity都做了些什么:
1 |
|
其中ReportFragment是个无页面的Fragment用来兼容处理不是继承自FragmentActivity的视图,确保ProcessLifecycleOwner可以正常工作(让那些不是直接继承自FragmentActivity的页面可以使用Lifecycle)
1 | public static void injectIfNeededIn(Activity activity){ |
在ReportFragment中可以看到对应生命周期的方法中都会执行dispatch方法:
1 |
|
再来看看dispatch方法的主要代码:
1 | private void dispatch(Lifecycle.Event event){ |
dispatch方法最终都会进入handleLifecycleEvent方法中,通过handleLifecycleEvent设置状态并通知观察者,Activity便能监听到生命周期的变化了。