天天看點

Android Lifecycles 生命周期感覺前言例子Lifecycle

前言

為什麼要讓元件感覺生命周期?

Android中大多數應用程式元件都附帶有生命周期。 生命周期由作業系統或你使用的架構管理。 生命周期是Android核心而基礎的東西,如果不按照生命周期寫代碼,可能會觸發記憶體洩漏甚至是應用程式崩潰。

而在

Api26.1.0

之前,自定義UI控件或其他的元件的生命周期都是由我們手動管理的。如果我們讓這些元件和Activity/Fragment 一樣具有生命周期。那麼我們将不用在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();
        // 管理其他依賴生命周期的元件 ...
    }

    @Override
    public void onStop() {
        super.onStop();
        myLocationListener.stop();
        // 管理其他依賴生命周期的元件 ...
    }
}
           

這樣寫沒毛病。但是如果有很多元件,Activity中會有大量維護生命周期的代碼。使代碼難以維護。

而使用

Lifecycle

後,代碼是這樣子的:

class MyLocationListener implements LifecycleObserver {

    public MyLocationListener(Context context, Lifecycle lifecycle, Callback callback) {
       ...
    }

    @OnLifecycleEvent(Lifecycle.Event.ON_START)
    void start() {
        // connect to system location service
    }

    @OnLifecycleEvent(Lifecycle.Event.ON_STOP)
    void stop() {
        // disconnect if connected
    }
}

class MyActivity extends AppCompatActivity {
    private MyLocationListener myLocationListener;

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

Activity裡将不再處理mLocationListener的生命周期,mLocationListener的生命周期将由Lifecycle來管理。現在我們隻需要在

onCreate()

時把需要感覺生命周期的元件添加到Lifecycle中,Lifecycle将根據注解在Activity生命周期改變時自行回調我們對應的方法。

Lifecycle

Lifecycle

是一個持有元件生命周期狀态(如Activity/Fragment)的類,并允許其他對象觀察此狀态。

Lifecycle

主要使用兩個枚舉來跟蹤其關聯元件的生命周期狀态:

  • Event

    Lifecycle.Event

    事件 從

    framework

    Lifecycle

    分發。這些事件和

    Activity/Fragment

    中的生命周期對應。
  • State

    根據

    Lifecycle

    對象來擷取目前狀态
    Android Lifecycles 生命周期感覺前言例子Lifecycle

在上面的例子中,我們寫的

MyLocationListener

實作了

LifecycleObserver

接口,并且使用了

@OnLifecycleEvent

注解。在

Activity

裡面我們把

myLocationListener

添加到了 觀察者清單。

  • LifecycleObserver 接口

    這是一個空接口,就标記一下這個類是具有生命周期意識的。

  • OnLifecycleEvent注解

    @OnLifecycleEvent(Lifecycle.Event.ON_START)

    @OnLifecycleEvent(Lifecycle.Event.ON_STOP)

    注解參數為

    Lifecycle.Event

    枚舉,這些枚舉和

    Activity/Fragment

    生命周期對應。被注解的方法将在對應生命周期被回調。
  • Activity 添加生命周期觀察

    Api26.1.0

    起,

    SupportActivity

    預設實作 了

    LifecycleOwner

    接口。也就是說,如果我們使用

    Api26.1.0

    或以上的版本,我們可以直接使用

    getLifecycle().addObserver()

    Android Lifecycles 生命周期感覺前言例子Lifecycle
    從Activity的繼承關系看,我們預設使用的AppCompatActivity也是可以直接使用的。如果你的Activity直接繼承自

    Activity

    ,那麼通過實作

    LifecycleOwner

    來達到相同的效果:

    “`java

    public class MyActivity extends Activity implements LifecycleOwner {

    private LifecycleRegistry mLifecycleRegistry;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        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;
    }
               
    }