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