這里省略了Lifecycle的相關(guān)背景介紹,直接進入主題,不多逼逼。我們這里先不深入到源碼分析,就從常用的幾個類分析下這個組件的實現(xiàn)思路。一句話,這個Lifecycle設(shè)計思想就是一個觀察者模式。
其觀察者模式相關(guān)的核心類
- 被觀察者 LifecycleOwner
- 觀察者 LifecycleObserver
- 存儲觀察者的容器 LifecycleRegistry
這是一個典型的觀察者需要具備的元素
那么Android中Activity如何利用這些組件發(fā)送自己的生命周期事件呢?Android support 包 26以上 AppCompatActivity實現(xiàn)了LifecycleOwner接口,說明Activity現(xiàn)在本身是一個被觀察者,其次,AppCompatActivity中持有了LifecycleRegistry這個保存觀察者的容器,那么可以猜想只要將我們的觀察者添加到這個容器中,那么AppCompatActivity生命周期發(fā)生變化時,就能夠傳達給觀察者。那么具體怎么實現(xiàn)當(dāng)Activity的生命周期發(fā)生變化時何通知到觀察者呢?有一個思路是我們可以在Activity的每個生命周期回調(diào)方法中將相關(guān)的事件分發(fā)給觀察者。但是源碼中并沒有這樣做,而是利用了一個中間件ReportFragment來間接的分發(fā)事件傳達給觀察者,為啥這樣做呢?這就是Google大佬的牛逼所在,因為Fragment生命周期和Activity生命周期是聯(lián)動的,F(xiàn)ragment可以感知對應(yīng)的Activity生命周期。這個設(shè)計還是很巧妙的,而且降低了耦合,并且這個中間件可以復(fù)用。比如我們?nèi)绻雮鬟_Fragment的生命周期,我們就可以直接利用這個中間件ReportFragment,而不用在Fragment的每個生命周期方法中再寫一套相同的邏輯傳達生命周期事件。
以上就是Lifecycle生命周期感知組件核心的設(shè)計思想。其優(yōu)點是,我們可以自動感知到Activity/Fragment生命周期的變化,而不用再像之前Activity/Fragment生命周期變化時,手動的發(fā)送通知。
一點小思考,Activity/Fragment生命周期方法很多,比如 onCreate()、onStart()、onResume()...那么如何實現(xiàn)Activity/Fragment 每個生命周期方法回調(diào)中,正確傳達到我們觀察者對應(yīng)的方法中呢?比如下面代碼
public class MyPresenter implements LifecycleObserver{
public void onCreate(){
//ignore some code
}
public void onStart(){
//ignore some code
}
}
我這里我定義了一個觀察者MyPresenter,并且想監(jiān)聽Activty/Frgment的 onCreate()和onStart()方法,那么猜想我們該如何實現(xiàn)?(暫時不看google源碼實現(xiàn))
思路一:我們可以利用注解,事先約定好注解,比如在onCreate方法標記一個注解如@Lifeccyle("onCreate"),在onStart()方法上標記一個注解 @Lifecycle("onStart") 。那么如果此時需要分發(fā)Activity的onCreate()事件給觀察者時,這時我們可以利用反射機制,獲取到這個觀察者對象所有方法的注解信息,找到其中@Lifeccyle注解值為"onCreate"的方法,然后反射調(diào)用。onStart方法原理一樣。這樣就可以實現(xiàn)了,但是這樣性能有點低,每次Activity傳達事件時,就要反射調(diào)用方法。
思路二:我們可以建立一個模版觀察者,比如
public class BaseLifecycleObserver{
public void onCreate(){
}
public void onStart(){
}
public void onResume(){
}
public void onPause(){
}
public void onStop(){
}
public void onDestroy(){
}
...
}
這里我們建立了一個模板的Activity/Fragment生命周期觀察者,然后定義了所有的生命周期方法,我們約定所有的觀察者必須繼承這個模板觀察者,這樣在運行時,我們就可以根據(jù)當(dāng)前的生命周期類型,回調(diào)觀察者對應(yīng)的生命周期監(jiān)聽方法。
以上就是我們自己的思路,實際上google也是類似這樣實現(xiàn)的,不過內(nèi)部應(yīng)該進行了一些小優(yōu)化,逼格更高點。
分析完畢!