Lifecycles組件使用與源碼分析

    參考:https://developer.android.google.cn/topic/libraries/architecture/lifecycle

    Lifecycles組件是Jetpack組件中的一個,它是Jetpack其他組件的基礎之一,所以學習它是深入理解其他組件的基礎。

    Lifecycles組件是生命週期感知型組件,它可執行操作來響應另一個組件(如 Activity 和 Fragment)的生命週期狀態的變化。

    舉個例子,我想在Activity的的onPause()被調用的次數。一般的做法都是定義一個變量,然後重寫onPause()方法,然後在裏面進行+1操作,這麼在這個例子中是沒問題的,看起來也不錯。但是想一想,如果業務複雜,我不只是想進行+1這一行操作,我的操作可能有十幾行代碼呢,你可能會想定義一個方法把代碼放到方法體裏,再在onPause()調用該方法就好了。但是如果我也想記錄別的Activity的onPause()被調用的次數呢,難道要把這個方法複製一份到別的Activity中嗎?這就不優雅了

   我們的解決辦法就是定義一個Counter計數器的類,在該類中感知到Activity的onPause()方法,在感知的方法中,Activity的onPause()調用時,感知方法也會被調用,因此可以在感知方法中進行+1操作,這樣就封裝成了一個可感知Activity的onPause()方法的Counter計數器類,哪個Activity想用的話就new一個Counter類。

Lifecycles組件簡單demo(kotlin代碼)

    首先定義Counter類:

class Counter : LifecycleObserver {
    private var num = 0

    @OnLifecycleEvent(Lifecycle.Event.ON_PAUSE)
    fun counterPause(){
        num++
    }

}

    Counter類需要實現 LifecycleObserver接口,實現這個接口就代表Counter被標記爲LifecycleObserver了。感知方法就是counterPause()方法,通過註解OnLifecycleEvent標註該方法能感知LifecycleOwner的lifecycle,在這裏也就是感知Activity的onPause()方法。

    然後在Activity中使用即可:

class MainActivity : AppCompatActivity() {
    private val counter = Counter()

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)

        lifecycle.addObserver(counter) //將counter添加入當前Activity的LifeCycle中

    }
}

Lifecycles組件學習

Lifecycles組件的流程如下:

    流程非常簡單,通俗來講就是被觀察者通過某個途徑向觀察者提供生命週期變動信息,觀察者得到信息後自行處理而已。 上面Demo是觀察者這邊的示例,所以我們先從這邊開始一步步分析源碼(不熟悉觀察者模式的可以先了解下該模式)。

LifecycleObserver與Lifecycle

    看完簡單使用後,進行進一步學習,首先從Counter類開始瞭解,該類實現了LifecycleObserver接口,那麼該接口是什麼呢,點進去看到發現是個空接口:

    從註釋中看出它的作用就是把實現類標記爲一個LifecycleObserver,也就是說它是個觀察者,那麼被觀察者是是誰?是LifecycleOwner,LifecycleOwner持有Lifecycle類實例,這兩個概念之後再瞭解,繼續看Counter類,明顯看到counterPause()方法被註解標記了才能感知到生命週期,那麼看下該註解:

@SuppressWarnings("unused")
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.METHOD)
public @interface OnLifecycleEvent {
    Lifecycle.Event value();
}

    明顯它的參數是Lifecycle.Event對象,那學習下Lifecycle.Event:

 public enum Event {
        //對應LifecycleOwner的onCreate事件
        ON_CREATE,
        //對應LifecycleOwner的onStart事件
        ON_START,
        //對應LifecycleOwner的onResume事件
        ON_RESUME,
        //對應LifecycleOwner的onPause事件
        ON_PAUSE,
        //對應LifecycleOwner的onStop事件
        ON_STOP,
        //對應LifecycleOwner的onDestroy事件
        ON_DESTROY,
        //對應LifecycleOwner的任意事件
        ON_ANY
    }

    它是個枚舉,這個枚舉定義在Lifecycle類中,枚舉的值分別對應LifecycleOwner的相應事件。既然Event是定義在Lifecycle中,那不妨看下Lifecycle這個類,這個類用於存儲有關組件(如 Activity 或 Fragment)的生命週期狀態的信息,並允許其他對象觀察此狀態。它使用兩種主要枚舉(Event和State)跟蹤其關聯組件(Activity、Fragment)的生命週期狀態,先看下State枚舉信息:

public enum State {

        DESTROYED,

        INITIALIZED,

        CREATED,

        STARTED,

        RESUMED;

        public boolean isAtLeast(@NonNull State state) {
            return compareTo(state) >= 0;
        }
    }

    它表示的是LifecycleOwner的狀態,具體字段值對應LifecycleOwner的什麼狀態請自行查看源碼。看下Lifecycle類概覽,會發現它很簡單,就兩個主要的枚舉類+幾個方法

   剛說了Lifecycle使用兩種主要枚舉(Event和State)跟蹤其關聯組件(Activity、Fragment)的生命週期狀態,那麼組件狀態(State)和組件事件(Event)的關係是什麼呢,請看官方的生命週期的狀態和事件圖:

    圖中的箭頭上的ON_CREATE等Event可以理解爲Activity調用了onCreate()方法前後的LifecycleOwner(Activity持有)狀態,第一個箭頭(ON_CREATE)表示Activity在onCreate()前State狀態是INITIALIZED,onCreate()後是CREATED狀態。

    到這裏我們瞭解完了觀察者這一方,接下來要學習被觀察者LifecycleOwner這一方了。

 

LifecycleOwner

  看下lifecycleOwner這個類:

/**
 * 這個類擁有Android生命週期,這些生命週期事件能被自定義組件用來處理生命週期變動而不用在
 * Activity或者Fragment中實現任何代碼
 */
@SuppressWarnings({"WeakerAccess", "unused"})
public interface LifecycleOwner {

    @NonNull
    Lifecycle getLifecycle();

}

    LifecycleOwner 是單一方法接口,表示類具有 Lifecycle。它具有一種方法(即 getLifecycle()),該方法必須由類實現。如果您嘗試管理整個應用進程的生命週期,請參閱 ProcessLifecycleOwner。此接口從各個類(如 Fragment 和 AppCompatActivity)抽象化 Lifecycle 的所有權,並允許編寫與這些類搭配使用的組件。任何自定義應用類均可實現 LifecycleOwner 接口。實現 LifecycleObserver 的組件可與實現 LifecycleOwner 的組件無縫協同工作,因爲所有者可以提供生命週期,而觀察者可以註冊以觀察生命週期。這段爲官方原話解釋。

自定義LifecycleOwner 

  看一個官方自定義Demo,便於理解LifecycleOwner 設置狀態的流程,實際上AppCompatActivity的大體流程與下面例子是一樣的,只是封裝的複雜些

    class MyActivity : Activity(), LifecycleOwner {

        private lateinit var lifecycleRegistry: LifecycleRegistry

        override fun onCreate(savedInstanceState: Bundle?) {
            super.onCreate(savedInstanceState)

            lifecycleRegistry = LifecycleRegistry(this)
            lifecycleRegistry.markState(Lifecycle.State.CREATED)
        }

        public override fun onStart() {
            super.onStart()
            lifecycleRegistry.markState(Lifecycle.State.STARTED)
        }

        override fun getLifecycle(): Lifecycle {
            return lifecycleRegistry
        }
    }
    

    自定義一個LifecycleOwner組件很簡單,分三步:

    第一步:實現LifecycleOwner接口,重寫getLifecycle()方法

    第二步:定義一個LifecycleRegistry變量,這個類是Lifecycle類的實現類

    第三步:在組件(Activity)生命週期中通過lifecycleRegistry對象markState()方法設置當前組件狀態

    注:markState()方法在最新版本已經被廢棄,可用setCurrentState()方法替換

    重點在於LifecycleRegistry這個類,它實現了Lifecycle這個抽象類,可以用來處理多個LifecycleObserver觀察者,主要是用來對生命週期狀態的管控和通知Observer當前組件的狀態。LifecycleRegistry通過setCurrentState()和handleLifecycleEvent()這兩個方法通知LifecycleObserver生命週期狀態發生了變動。

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章