ViewModel:
var lifeCycleEventLiveData = MutableLiveData<Lifecycle.Event>()
@OnLifecycleEvent(Lifecycle.Event.ON_DESTROY)
fun onActivityDestroy() {
lifeCycleEventLiveData.value = Lifecycle.Event.ON_DESTROY
}
}
(上述仅写出了onDestroy,也可以加入其它生命周期事件监听)
自定义Dialog:
if (activity is AppCompatActivity) {
val lifecycle = (activity as AppCompatActivity).lifecycle
val viewModel = MyViewModel()
lifecycle.addObserver(viewModel)
viewModel.lifeCycleEventLiveData.observe(activity as AppCompatActivity, {
if (it === Lifecycle.Event.ON_DESTROY) {
//①此处做销毁等处理
}
})
}
}
判定当前activity为AppCompatActivity,进行生命周期监听
但是问题是:并没有在①处监听到回调。
LiveData无法回传生命周期对象?
查看observe源码:
public void observe(@NonNull LifecycleOwner owner, @NonNull Observer<? super T> observer) {
assertMainThread("observe");
if (owner.getLifecycle().getCurrentState() == DESTROYED) {
// ignore
return;
}
...
}
看到这里明白了,当Activity的状态时销毁根本就不会传数据出来。
那应该如何回传出来?
很简单,不使用LiveData的方式,而是给MyViewModel设置监听回调即可。
到这里,回到问题:Dialog如何监听生命周期?
在实现LifecycleObserver的ViewModel中监听各个生命周期并回传给调用的Dialog。