你要的進階,Jetpack核心元件Lifecycle的使用和原始碼解析
Lifecycle是Android Architecture Components的一員,這玩意兒挺方便的,它是能感知Activity和Fragment的生命週期的.
一、使用Lifecycle
1. 引入Lifecycle
我們來看一下如何引入:
1.非androidX專案引入:
//執行時 implementation "android.arch.lifecycle:runtime:1.1.1" // 編譯期 annotationProcessor "android.arch.lifecycle:compiler:1.1.1"
2.androidX專案引入:
androidX是support庫的新時代,Google正在將support遷移到androidx中.
implementation "androidx.lifecycle:lifecycle-runtime:2.0.0" implementation "androidx.lifecycle:lifecycle-extensions:2.0.0" implementation "androidx.lifecycle:lifecycle-common-java8:2.0.0" annotationProcessor"androidx.lifecycle:lifecycle-compiler:2.0.0"
2. 建立生命週期觀察者
public class MyObserver implements LifecycleObserver { private static final String TAG = "MyObserver"; @OnLifecycleEvent(Lifecycle.Event.ON_CREATE) public void onCreate() { Log.w(TAG, "onCreate: "); } @OnLifecycleEvent(Lifecycle.Event.ON_START) public void onStart() { Log.w(TAG, "onStart: "); } @OnLifecycleEvent(Lifecycle.Event.ON_RESUME) public void onResume() { Log.w(TAG, "onResume: "); } @OnLifecycleEvent(Lifecycle.Event.ON_PAUSE) public void onPause() { Log.w(TAG, "onPause: "); } @OnLifecycleEvent(Lifecycle.Event.ON_STOP) public void onStop() { Log.w(TAG, "onStop: "); } @OnLifecycleEvent(Lifecycle.Event.ON_DESTROY) public void onDestroy() { Log.w(TAG, "onDestroy: "); } }
我們首先建立了一個類,它實現了LifecycleObserver介面,並且我寫了幾個模擬生命週期的方法,並在每個方法上加上了註解.
3. 觀察生命週期
然後我在Activity中這樣寫:
public class MainActivity extends AppCompatActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); //新增一個生命週期觀察者getLifecycle()是FragmentActivity中的方法 MyObserver observer = new MyObserver(); getLifecycle().addObserver(observer); } }
我們將專案執行起來,觀察結果:
2019-03-12 22:14:26.672 15790-15790/? W/MyObserver: onCreate: 2019-03-12 22:14:26.676 15790-15790/? W/MyObserver: onStart: 2019-03-12 22:14:26.679 15790-15790/? W/MyObserver: onResume: 2019-03-12 22:15:13.054 15790-15790/? W/MyObserver: onPause: 2019-03-12 22:15:13.234 15790-15790/? W/MyObserver: onStop: 2019-03-12 22:15:13.241 15790-15790/? W/MyObserver: onDestroy:
我們發現,不管Activity的生命週期如何變化,我建立的觀察者總是能夠監聽到響應的生命週期變化,並且變化時還會回撥我寫的生命週期方法(比如:public void onDestroy()).
方不方便? 你可能會問,這有啥用? 用處大了,比如我現在Presenter中就可以很方便的監聽Activity中的生命週期,從而進行一些相應的操作和處理.
二、Lifecycle原理解析
1. 從使用處入手
我們從使用的地方入手
MyObserver observer = new MyObserver(); getLifecycle().addObserver(observer);
getLifecycle()方法點進去是FragmentActivity,看註釋意思是返回生命週期提供者的Lifecycle
/** * Returns the Lifecycle of the provider. */ @Override public Lifecycle getLifecycle() { return super.getLifecycle(); }
再跟著super.getLifecycle();進入,來到了androidx.core.app.ComponentActivity,可以看到,ComponentActivity是繼承自Activity並實現了LifecycleOwner(該介面的作用是標記類有Android的生命週期的,比如Activity和Fragment)介面.
public class ComponentActivity extends Activity implements LifecycleOwner, KeyEventDispatcher.Component { private LifecycleRegistry mLifecycleRegistry = new LifecycleRegistry(this); @Override public Lifecycle getLifecycle() { return mLifecycleRegistry; } } /** * A class that has an Android lifecycle */ public interface LifecycleOwner { @NonNull Lifecycle getLifecycle(); }
那麼其實最終是返回的LifecycleRegistry,它是Lifecycle的子類
Lifecycle是一個抽象類,裡面有3個方法(新增觀察者和移除觀察者,獲取當前的狀態),還有一些狀態的列舉定義.
public abstract class Lifecycle { @MainThread public abstract void addObserver(@NonNull LifecycleObserver observer); @MainThread public abstract void removeObserver(@NonNull LifecycleObserver observer); @MainThread @NonNull public abstract State getCurrentState(); @SuppressWarnings("WeakerAccess") public enum Event { /** * Constant for onCreate event of the {@link LifecycleOwner}. */ ON_CREATE, /** * Constant for onStart event of the {@link LifecycleOwner}. */ ON_START, /** * Constant for onResume event of the {@link LifecycleOwner}. */ ON_RESUME, /** * Constant for onPause event of the {@link LifecycleOwner}. */ ON_PAUSE, /** * Constant for onStop event of the {@link LifecycleOwner}. */ ON_STOP, /** * Constant for onDestroy event of the {@link LifecycleOwner}. */ ON_DESTROY, /** * An {@link Event Event} constant that can be used to match all events. */ ON_ANY } @SuppressWarnings("WeakerAccess") public enum State { DESTROYED, INITIALIZED, CREATED, STARTED, RESUMED; public boolean isAtLeast(@NonNull State state) { return compareTo(state) >= 0; } } }
LifecycleRegistry是Lifecycle的一個實現,它是用在Fragment和Activity上的,它可以處理多個生命週期觀察者. 具體它有什麼作用,後面再講.
2. ReportFragment的由來
下面是ComponentActivity的onCreate()方法.
protected void onCreate(@Nullable Bundle savedInstanceState) { super.onCreate(savedInstanceState); ReportFragment.injectIfNeededIn(this); }
可以看到,在上面搞了一句,注入一個ReportFragment(報告Fragment? 紀檢委員? 打小報告的? 當然,我只是猜測).
有一點眉目了,其實就是在Activity中搞了一個Fragment,Fragment的生命週期我們知道了,當然就知道了Activity的生命週期,接著通知相關的觀察者即可.當然,這個Fragment是沒有介面的. 我們來看看,這個注入的方法幹了啥.
public class ReportFragment extends Fragment { private static final String REPORT_FRAGMENT_TAG = "androidx.lifecycle" + ".LifecycleDispatcher.report_fragment_tag"; public static void injectIfNeededIn(Activity activity) { // ProcessLifecycleOwner should always correctly work and some activities may not extend // FragmentActivity from support lib, so we use framework fragments for activities android.app.FragmentManager manager = activity.getFragmentManager(); if (manager.findFragmentByTag(REPORT_FRAGMENT_TAG) == null) { manager.beginTransaction().add(new ReportFragment(), REPORT_FRAGMENT_TAG).commit(); // Hopefully, we are the first to make a transaction. manager.executePendingTransactions(); } }
其實這個injectIfNeededIn()看起來像是注入的方法乾的就是將Fragment新增到Activity中,
來看看這個ReportFragment的生命週期方法都幹了些啥,
@Override public void onActivityCreated(Bundle savedInstanceState) { super.onActivityCreated(savedInstanceState); dispatchCreate(mProcessListener); dispatch(Lifecycle.Event.ON_CREATE); } @Override public void onStart() { super.onStart(); dispatchStart(mProcessListener); dispatch(Lifecycle.Event.ON_START); } private void dispatchCreate(ActivityInitializationListener listener) { if (listener != null) { listener.onCreate(); } }
通過呼叫dispatchCreate(mProcessListener)方法,感覺從命名上(是不是有點像dispatchTouchEvent())看就知道是在幹啥了: 分發當前的生命週期事件.
dispatch(Lifecycle.Event.ON_START); 感覺這個方法也像是在分發事件.
我們跟著這個mProcessListener來看看是在哪裡設定的
/** * Class that provides lifecycle for the whole application process. */ public class ProcessLifecycleOwner implements LifecycleOwner { //注意,我是一個單例 private static final ProcessLifecycleOwner sInstance = new ProcessLifecycleOwner(); static void init(Context context) { sInstance.attach(context); } void attach(Context context) { mHandler = new Handler(); mRegistry.handleLifecycleEvent(Lifecycle.Event.ON_CREATE); Application app = (Application) context.getApplicationContext(); app.registerActivityLifecycleCallbacks(new EmptyActivityLifecycleCallbacks() { @Override public void onActivityCreated(Activity activity, Bundle savedInstanceState) { ReportFragment.get(activity).setProcessListener(mInitializationListener); } @Override public void onActivityPaused(Activity activity) { activityPaused(); } @Override public void onActivityStopped(Activity activity) { activityStopped(); } }); } } //Activity的監聽器 ActivityInitializationListener mInitializationListener = new ActivityInitializationListener() { @Override public void onCreate() { } @Override public void onStart() { activityStarted(); } @Override public void onResume() { activityResumed(); } private final LifecycleRegistry mRegistry = new LifecycleRegistry(this); //Activity建立的時候,分發Lifecycle.Event.ON_START事件 void activityStarted() { mStartedCounter++; if (mStartedCounter == 1 && mStopSent) { mRegistry.handleLifecycleEvent(Lifecycle.Event.ON_START); mStopSent = false; } }
ReportFragment.java static ReportFragment get(Activity activity) { return (ReportFragment) activity.getFragmentManager().findFragmentByTag( REPORT_FRAGMENT_TAG); }
ProcessLifecycleOwner看起來就像是老大哥,給整個APP提供lifecycle的,也就是說通過它我們可以觀察到整個應用程式的生命週期. 如何做到的? ProcessLifecycleOwner的attach()中registerActivityLifecycleCallbacks()註冊了一個監聽器,一旦有Activity建立就給它設定一個Listener.這樣就保證了每個ReportFragment都有Listener.
既然是一個全域性的單例,並且可以監聽整個應用程式的生命週期,那麼,肯定一開始就需要初始化.
既然沒有讓我們在Application裡面初始化,那麼肯定就是在ContentProvider裡面初始化的.
3. 初始化
ps: 這裡穿插一個小知識點: ContentProvider的onCreate()方法執行時間比Application的onCreate()執行時間還要早,而且肯定會執行.所以在ContentProvider的onCreate()方法裡面初始化幾個特殊的小東西是沒啥問題的.
我們跟著ProcessLifecycleOwner的init()方法的呼叫處,來到了ProcessLifecycleOwnerInitializer,果不其然,它是一個ContentProvider.並且,在這裡,真的就初始化了2個小東西.
public class ProcessLifecycleOwnerInitializer extends ContentProvider { @Override public boolean onCreate() { LifecycleDispatcher.init(getContext()); ProcessLifecycleOwner.init(getContext()); return true; } }
1.ProcessLifecycleOwner初始化就不說了,是拿來觀察整個應用的生命週期的,其原理就是利用ReportFragment,我們稍後詳細到來.
2.LifecycleDispatcher尤其重要.
class LifecycleDispatcher { static void init(Context context) { ... //registerActivityLifecycleCallbacks註冊一個監聽器 ((Application) context.getApplicationContext()) .registerActivityLifecycleCallbacks(new DispatcherActivityCallback()); } } static class DispatcherActivityCallback extends EmptyActivityLifecycleCallbacks { @Override public void onActivityCreated(Activity activity, Bundle savedInstanceState) { //又來注入咯 ReportFragment.injectIfNeededIn(activity); } @Override public void onActivityStopped(Activity activity) { } @Override public void onActivitySaveInstanceState(Activity activity, Bundle outState) { } }
初始化的時候,就註冊了一個監聽器,每個建立的時候都給它注入一個ReportFragment.咦?這裡又來注入一次,不是每個Activity都註冊了一次麼,在ComponentActivity中,搞啥玩意兒?

我猜,可能是為了相容吧.2次注入,確保萬無一失.而且這個injectIfNeededIn()方法,內部實現是隻會成功注入一次的,所以多呼叫一次,無所謂.
4. 分發事件
相當於,到了這裡,應用程式裡面的任何一個Activity都會被注入一個ReportFragment.而注入的這個無介面的ReportFragment是可以觀察到當然Activity的生命週期的.
下面我們來仔細看一下,這個事件是如何一步步分發下去的.
ReportFragment.java @Override public void onActivityCreated(Bundle savedInstanceState) { super.onActivityCreated(savedInstanceState); dispatchCreate(mProcessListener); dispatch(Lifecycle.Event.ON_CREATE); } private void dispatch(Lifecycle.Event event) { Activity activity = getActivity(); if (activity instanceof LifecycleRegistryOwner) { ((LifecycleRegistryOwner) activity).getLifecycle().handleLifecycleEvent(event); return; } if (activity instanceof LifecycleOwner) { //獲取Activity中的LifecycleRegistry Lifecycle lifecycle = ((LifecycleOwner) activity).getLifecycle(); if (lifecycle instanceof LifecycleRegistry) { ((LifecycleRegistry) lifecycle).handleLifecycleEvent(event); } } }
不知道小夥伴兒們是否記得ComponentActivity是實現了LifecycleOwner的.
public class ComponentActivity extends Activity implements LifecycleOwner
下面我們獲取到Activity中的LifecycleRegistry,下面的程式碼做了精簡,只保留關鍵程式碼
public void handleLifecycleEvent(@NonNull Lifecycle.Event event) { State next = getStateAfter(event); moveToState(next); } private void moveToState(State next) { ...... sync(); ...... } private void sync() { LifecycleOwner lifecycleOwner = mLifecycleOwner.get(); //迴圈 遍歷所有觀察者 while (...) { .... //分發事件 forwardPass(lifecycleOwner); } } private void forwardPass(LifecycleOwner lifecycleOwner) { Iterator<Entry<LifecycleObserver, ObserverWithState>> ascendingIterator = mObserverMap.iteratorWithAdditions(); while (ascendingIterator.hasNext() && !mNewEventOccurred) { Entry<LifecycleObserver, ObserverWithState> entry = ascendingIterator.next(); ObserverWithState observer = entry.getValue(); while ((observer.mState.compareTo(mState) < 0 && !mNewEventOccurred && mObserverMap.contains(entry.getKey()))) { pushParentState(observer.mState); //分發事件 observer.dispatchEvent(lifecycleOwner, upEvent(observer.mState)); popParentState(); } } }
上面的observer其實是一個ObserverWithState物件,
static class ObserverWithState { State mState; GenericLifecycleObserver mLifecycleObserver; ObserverWithState(LifecycleObserver observer, State initialState) { mLifecycleObserver = Lifecycling.getCallback(observer); mState = initialState; } void dispatchEvent(LifecycleOwner owner, Event event) { State newState = getStateAfter(event); mState = min(mState, newState); //生命週期變了....關鍵程式碼 mLifecycleObserver.onStateChanged(owner, event); mState = newState; } }
在ObserverWithState的構造方法中,通過 Lifecycling.getCallback(observer)根據傳進來的 observer ,構造了一個 GenericLifecycleObserver 型別的 mLifecycleObserver ,我們跟進去看一下.
static GenericLifecycleObserver getCallback(Object object) { if (object instanceof FullLifecycleObserver) { return new FullLifecycleObserverAdapter((FullLifecycleObserver) object); } if (object instanceof GenericLifecycleObserver) { return (GenericLifecycleObserver) object; } final Class<?> klass = object.getClass(); int type = getObserverConstructorType(klass); if (type == GENERATED_CALLBACK) { List<Constructor<? extends GeneratedAdapter>> constructors = sClassToAdapters.get(klass); if (constructors.size() == 1) { GeneratedAdapter generatedAdapter = createGeneratedAdapter( constructors.get(0), object); return new SingleGeneratedAdapterObserver(generatedAdapter); } GeneratedAdapter[] adapters = new GeneratedAdapter[constructors.size()]; for (int i = 0; i < constructors.size(); i++) { adapters[i] = createGeneratedAdapter(constructors.get(i), object); } return new CompositeGeneratedAdaptersObserver(adapters); } return new ReflectiveGenericLifecycleObserver(object); }
這個方法大概意思就是,根據傳進的LifecycleObserver進行判斷,構造一個GenericLifecycleObserver(目前是隻有4個子類:FullLifecycleObserverAdapter、SingleGeneratedAdapterObserver、CompositeGeneratedAdaptersObserver、ReflectiveGenericLifecycleObserver)的物件.
5. 依賴注入
首先,這裡穿插一點.我們在引入lifecycle時添加了語句annotationProcessor "android.arch.lifecycle:compiler:1.1.1",這個其實是註解處理器的依賴.
引入這個之後,會自動生成xxx_LifecycleAdapter的檔案,上面的demo中生成的是MyObserver_LifecycleAdapter檔案,其內容如下:
public class MyObserver_LifecycleAdapter implements GeneratedAdapter { final MyObserver mReceiver; MyObserver_LifecycleAdapter(MyObserver receiver) { this.mReceiver = receiver; } @Override public void callMethods(LifecycleOwner owner, Lifecycle.Event event, boolean onAny, MethodCallsLogger logger) { boolean hasLogger = logger != null; if (onAny) { return; } if (event == Lifecycle.Event.ON_CREATE) { if (!hasLogger || logger.approveCall("onCreate", 1)) { mReceiver.onCreate(); } return; } if (event == Lifecycle.Event.ON_START) { if (!hasLogger || logger.approveCall("onStart", 1)) { mReceiver.onStart(); } return; } if (event == Lifecycle.Event.ON_RESUME) { if (!hasLogger || logger.approveCall("onResume", 1)) { mReceiver.onResume(); } return; } if (event == Lifecycle.Event.ON_PAUSE) { if (!hasLogger || logger.approveCall("onPause", 1)) { mReceiver.onPause(); } return; } if (event == Lifecycle.Event.ON_STOP) { if (!hasLogger || logger.approveCall("onStop", 1)) { mReceiver.onStop(); } return; } if (event == Lifecycle.Event.ON_DESTROY) { if (!hasLogger || logger.approveCall("onDestroy", 1)) { mReceiver.onDestroy(); } return; } } }
因為我們的事件是宣告在MyObserver的方法註解上面的,每次去反射取這些東西,比較耗效能.那麼我們通過該依賴庫,把這些標註了的方法進行預處理,然後直接回調這些方法,避免反射,進行提高效能.666,佩服.
有了上面的知識之後,分析getCallback()方法,不難發現,因為MyObserver_LifecycleAdapter只有一個構造方法,那麼就會構造出SingleGeneratedAdapterObserver.而SingleGeneratedAdapterObserver內部其實就是呼叫一下方法而已.
public class SingleGeneratedAdapterObserver implements GenericLifecycleObserver { private final GeneratedAdapter mGeneratedAdapter; SingleGeneratedAdapterObserver(GeneratedAdapter generatedAdapter) { mGeneratedAdapter = generatedAdapter; } @Override public void onStateChanged(LifecycleOwner source, Lifecycle.Event event) { mGeneratedAdapter.callMethods(source, event, false, null); mGeneratedAdapter.callMethods(source, event, true, null); } }
上面的mGeneratedAdapter其實就是我們的MyObserver_LifecycleAdapter.好了,結束了. 生命週期事件從Activity開始,然後到打小報告的ReportFragment那裡出來,輾轉發側,終於到了我們定義的觀察者,不容易啊.谷歌工程師寫的程式碼就是牛逼.
【附】相關架構及資料

