Architecture Components 1.1.0穩(wěn)定版已經(jīng)發(fā)布碘饼,可以放心地用到項目了。
下面將結(jié)合文檔簡單地介紹一下其中的生命周期管理組件( Lifecycle-Aware Components)悲伶。
設(shè)計目的
更好更容易地編寫和組織Android組件(例如Activity和Fragment)中生命周期相關(guān)(例如onStart()和onStop())的代碼艾恼。
如何引入
Support Library 26.1.0之后的版本的Fragments和Activities都已經(jīng)實現(xiàn)了相關(guān)的接口(LifecycleOwner)。
所以直接繼承Support Library的AppCompatActivity或者Fragment就可以使用麸锉。
注意:如果Support Library 低于26.1.0钠绍,則需要繼承LifecycleActivity和LifecycleFragment才能使用。
面臨的問題
常見的問題:需要在Activity和Fragment中管理異步任務(wù)或者一些系統(tǒng)資源花沉。
下面是一個關(guān)于定位組件的生命周期管理問題柳爽。可以看到碱屁,即使將管理行為都封裝在MyLocationListener類中磷脯,但還是無法避免對Activity的生命周期函數(shù)onXXXX()加入不少代碼。如果需要管理更多的組件娩脾,問題就更明顯了赵誓。
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();
// manage other components that need to respond
// to the activity lifecycle
}
@Override
public void onStop() {
super.onStop();
myLocationListener.stop();
// manage other components that need to respond
// to the activity lifecycle
}
}
Lifecycle-Aware Components
- Lifecycle
Lifecycle被設(shè)計為擁有了組件(例如Activity)的生命周期信息,允許其他對象訂閱這些生命周期的信息。使用了觀察者模式俩功,詳細可以看看源代碼幻枉。
其中有兩個重要的枚舉類:
Event - 這些事件對應(yīng)了組件(Activity和Fragment)的回調(diào)事件。
State - 組件當(dāng)前的狀態(tài) - LifecycleOwner
用于表示實現(xiàn)了Lifecycle功能诡蜓。單方法接口熬甫,只有g(shù)etLifecycle()一個方法。Support Library的AppCompatActivity和Fragment都實現(xiàn)了此接口万牺。
例子
class MyLocationListener implements LifecycleObserver {
//通過注解回調(diào)
@OnLifecycleEvent(Lifecycle.Event.ON_START)
void start() {
...
}
//通過注解回調(diào)
@OnLifecycleEvent(Lifecycle.Event.ON_STOP)
void stop() {
...
}
}
class MyActivity extends AppCompatActivity {
private MyLocationListener myLocationListener;
@Override
public void onCreate(...) {
...
//觀察生命周期變化
this.getLifecycle().addObserver(new MyLocationListener());
}
}
從例子可以看出罗珍,這些外部資源的管理代碼很好地和Activity和Fragment的進行了分離。
- Support Library中Activity和Fragment中的實現(xiàn)
原理比較簡單脚粟,就是在生命周期回調(diào)方法中(onXXXX()方法)同步改變Lifecycle組件中的狀態(tài)覆旱。因為Lifecycle是被觀察者,所以狀態(tài)改變的事件也就同時發(fā)出去了核无。具體可以看看源碼扣唱。比較有意思的是Activity中的實現(xiàn),借助了一個不可見的ReportFragment去改變Lifecycle組件的狀態(tài)团南。這種借助的不可見Fragment的思路噪沙,值得借鑒一下。
擴展應(yīng)用
RxLifecycle吐根,這個庫簡化了在RxJava/RxAndroid下管理生命周期的問題
Lifecycle-Aware Components和RxLifecycle可以很好地結(jié)合使用正歼,配合Kotlin更是簡單到不能再簡單了。
- 引入
compile 'com.trello.rxlifecycle2:rxlifecycle:2.2.1'
// 使用Java拷橘,配合Android Lifecycle
compile 'com.trello.rxlifecycle2:rxlifecycle-android-lifecycle:2.2.1'
// 使用Kotlin局义,配合Android Lifecycle
compile 'com.trello.rxlifecycle2:rxlifecycle-android-lifecycle-kotlin:2.2.1'
- Java用法
public class MyActivity extends AppCompatActivity {
private final LifecycleProvider<Lifecycle.Event> provider
= AndroidLifecycle.createLifecycleProvider(this);
@Override
public void onResume() {
super.onResume();
myObservable
.compose(provider.bindToLifecycle())
.subscribe();
}
}
- Kotlin用法
myObservable
.bindUntilEvent(myAppCompatActivity, ON_STOP)
.subscribe { }
資源
官方文檔: https://developer.android.com/topic/libraries/architecture/lifecycle