前言
Lifecycle是谷歌推出的架構(gòu)組件之一, 實(shí)現(xiàn)主動響應(yīng)activity,fragment組件生命周期變化,幫助開發(fā)者生產(chǎn)組織良好的代碼,提供代碼的可維護(hù)性。
如何使用:
新建observer類,使用注解方式觀察生命周期
public class MyObserver implements LifecycleObserver {
@OnLifecycleEvent(Lifecycle.Event.ON_RESUME)
public void connectListener() {
...
}
@OnLifecycleEvent(Lifecycle.Event.ON_PAUSE)
public void disconnectListener() {
...
}
}
在activity 或fragment onCreate添加注冊
getLifecycle().addObserver(new MyObserver(getApplicationContext()));
原理分析:

以getLifecycle().addObserver(new MyObserver(getApplicationContext()));
為代碼分析入口。
我們知道Fragments 和 Activities 在 Support Library 26.1.0以后實(shí)現(xiàn)了LifecycleOwner接口。
public interface LifecycleOwner {
/**
* Returns the Lifecycle of the provider.
*
* @return The lifecycle of the provider.
*/
Lifecycle getLifecycle();
}
Fragments 和 Activity 持有LifecycleRegistry類的對象,而它是Lifecycle的具體實(shí)現(xiàn)類
··· java
public class Fragment implements LifecycleOwner{
LifecycleRegistry mLifecycleRegistry = new LifecycleRegistry(this);
@Override
public Lifecycle getLifecycle() {
return mLifecycleRegistry;
}
void performCreate(Bundle savedInstanceState) {
......
mLifecycleRegistry.handleLifecycleEvent(Lifecycle.Event.ON_CREATE);
}
void performStart() {
.......
mLifecycleRegistry.handleLifecycleEvent(Lifecycle.Event.ON_START);
}
.......
}
···
由Framework層的FragmentManger負(fù)責(zé)管理和執(zhí)行fragment的生命周期函數(shù)performCreate()等
我們再分析下LifecycleRegistry核心類。
LifecycleRegistry扮演Observable的角色,幫助activity,fragment管理維護(hù)所有的Observer。
public class LifecycleRegistry extends Lifecycle {
private FastSafeIterableMap<LifecycleObserver, ObserverWithState> mObserverMap =
new FastSafeIterableMap<>();
@Override
public void addObserver(LifecycleObserver observer) {
......
}
@Override
public void removeObserver(LifecycleObserver observer) {
mObserverMap.remove(observer);
}
}
總結(jié):
Lifecycle組件實(shí)現(xiàn)觀察者模式,使普通組件能夠主動響應(yīng)activity,fragment生命周期的變化,使activity fragment等UI controllers保持精簡,提高代碼的可維護(hù)性。
參考:
https://developer.android.google.cn/topic/libraries/architecture/lifecycle.html#use-cases
android 8.0 source code