Android新架構組件 LifeCycles 簡介

1、前言

爲了使開發者能儘快在 Android 平臺上開發出高質量的項目,Android 官方推出了 Android Jetpack 項目,旨在從基礎,架構,行爲以及界面 4 大方面體系化地爲咱們提供組件級別的支持。固然,在實際開發過程當中,咱們的舊項目甚至是新項目都不可能徹底採用其所有的解決方案。通常來講咱們都是各取所需,汲長補短。bash

我最關注的是其所提供的架構方面的組件, 這一套架構的核心組件Lifecycles、LiveData、ViewModel、Room也被稱之爲 AAC。經過 AAC + DataBinding+ MVVM 所打造的應用的基礎架構,就目前的實踐來看,是特別簡潔且高效的。對於中小型項目來講,是優秀的可選方案之一。而今天咱們要了解的就是 Lifecycles 組件。架構

2、Lifecyces 基礎

Lifecyces 根據官方的解釋,是一個生命可感知的組件。以下是官方關於 Lifecycels 的一張功能說明圖。ide

Lifecycels

從圖上來看,其主要包括了狀態(states)以及事件(events)兩個概念,且狀態與事件也是一一對應的。ui

不過,如今看這張圖確定是有一點懵逼的。咱們須要經過分解一下官方的 demo 來直觀感覺一下 Lifecycles 的用法。其過程以下:this

1. 實現LifecycleObserverspa

首先咱們須要實現一個 LifecycleObserver,你能夠把它等同於觀察者模式中的 Observer。在這裏,它就是事件的接受收器。而對於每個不一樣的事件,則經過在實現類的方法中添加相應的 @OnLifecycleEvent(Lifecycle.Event.xxx) 註解來實現的。具體代碼以下所示。3d

public class MyObserver implements LifecycleObserver {
    @OnLifecycleEvent(Lifecycle.Event.ON_CREATE)
    public void onCreate() {
        
    }

    @OnLifecycleEvent(Lifecycle.Event.ON_START)
    public void onStart() {
        
    }

    @OnLifecycleEvent(Lifecycle.Event.ON_RESUME)
    public void onResume() {
        
    }

    @OnLifecycleEvent(Lifecycle.Event.ON_PAUSE)
    public void onPause() {
        
    }

    @OnLifecycleEvent(Lifecycle.Event.ON_STOP)
    public void onStop() {
        
    }

    @OnLifecycleEvent(Lifecycle.Event.ON_DESTROY)
    public void onDestroy() {
        
    }
}
複製代碼

2. 實現 LifecycleOwnercode

其次就是要實現一個 LifecycleOwner,通常來講就是 Activity 或者 Fragment 來實現是比較合適的。固然,不是這 2 者中的一個,也是能夠的,只要你願意。cdn

public class MyActivity extends Activity implements LifecycleOwner {
    
    @NonNull
    @Override
    public Lifecycle getLifecycle() {
        return null;
    }
}
複製代碼

3. 向 LifecycleOwner 註冊 LifecycleObserver,創建起二者之間的鏈接server

有了接收事件的觀察者/接收者,也有了發送事件的生命週期擁有者/發送者,其不可能無緣無故的就創建起鏈接的。所以,咱們須要一個鏈接者——LifecycleRegistry。通常來講,咱們在實現了 LifecycleOwner 的 Activity 中聲明它的變量,並在 onCreate() 方法中實例化。而後再經過變量向其添加 LifecycleObserver。以下代碼所示。

public class MyActivity extends Activity implements LifecycleOwner {
    private LifecycleRegistry mLifecycleRegistry;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        mLifecycleRegistry = new LifecycleRegistry(this);
        getLifecycle().addObserver(new MyObserver());
    }
    @NonNull
    @Override
    public Lifecycle getLifecycle() {
        return mLifecycleRegistry;
    }
}
複製代碼

4. mark 狀態,"發送"事件

接下來,咱們須要在其生命週期的方法裏,mark 出生命週期的狀態以使得其能夠產生一個對應的事件發送到 LifecycleObserver 相應的方法上。以下代碼所示。

public class MyActivity extends Activity implements LifecycleOwner {
    private LifecycleRegistry mLifecycleRegistry;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        mLifecycleRegistry = new LifecycleRegistry(this);
        mLifecycleRegistry.markState(Lifecycle.State.CREATED);
    }

    @Override
    public void onStart() {
        super.onStart();
        mLifecycleRegistry.markState(Lifecycle.State.STARTED);
    }
    ......
    ......
    @NonNull
    @Override
    public Lifecycle getLifecycle() {
        return mLifecycleRegistry;
    }
}
複製代碼

經過以上 4 個步驟後,之後不再用逐個逐個在生週期裏面去調用相應的 Listener 或者 Controller 了。

3、原理簡析

Lifecycels 工做原理圖

從原理圖上看,以 LifecycleRegistry 爲中心,其擁有一個 LifecycleOwner 實例和多個 LifecycleObserver 實例。由 LifecycleOwner 經過 LifecycleRegistry 來 markState ,而後又由其來 dispatch 各個 Event 到全部 LifecycleOwner 的相應事件的方法中。

4、後記

關於 Lifecycles 組件就講這麼多,暫時也不打算涉及到其源碼的分析。

最後,感謝你能讀到並讀完此文章。受限於做者水平有限,若是存在錯誤或者疑問都歡迎留言討論。若是個人分享可以幫助到你,也請記得幫忙點個贊吧,鼓勵我繼續寫下去,謝謝。

相關文章
相關標籤/搜索