Android Jetpack架構組件 — Lifecycle入坑指南

本文首發於微信公衆號「Android開發之旅」,歡迎關注 ,獲取更多技術乾貨java

背景介紹

上一篇文章咱們主要是介紹了Jetpack的由來以及四大組件各包含的組件庫。本篇文章咱們未來學習架構組件中的Lifecycle組件。Lifecycle組件是幫忙咱們管理Activity和Fragment的生命週期,也就是說,當Activity或者Fragment的生命週期發送變化的時候咱們能夠獲得通知。咱們一般會在生命週期方法中調用各類方法或者初始化一些組件亦或是在某個生命週期中調用一些回調,這就致使生命週期相關方法代碼比較臃腫,且耦合性高,不易維護。react

我來來看下官方文檔給出的回調例子:android

class MyLocationListener {
    public MyLocationListener(Context context, Callback callback) {
        // ...
    }

    void start() {
        // connect to system location service
    }

    void stop() {
        // disconnect from system location service
    }
}

class MyActivity extends AppCompatActivity {
    private MyLocationListener myLocationListener;

    @Override
    public void onCreate(...) {
        myLocationListener = new MyLocationListener(this, (location) -> {
            // update UI
        });
    }

    @Override
    public void onStart() {
        super.onStart();
        myLocationListener.start();
        // manage other components that need to respond
        // to the activity lifecycle
    }

    @Override
    public void onStop() {
        super.onStop();
        myLocationListener.stop();
        // manage other components that need to respond
        // to the activity lifecycle
    }
}
複製代碼

這些代碼看起來還不錯甚至是咱們日常也是這麼作的,可是我在響應生命週期的當前狀態而進行過多的調用了管理UI和其餘組件,這樣會在生命週期的方法中書寫大量代碼,例如onStart()和onStop(),這樣就會使代碼難以維護。bash

基於以上種種緣由,Lifecycle正式登場了。微信

Lifecycle介紹

Lifecycle管理生命週期也是觀察者模式,其中主要涉及到如下幾個類:LifecycleObserver、LifecycleOwner、Lifecycle、State、Event。架構

  • LifecycleObserver:Lifecycle觀察者。咱們須要自定義類實現LifecycleObserver,經過註解的方式可觀察生命週期方法。
  • LifecycleOwner:Lifecycle持有者。讓Activity或者fragment實現該接口,當生命週期改變是事件會被LifecycleObserver接收到。
  • Lifecycle:生命週期抽象類。持有添加和移除監聽方法。定義State和Event枚舉。
  • LifecycleRegistry:Lifecycle的實現類。
  • State:當前生命週期所處狀態。Lifecycle 將 Activity 的生命週期函數對應成 State .
  • Event:當前生命週期變化所對應的事件。State 變化觸發 Event 事件,事件會被註冊的觀察者LifecycleObserver 接收處理。

Event枚舉:ide

public enum Event {
        ON_CREATE,
        ON_START,
        ON_RESUME,
        ON_PAUSE,
        ON_STOP,
        ON_DESTROY,
        ON_ANY
    }
複製代碼

State枚舉:函數

public enum State {
        DESTROYED,
        INITIALIZED,
        CREATED,
        STARTED,
        RESUMED;
        public boolean isAtLeast(@NonNull State state) {
            return compareTo(state) >= 0;
        }
    }
複製代碼

State和Event的對應關係:post

Lifecycle使用

如何項目已經遷移到AndroidX了,那麼就不須要額外導包,由於AndroidX已經包含了Jetpack相關組件了​。若是沒有遷移,則在build.gradle中配置以下​:學習

dependencies {
​    def lifecycle_version = "1.1.1"
​
    // ViewModel and LiveData
    implementation "android.arch.lifecycle:extensions:$lifecycle_version"
    // alternatively - just ViewModel // For Kotlin use viewmodel-ktx
    implementation "android.arch.lifecycle:viewmodel:$lifecycle_version" 
    // alternatively - just LiveData
    implementation "android.arch.lifecycle:livedata:$lifecycle_version"
    // alternatively - Lifecycles only (no ViewModel or LiveData).
    // Support library depends on this lightweight import
    implementation "android.arch.lifecycle:runtime:$lifecycle_version"
    // For Kotlin use kapt instead of annotationProcessor
    annotationProcessor "android.arch.lifecycle:compiler:$lifecycle_version" 
    // alternately - if using Java8, use the following instead of compiler
    implementation "android.arch.lifecycle:common-java8:$lifecycle_version"
    // optional - ReactiveStreams support for LiveData
    implementation "android.arch.lifecycle:reactivestreams:$lifecycle_version"
    // optional - Test helpers for LiveData
    testImplementation "android.arch.core:core-testing:$lifecycle_version"
複製代碼

​配置完成後咱們先定義一個類實現LifecycleObserver:

class MyObserver : LifecycleObserver {

    @OnLifecycleEvent(Lifecycle.Event.ON_RESUME)
    fun connectListener() {
        Log.e("MyObserver","==ON_RESUME==")
    }

    @OnLifecycleEvent(Lifecycle.Event.ON_PAUSE)
    fun disconnectListener() {
        Log.e("MyObserver","==ON_PAUSE==")

    }
}
複製代碼

接受事件是經過註解OnLifecycleEvent來完成的,參數即爲上文中的Event枚舉。

接下來咱們在Activity中添加這個觀察者:

class MainActivity : AppCompatActivity() {

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

    }
}
複製代碼

這就是最簡單的使用,這個時候咱們其實已經能夠監聽到Activity的生命週期變化了。

com.jetpack.jetpackdemo E/MyObserver: ==ON_RESUME==
com.jetpack.jetpackdemo E/MyObserver: ==ON_PAUSE==
複製代碼

這樣使用,會不會有個疑問呢?咱們在Observer中註冊了Event事件,可是在Activity的生命週期方法中並無指定State狀態。這是如何作到關聯的呢?在Android Support Library 26.1.0 及其以後的版本,Activity和Fragment已經默認實現了LifecycleOwner接口,因此不須要咱們在從新設置。

自定義Lifecycle

當咱們有些類沒有實現AppCompatActivity的時候咱們也想使用Lifecycle,那麼就須要自定義了,也就是須要咱們本身實現 LifecycleOwner接口。MyObserver類不變,MainActivity類改變以下:

class MainActivity : Activity(), LifecycleOwner {

    private lateinit var lifecycleRegistry: LifecycleRegistry

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

        lifecycleRegistry = LifecycleRegistry(this)
        lifecycle.addObserver(MyObserver())

    }

    override fun onResume() {
        super.onResume()
        lifecycleRegistry.currentState = Lifecycle.State.RESUMED
    }

    override fun onPause() {
        super.onPause()
        lifecycleRegistry.currentState = Lifecycle.State.DESTROYED
    }

    override fun getLifecycle(): Lifecycle {
        return lifecycleRegistry
    }
}
複製代碼

這樣就是全部的設置必須由咱們本身來完成。打印結果仍是同樣的,以下:

com.jetpack.jetpackdemo E/MyObserver: ==ON_RESUME==
com.jetpack.jetpackdemo E/MyObserver: ==ON_PAUSE==
複製代碼

總結

本文主要是介紹了Lifecycle相關的API以及簡單的使用。在實際項目中仍是要結合ViewModel和LiveData來使用。經過ViewModel來獲取所需數據,並經過觀察LiveData對象將數據變化反映到視圖中。後續文章咱們將繼續介紹ViewModel和LiveData的使用。

推薦閱讀

還不知道Android Jetpack是什麼?你就out了

掃描下方二維碼關注公衆號,獲取更多技術乾貨。

相關文章
相關標籤/搜索