本文首發於微信公衆號「後廠村碼農」html
在上一篇文章中,咱們基本瞭解了什麼是Android Jetpack,這一篇文章來介紹Android Jetpack架構組件的Lifecycle,Lifecycle用於幫助開發者管理Activity和Fragment 的生命週期,因爲Lifecycle是LiveData和ViewModel的基礎,因此須要先學習它。前端
在應用開發中,處理Activity或者Fragment組件的生命週期相關代碼是必不可免的, 官方文檔中舉了一個例子,這裏簡化一下,在Activity中寫一個監聽,在Activity的不一樣生命週期方法中調用這個監聽。java
public class MainActivity extends AppCompatActivity {
private MyListener myListener;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
myListener = new MyListener(MainActivity.this);
}
@Override
protected void onStart() {
super.onStart();
myListener.start();
}
@Override
protected void onStop() {
super.onStop();
myListener.stop();
}
}
class MyListener {
public MyListener(Context context) {
...
}
void start() {
...
}
void stop() {
...
}
}
複製代碼
再舉個MVP中常見的狀況,以下所示。react
public class MainActivity extends AppCompatActivity {
private MyPresenter myPresenter;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
myPresenter = new MyPresenter();
}
@Override
protected void onResume() {
super.onResume();
myPresenter.onResume();
}
@Override
protected void onPause() {
super.onPause();
myPresenter.onPause();
}
}
class MyPresenter{
void onResume() {
...
}
void onPause() {
...
}
}
複製代碼
這兩個例子的寫法已經很廣泛了,實現起來也不難,但實際開發中,可能會有多個組件在Activity的生命週期中進行回調,這樣Activity的生命週期的方法中可能就須要放大量的代碼,這就使得它們難以維護。 還有一個問題是,若是咱們在組件中作了耗時操做(好比在onStart方法),這種寫法就沒法保證組件在Activity或者Fragment中止以前完成啓動。 所以咱們須要一個能管理Activity和Fragment的生命週期的庫,這個庫就是Lifecycle。android
分別來介紹下依賴Lifecycle庫和Lifecycle基本用法。程序員
官網給出的依賴代碼以下所示:微信
dependencies {
def lifecycle_version = "2.0.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"
}
複製代碼
官網用的是AndroidX,由於使用AndroidX,可能會產生一些遷移的問題,這裏的舉例就不使用AndroidX,而是使用lifecycleandroid.arch.lifecycle庫,以下所示。架構
dependencies {
def lifecycle_version = "1.1.1"
// 包含ViewModel和LiveData
implementation "android.arch.lifecycle:extensions:$lifecycle_version"
// 僅僅包含ViewModel
implementation "android.arch.lifecycle:viewmodel:$lifecycle_version" // For Kotlin use viewmodel-ktx
// 僅僅包含LiveData
implementation "android.arch.lifecycle:livedata:$lifecycle_version"
// 僅僅包含Lifecycles
implementation "android.arch.lifecycle:runtime:$lifecycle_version"
annotationProcessor "android.arch.lifecycle:compiler:$lifecycle_version" // For Kotlin use kapt instead of annotationProcessor
// 若是用Java8, 用於替代compiler
implementation "android.arch.lifecycle:common-java8:$lifecycle_version"
// 可選,ReactiveStreams對LiveData的支持
implementation "android.arch.lifecycle:reactivestreams:$lifecycle_version"
// 可選,LiveData的測試
testImplementation "android.arch.core:core-testing:$lifecycle_version"
}
複製代碼
實際上咱們不須要所有把這些代碼全寫進build.gralde進去(固然全寫進去也不會有什麼錯),由於Gradle默認是支持依賴傳遞的,不知道什麼是依賴傳遞的看Android Gradle (二)簽名配置和依賴管理這篇文章。 咱們直接添加以下依賴就能夠知足平常的工做,若是缺乏哪一個庫,再去單獨添加就行了。app
implementation "android.arch.lifecycle:extensions:1.1.1"
複製代碼
添加這一句代碼就依賴了以下的庫。 ide
先不談Activity和Fragment中如何使用,先舉一個Lifecycle的簡單例子。
public class MyObserver implements LifecycleObserver {
@OnLifecycleEvent(Lifecycle.Event.ON_RESUME)
public void connectListener() {
...
}
@OnLifecycleEvent(Lifecycle.Event.ON_PAUSE)
public void disconnectListener() {
...
}
}
myLifecycleOwner.getLifecycle().addObserver(new MyObserver());//1
複製代碼
新建一個MyObserver類,它實現了LifecycleObserver接口,說明MyObserver成爲了一個Lifecycle的觀察者。 而後在註釋1處將MyObserver添加到LifecycleOwner中。LifecycleOwner是一個接口,其內部只有一個方法getLifecycle(),getLifecycle方法用於獲取Lifecycle,這樣就能夠將MyObserver添加到Lifecycle中,當Lifecycle的生命週期發生變化時,MyObserver就會觀察到,或者說是感知到。
若是使用是Java8 ,那麼可使用DefaultLifecycleObserver來替代LifecycleObserver:
class MyObserver implements DefaultLifecycleObserver {
@Override
public void onCreate(LifecycleOwner owner) {
...
}
}
複製代碼
除此以外,不要忘了在build.gradle添加 "androidx.lifecycle:common-java8:<version>"
應用舉例準備兩個示例,一個是在Activity中使用,一個是在第一小節的MVP例子上進行改進。
package com.example.lifecycledemo1;
import android.arch.lifecycle.Lifecycle;
import android.arch.lifecycle.LifecycleObserver;
import android.arch.lifecycle.OnLifecycleEvent;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;
public class MainActivity extends AppCompatActivity {
private static final String TAG = "MainActivity";
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
getLifecycle().addObserver(new MyObserver());//1
}
public class MyObserver implements LifecycleObserver{
@OnLifecycleEvent(Lifecycle.Event.ON_RESUME)
void onResume(){
Log.d(TAG, "Lifecycle call onResume");
}
@OnLifecycleEvent(Lifecycle.Event.ON_PAUSE)
void onPause(){
Log.d(TAG, "Lifecycle call onPause");
}
}
@Override
protected void onResume() {
super.onResume();
Log.d(TAG, "onResume");
}
@Override
protected void onPause() {
super.onPause();
Log.d(TAG, "onPause");
}
}
複製代碼
先實現MyObserver,對ON_CREATE和ON_RESUME事件進行監聽。由於在Android Support Library 26.1.0 及其以後的版本,Activity和Fragment已經默認實現了LifecycleOwner接口,因此在註釋1處能夠直接使用getLifecycle方法獲取Lifecycle對象,這樣MyObserver就能夠觀察MainActivity的生命週期變化了,LifecycleOwner能夠理解爲被觀察者,MainActivity默認實現了LifecycleOwner接口,也就是說MainActivity是被觀察者。 運行程序,打印的log以下所示。
D/MainActivity: onResume
D/MainActivity: Lifecycle call onResume
D/MainActivity: Lifecycle call onPause
D/MainActivity: onPause
複製代碼
只要在MainActivity的onCreate方法中添加MyObserver,那麼MyObserver就能夠觀察到MainActivity的各個生命週期的變化。
改寫第一小節MVP的例子,先實現MyPresenter,以下所示。
public class MyPresenter implements IPresenter {
private static final String TAG = "test";
@Override
public void onResume() {
Log.d(TAG, "Lifecycle call onResume");
}
@Override
public void onPause() {
Log.d(TAG, "Lifecycle call onPause");
}
}
interface IPresenter extends LifecycleObserver {
@OnLifecycleEvent(Lifecycle.Event.ON_RESUME)
void onResume();
@OnLifecycleEvent(Lifecycle.Event.ON_PAUSE)
void onPause();
}
複製代碼
IPresenter接口繼承自LifecycleObserver接口,MyPresenter又實現了IPresenter接口,這樣MyPresenter成爲了一個觀察者。 接在在MainActivity中加入MyPresenter:
public class MainActivity extends AppCompatActivity {
private static final String TAG = "test";
private IPresenter mPresenter;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mPresenter = new MyPresenter();
getLifecycle().addObserver(mPresenter);
}
@Override
protected void onResume() {
super.onResume();
Log.d(TAG, "onResume");
}
@Override
protected void onPause() {
super.onPause();
Log.d(TAG, "onPause");
}
}
複製代碼
MainActivity成爲了被觀察者,當它的生命週期發生變化時,MyPresenter就能夠觀察到,這樣就不須要在MainActivity的多個生命週期方法中調用MyPresenter的方法了。 打印的日誌以下:
D/test: onResume
D/test: Lifecycle call onResume
D/test: Lifecycle call onPause
D/test: onPause
複製代碼
若是想實現自定義LifecycleOwner,可使用LifecycleRegistry,它是Lifecycle的實現類。Android Support Library 26.1.0及其以後的版本,Activity和Fragment已經默認實現了LifecycleOwner接口,所以咱們能夠這麼寫:
import android.arch.lifecycle.Lifecycle;
import android.arch.lifecycle.LifecycleRegistry;
import android.support.annotation.NonNull;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
public class MyActivity extends AppCompatActivity {
private LifecycleRegistry lifecycleRegistry;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
lifecycleRegistry = new LifecycleRegistry(this);
lifecycleRegistry.markState(Lifecycle.State.CREATED);
}
@Override
public void onStart() {
super.onStart();
lifecycleRegistry.markState(Lifecycle.State.STARTED);
}
@NonNull
@Override
public Lifecycle getLifecycle() {
return lifecycleRegistry;
}
}
複製代碼
經過新建LifecycleRegistry,爲LifecycleRegistry設置Lifecycle的各類狀態,並經過getLifecycle方法返回該LifecycleRegistry。
這一篇介紹了Lifecycle的基本用法,並經過兩個小例子來幫助你們消化理解,具體在項目中的使用也不難,惟一還算難點的是Lifecycle的原理,下一篇咱們就來學習Lifecycle的原理。
更多的內容請關注個人原創知識體系:
liuwangshu.cn/system/
這裏不只分享大前端、Android、Java等技術,還有程序員成長類文章。