原文: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便能监听到生命周期的变化了。