Android Jetpack架構組件之Lifecycle入門

態度決定一切 細節決定成敗

一、前言

——回顧了一下之前學習過的東西並打算把這些東西整理成文章,加深映像和理解,同時也傳達自己的見解供大家參考,若存在錯誤或不足的地方,希望您能指出。
本篇主要介紹Lifecycle,根據下面結構圖進行分析。
本篇結構圖
LifeCycle相關鏈接——官方文檔接口文檔相關依賴文檔

二、簡介

(1)是什麼

—— Lifecycle 是具有生命週期感知能力的組件。簡單的理解當Activity/Fragment的生命週期產生變化時,lifeCycle組件也會有相應的生命週期變化。我們可以通過使用lifeCycle組件在自定義的類中管理Activity/fragment的生命週期。
主要由三大部分構成:Lifecycle、LifecycleOwner、LifecycleObserver

  • Lifecycle:是一個持有組件生命週期狀態與事件(如Activity或Fragment)的信息的類
  • LifecycleOwner:Lifecycle的提供者,通過實現LifecycleOwner接口來訪問Lifecycle(生命週期)對象。Fragment和FragmentActivity類實現了LifecycleOwner接口,它具有訪問生命週期的getLifecycle方法。您還可以在自己的類中實現LifecycleOwner。
  • LifecycleObserver:Lifecycle觀察者,實現該接口的類,通過註解的方式,可以通過被LifecycleOwner類的addObserver(LifecycleObserver o)方法註冊,被註冊後,LifecycleObserver便可以觀察到LifecycleOwner的生命週期事件。

(2)有什麼用

—— 常見的模式是在Activity和Fragment的生命週期方法中實現依賴組件的操作(取消註冊/監聽,釋放內存…),如果不這樣做可能會觸發內存泄漏甚至應用程序崩潰。然而,這種模式會導致糟糕的代碼組織和錯誤的擴散,。通過使用生命週期感知組件,您可以將依賴組件的代碼移出生命週期方法,並移到組件本身

這裏舉個官方文檔的例子說明一下,也更容易理解
常見的模式

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
    }
}

實際的運用中,Activity的onStart()和onStop()方法中會有很多的調用來管理UI和其他組件,以響應生命週期的當前狀態。管理多個組件會在生命週期方法中放置大量的代碼,這使得它們很難維護。

Lifecycle模式

public class MyLocationListener implements LifecycleObserver {
    private static final String TAG = "MyLocationListener ";
    public MyLocationListener(Context context, Callback callback) { /*...*/ }
    @OnLifecycleEvent(Lifecycle.Event.ON_START)
    public void start(){
        Log.e(TAG, "start: " );
    }
    @OnLifecycleEvent(Lifecycle.Event.ON_STOP)
    public void stop(){
        Log.e(TAG, "stop: " );
    }
}
//Activity/Fragment中使用
@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    MyLocationListener myLocationListener = new MyLocationListener(this, (location) -> { /* update UI */ });
    getLifecycle().addObserver(myLocationListener );
}

通過Lifecycle組件可以在各自的類中通過註釋響應生命週期的當前狀態。

(3)有什麼優點

1.結構更加清晰,更容易管理生命週期
2.降低維護難度
3.降低耦合度

就是如此簡單而又好用,那麼具體如何使用請看下文分解。在這裏插入圖片描述

三、基本使用

(4)怎麼使用

  • 添加依賴

implementation 'androidx.appcompat:appcompat:1.1.0’

// 可選
dependencies {
    def lifecycle_version = "2.1.0"
    // ViewModel and LiveData
    implementation "androidx.lifecycle:lifecycle-extensions:$lifecycle_version"
    // alternatively - just ViewModel
    implementation "androidx.lifecycle:lifecycle-viewmodel:$lifecycle_version" // For Kotlin use lifecycle-viewmodel-ktx
    // alternatively - just LiveData
    implementation "androidx.lifecycle:lifecycle-livedata:$lifecycle_version"
    // alternatively - Lifecycles only (no ViewModel or LiveData). Some UI
    //     AndroidX libraries use this lightweight import for Lifecycle
    implementation "androidx.lifecycle:lifecycle-runtime:$lifecycle_version"

    annotationProcessor "androidx.lifecycle:lifecycle-compiler:$lifecycle_version" // For Kotlin use kapt instead of annotationProcessor
    // alternately - if using Java8, use the following instead of lifecycle-compiler
    implementation "androidx.lifecycle:lifecycle-common-java8:$lifecycle_version"

    // optional - ReactiveStreams support for LiveData
    implementation "androidx.lifecycle:lifecycle-reactivestreams:$lifecycle_version" // For Kotlin use lifecycle-reactivestreams-ktx

    // optional - Test helpers for LiveData
    testImplementation "androidx.arch.core:core-testing:$lifecycle_version"
}
  • 定義觀察者
// 定義一個類實現LifecycleObserver接口,通過向其方法添加註釋來監視組件的生命週期狀態
public class MyObserver implements LifecycleObserver {
    private static final String TAG = "MyObserver";
    @OnLifecycleEvent(Lifecycle.Event.ON_START)
    public void start(){
        Log.e(TAG, "start: " );
    }
    @OnLifecycleEvent(Lifecycle.Event.ON_STOP)
    public void stop(){
        Log.e(TAG, "stop: " );
    }
}
  • 添加觀察者
//通過調用生命週期類的addObserver()方法並傳遞觀察者的實例來添加觀察者。
@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    MyObserver myObserver = new MyObserver();
    getLifecycle().addObserver(myObserver);
}

這裏提供入門級使用方式,下面舉個例子

  • 案例
    ——廣播的註冊與取消註冊處理

1.定義廣播接收者

public class MyBroadcastReceiver extends BroadcastReceiver {
    @Override
    public void onReceive(Context context, Intent intent) {
        Log.e("onReceive: action ",intent.getAction());
        Log.e("onReceive: content ",intent.getStringExtra("content"));
    }
}

2.定義lifecycle觀察者

class BroadCastObserver implements LifecycleObserver {
    private static final String TAG = "BroadCastObserver";
    private Activity mActivity;
    private MyBroadcastReceiver mBroadcastReceiver;
    public BroadCastObserver(Activity activity) {
        this.mActivity = activity;
    }
    @OnLifecycleEvent(Lifecycle.Event.ON_START)
    public void register(){
        Log.e(TAG, "register: " );
        mBroadcastReceiver = new MyBroadcastReceiver();
        IntentFilter intentFilter = new IntentFilter();
        intentFilter.addAction("xxx");
        mActivity.registerReceiver(mBroadcastReceiver, intentFilter);
    }
    @OnLifecycleEvent(Lifecycle.Event.ON_DESTROY)
    public void unRegister(){
        Log.e(TAG, "unRegister: " );
        mActivity.unregisterReceiver(mBroadcastReceiver);
    }
}

3.添加觀察者

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        BroadCastObserver mBroadCastObserver = new BroadCastObserver(this);
        getLifecycle().addObserver(mBroadCastObserver);
    }

4.發送廣播

    public void onClick(View v) {
        Intent intent = new Intent();
        intent.setAction("xxx");
        intent.putExtra("content", "廣播1號");
        sendBroadcast(intent);
    }

輸出結果
好了,使用方式就簡單介紹到這裏。大家有空也可以自己試試Service

四、原理

本來想寫成一篇的,結果發現分析的源碼有點多,只好拆開來。避免篇幅太長,看着累。。。
《Android Jetpack架構組件之Lifecycle源碼分析》
在這裏插入圖片描述

五、總結

也不知道要寫什麼。就簡單描述一下使用過程,lifecycle使用了觀察者模式。
1.先聲明瞭一個觀察者,用來監聽被觀察者(Activity/Fragment)。
2.觀察者通過實現LifecycleObserver接口,使用註解來監聽被觀察者發生的變化。
3.那麼是如何監聽的,這次就使用到了lifecycle。lifecycle相當於一個橋樑,把兩者關聯在一起。
4.被觀察者通過實現LifecycleOwner接口先連接了橋樑。
5.觀察者則通過getLifecycle().addObserver()方法也建立起連接。
通俗描述大概就是這麼一回事,具體的實現方式還是要根據源碼來分析。事實並沒想的這麼簡單,源碼也是挺多。

六、內容推薦

七、項目參考

Demo例子鑲嵌到下面Demo中
Github —— apk下載體驗地址

若您發現文章中存在錯誤或不足的地方,希望您能指出!

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