由于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í)踐)
- 保持 UI controllers (activities and fragments)越簡(jiǎn)潔越好,不要臃腫 。UI controllers不要去獲取數(shù)據(jù),而是用ViewModel來(lái)執(zhí)行,并監(jiān)聽(tīng)lifeData來(lái)更新視圖。
- 嘗試編寫用數(shù)據(jù)驅(qū)動(dòng)的UI,UI controllers的職責(zé)就是數(shù)據(jù)改變是更新視圖,并且把用戶的操作通知給ViewModel。
- 將業(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。
- 使用數(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)避免使用樣板代
- 如果UI非常復(fù)雜,可以考慮創(chuàng)建一個(gè)Persenter類來(lái)處理UI的修改。也許使用Persenter有點(diǎn)大材小用,但是可以使ui變得更容易測(cè)試
- 不要在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è)主要的枚舉
- Event
從framework框架和Lifecycle類調(diào)度的生命周期事件,這些事件映射在activity或者fragment的回調(diào)中。
- 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)
從觀察者列表中刪除給定的觀察者

一個(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());
}
}