ViewModel:
var lifeCycleEventLiveData = MutableLiveData<Lifecycle.Event>()
@OnLifecycleEvent(Lifecycle.Event.ON_DESTROY)
fun onActivityDestroy() {
lifeCycleEventLiveData.value = Lifecycle.Event.ON_DESTROY
}
}
(上述僅寫出了onDestroy,也可以加入其它生命周期事件監(jiān)聽)
自定義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) {
//①此處做銷毀等處理
}
})
}
}
判定當(dāng)前activity為AppCompatActivity,進(jìn)行生命周期監(jiān)聽
但是問題是:并沒有在①處監(jiān)聽到回調(diào)。
LiveData無法回傳生命周期對(duì)象?
查看observe源碼:
public void observe(@NonNull LifecycleOwner owner, @NonNull Observer<? super T> observer) {
assertMainThread("observe");
if (owner.getLifecycle().getCurrentState() == DESTROYED) {
// ignore
return;
}
...
}
看到這里明白了,當(dāng)Activity的狀態(tài)時(shí)銷毀根本就不會(huì)傳數(shù)據(jù)出來。
那應(yīng)該如何回傳出來?
很簡(jiǎn)單,不使用LiveData的方式,而是給MyViewModel設(shè)置監(jiān)聽回調(diào)即可。
到這里,回到問題:Dialog如何監(jiān)聽生命周期?
在實(shí)現(xiàn)LifecycleObserver的ViewModel中監(jiān)聽各個(gè)生命周期并回傳給調(diào)用的Dialog。