Android 官方架構組件之 Lifecycle

Lifecycle 是官方提供的架構組件之一,目前已是穩定版;與它一塊兒提供出來的組件還有ViewModel、LiveData、Roomhtml

Lifecycle 有什麼用

在平常開發中,咱們常常須要封裝一些自定義的View或者組件,咱們有時後須要它們的生命週期隨Activity或Fragment的生命週期發生變化,例如:咱們實現了一個循環播放的輪播廣告圖組件Banner,在使用該組件時,咱們但願Activity在onPause時,輪播也中止(這個需求多是產品提出的,也多是出於性能考慮),咱們之前的實現方式以下:android

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的出現爲咱們提供了一種簡單的維護方式。bash

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
        }
複製代碼
  • 全部的事件和狀態如圖:

參考資料

官方文檔

相關文章
相關標籤/搜索