來聊一聊Lifecycle組件

這里省略了Lifecycle的相關(guān)背景介紹,直接進入主題,不多逼逼。我們這里先不深入到源碼分析,就從常用的幾個類分析下這個組件的實現(xiàn)思路。一句話,這個Lifecycle設(shè)計思想就是一個觀察者模式。

其觀察者模式相關(guān)的核心類

  1. 被觀察者 LifecycleOwner
  2. 觀察者 LifecycleObserver
  3. 存儲觀察者的容器 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)化,逼格更高點。

分析完畢!

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

友情鏈接更多精彩內(nèi)容