Android architecture components Lifecycle

由于architecture components處于最初階段,因此Fragment和AppCompatActivity類將無(wú)法實(shí)現(xiàn)(因?yàn)槲覀儫o(wú)法將穩(wěn)定組件的依賴關(guān)系添加到不穩(wěn)定的API)。在生命周期穩(wěn)定之前,為了方便起見(jiàn),提供了LifecycleActivity和LifecycleFragment類。Lifecycles期項(xiàng)目發(fā)布后,支持庫(kù)fragment和activity將實(shí)現(xiàn)LifecycleOwner接口;當(dāng)時(shí)將不推薦使用LifecycleActivity和LifecycleFragment。
另請(qǐng)參閱 Implementing LifecycleOwner in custom activities and fragments.

Best practices for Lifecycles(生命周期最佳實(shí)踐)

  1. 保持 UI controllers (activities and fragments)越簡(jiǎn)潔越好,不要臃腫 。UI controllers不要去獲取數(shù)據(jù),而是用ViewModel來(lái)執(zhí)行,并監(jiān)聽(tīng)lifeData來(lái)更新視圖。
  2. 嘗試編寫用數(shù)據(jù)驅(qū)動(dòng)的UI,UI controllers的職責(zé)就是數(shù)據(jù)改變是更新視圖,并且把用戶的操作通知給ViewModel。
  3. 將業(yè)務(wù)邏輯放入在VIewModel中,VIewModel應(yīng)該用作UI控制器和其他應(yīng)用程序之間的連接器。請(qǐng)注意,ViewModel的責(zé)任不是獲取數(shù)據(jù)(例如從網(wǎng)絡(luò)獲取數(shù)據(jù)),ViewModel應(yīng)該調(diào)用相應(yīng)的組件來(lái)獲取數(shù)據(jù),然后把結(jié)果提供給UI controller。
  4. 使用數(shù)據(jù)綁定來(lái)維護(hù)視圖view和UI控制器接口的清潔。使view視圖更具有生命性,減少在fragment或者activity編寫更新數(shù)據(jù)的代碼。如果使用Java語(yǔ)言來(lái)開(kāi)發(fā),請(qǐng)使用像Butter Knife這樣的庫(kù)來(lái)避免使用樣板代
  5. 如果UI非常復(fù)雜,可以考慮創(chuàng)建一個(gè)Persenter類來(lái)處理UI的修改。也許使用Persenter有點(diǎn)大材小用,但是可以使ui變得更容易測(cè)試
  6. 不要在ViewModel中引用View或者Activity中的context,如果ViewModel活的比Activity更長(zhǎng),activity可能會(huì)引發(fā)內(nèi)存泄露,而不是正常的垃圾回收。

Lifecycle

Lifecycle是保存相關(guān)組件生命周期狀態(tài)信息例如Activity或者Fragment。并且允許其他對(duì)象觀察此狀態(tài)。

Lifecycle 使用兩個(gè)主要的枚舉跟蹤相關(guān)聯(lián)的生命周期狀態(tài)

在Lifecycle類中,LifecycleOwner的相關(guān)方法返回 ,才會(huì)分發(fā)on_create,on_start,on_resume事件
on_pause,on_stop,on_destory是在 LifecycleOwner的相關(guān)方法返回 調(diào)用
例如,ON_START事件將在onStar方法t返回后發(fā)送,ON_STOP事件將在調(diào)用onStop方法之前發(fā)送。這給予您對(duì)所有者所處的狀態(tài)的一定保證

Lifecycle類中兩個(gè)主要的枚舉

  1. Event

從framework框架和Lifecycle類調(diào)度的生命周期事件,這些事件映射在activity或者fragment的回調(diào)中。

  1. STATE

由Lifecycle對(duì)象跟蹤相關(guān)組件的當(dāng)前狀態(tài)

Lifecycle類中有三個(gè)方法

abstract void addObserver (LifecycleObserver)

添加一個(gè)LifecycleObserver,當(dāng)LifecycleOwner更改狀態(tài)時(shí),LifecycleObserver將得到通知

abstract Lifecycle.State getCurrentState()

返回生命周期的當(dāng)前狀態(tài)

abstract void removeObserver(LifecycleObserver)

從觀察者列表中刪除給定的觀察者

lifecycle-states.png

一個(gè)類可以通過(guò)在方法上添加注解,來(lái)監(jiān)聽(tīng)一個(gè)組件的生命周期的狀態(tài)

    public class MyObserver implements LifecycleObserver 
{
    @OnLifecycleEvent(Lifecycle.Event.ON_RESUME)
    public void onResume() {
     }

    @OnLifecycleEvent(Lifecycle.Event.ON_PAUSE)
    public void onPause() {
    }
 }
    aLifecycleOwner.getLifecycle().addObserver(new MyObserver());

使用注釋觀察生命周期事件

class TestObserver implements LifecycleObserver {
   @OnLifecycleEvent(ON_STOP)
   void onStopped() {}
 }

一個(gè)方法可以觀察多個(gè)事件,多個(gè)方法也可以觀察相同事件

class TestObserver implements LifecycleObserver {
   @OnLifecycleEvent({ON_STOP, ON_START})
   void onStoppedOrStarted() {}
   @OnLifecycleEvent(ON_STOP)
   void onStopped() {}
 }

Observer方法可以接收0,1或2個(gè)參數(shù)。如果使用,第一個(gè)參數(shù)必須是LifecycleOwner類型,第二個(gè)參數(shù)必須是Lifecycle.Event類型

class TestObserver implements LifecycleObserver {
   @OnLifecycleEvent(ON_CREATE)
   void onCreated(LifecycleOwner source) {}
   @OnLifecycleEvent({ON_STOP, ON_START})
   void onStoppedOrStarted(LifecycleOwner source, Event event) {}
 }

提供了這些附加參數(shù),以便方便地觀察多個(gè)提供者和事件,而無(wú)需手動(dòng)跟蹤。

LifecycleOwner

A class that has an Android lifecycle. These events can be used by custom components to handle lifecycle changes without implementing any code inside the Activity or the Fragment.

一個(gè)具有Android生命周期的類。自定義組件能夠使用這些事件來(lái)處理生命周期的改變。而不是在fragment或者activity中實(shí)現(xiàn)任何代碼。
唯一抽象方法

 abstract Lifecycle getLifecycle)()

返回提供者的生命周期

官方示例代碼

表達(dá)能力不行 都在酒呢 干了吧

public class MainActivity extends LifecycleActivity {

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

        MyLocationListener myLocationListener = new MyLocationListener();
        getLifecycle().addObserver(myLocationListener);
    }
}

額 反正 這么寫 在相應(yīng)的生命周期調(diào)用已經(jīng)綁定了的方法,如果一個(gè)方法綁定了兩個(gè)事件,在對(duì)應(yīng)的事件都會(huì)觸發(fā)。像下面的例子,start方法在onCreate事件和OnResume事件都會(huì)調(diào)用start方法。

public class MyLocationListener implements LifecycleObserver {

    private static final String TAG = MyLocationListener.class.getSimpleName();

    @OnLifecycleEvent({Lifecycle.Event.ON_CREATE, Lifecycle.Event.ON_RESUME})
    public void start(LifecycleOwner lifecycleOwner, Lifecycle.Event event) {
        Log.d(TAG, "start: " + event.name() + " === " + lifecycleOwner.getLifecycle());
        Lifecycle.State currentState = lifecycleOwner.getLifecycle().getCurrentState();
        Log.d(TAG, "start: " + currentState);
    }

    @OnLifecycleEvent(Lifecycle.Event.ON_PAUSE)
    public void stop(LifecycleOwner lifecycleOwner) {
        Log.d(TAG, "stop: " + lifecycleOwner.getLifecycle().getCurrentState());
    }
}
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容