Android 官方架構元件之 Lifecycle

一隻有交流障礙的醜程式猿發表於2018-03-16

Lifecycle 是官方提供的架構元件之一,目前已經是穩定版;與它一起提供出來的元件還有ViewModel、LiveData、Room

Lifecycle 有什麼用

在日常開發中,我們經常需要封裝一些自定義的View或者元件,我們有時後需要它們的生命週期隨Activity或Fragment的生命週期發生變化,例如:我們實現了一個迴圈播放的輪播廣告圖元件Banner,在使用該元件時,我們希望Activity在onPause時,輪播也停止(這個需求可能是產品提出的,也可能是出於效能考慮),我們以前的實現方式如下:

class MyActivity extends AppCompatActivity {
    private Banner mBanner;

    public void onCreate(...) {
        ...
        mBanner = new Banner();
    }

    @Override
    public void onStart() {
        super.onStart();
        mBanner.onStart();    }

    @Override
    public void onPause() {
        super.onPause();
        mBanner.onPause();
    }
}

複製程式碼

這裡我們要在Activity的生命週期方法裡呼叫一些Banner的方法,當業務邏輯很複雜時,我們還會有一些其他元件,比如說定位等,這時Activity等生命週期方法裡就會呼叫更多的方法,這不利於我們維護。LifeCycle的出現為我們提供了一種簡單的維護方式。

Lifecycle 怎麼用

引入依賴包

  • Lifecycle已經是穩定版,它包含在support library 26.1.0及之後的依賴包中,如果我們的專案基於這些依賴包,那麼不需要額外的引用。
  • support library在26.1.0之前,需要我們引入另外的包。lifecycle是ViewModel和LiveData的基礎構件,所以一下google提供的幾個library,都包含Lifecycle
// ViewModel and LiveData
implementation "android.arch.lifecycle:extensions:1.1.0"
// alternatively, just ViewModel
implementation "android.arch.lifecycle:viewmodel:1.1.0"
// alternatively, just LiveData
implementation "android.arch.lifecycle:livedata:1.1.0"

annotationProcessor "android.arch.lifecycle:compiler:1.1.0"

複製程式碼

使用

  1. 如果我們Activity不是繼承自support library在26.1.0和之後包中的AppCompatActivity,責需要我們的Activity實現LifecycleOwner介面,已經繼承可以忽略
public class MainActivity extends Activity implements LifecycleOwner{
    private LifecycleRegistry mLifecycleRegistry;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

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

複製程式碼
  1. 將我們的元件實現LifecycleObserver介面,並註冊
public class MainActivity extends AppCompatActivity{

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);


        Banner banner = new Banner();
        getLifecycle().addObserver(banner);

    }

   
}

class Banner implements LifecycleObserver {

    @OnLifecycleEvent(Lifecycle.Event.ON_START)
    public void test(){
        Log.e("banner","start");
    }
}
複製程式碼

附錄

  • 我們可以監聽Activity(Fragment)生命週期的事件(Event)或者得到當前的狀態(State),監聽事件上面已經演示過了( @OnLifecycleEvent(Lifecycle.Event.ON_START)),以下是獲取當前狀態:
if (lifecycle.getCurrentState().isAtLeast(STARTED)) {
            // connect if not connected
        }
複製程式碼
  • 所有的事件和狀態如圖:
    Android 官方架構元件之 Lifecycle

參考資料

官方文件

相關文章