使用 Lifecycle 管理 Activity 和 Fragment 組件的生命週期能夠減小重複的樣板代碼以及減小沒必要要的麻煩。bash
假設咱們要實現一個定位的功能,咱們須要在Activity的生命週期回調方法中添加定位sdk的啓動和中止方法:ide
public class LocationActivity extends AppCompatActivity{
private LocationListener listener;
@Override
protected void onCreate(Bundle savedInstanceState) {
// 綁定UI控件
listener = new LocationListener(this);
listener.onLocationUpdate(new LocationCallback(){
@Override
public void onUpdate(Position position){
// 根據位置數據更新UI
}
});
}
@Override
protected void onstart(){
listener.start();
}
@Override
protected void onStop(){
listener.stop();
}
}
複製代碼
這是一個很常見的處理方式,可是存在一些缺點:ui
每次使用定位sdk都須要在生命週期中寫啓動和中止的方法,若是有多個activity使用了sdk就存在不少冗餘代碼。this
生命週期方法中放置大量代碼,這使得它們難以維護。spa
使用 Lifecycle 的方法很是簡單,先看 LocationListener
的代碼:code
public class LocationListener implements LifecycleObserver {
@OnLifecycleEvent(Lifecycle.Event.ON_START)
public void start(){
// 啓動定位服務
}
@OnLifecycleEvent(Lifecycle.Event.ON_STOP)
public void stop(){
// 中止定位服務
}
}
複製代碼
經過上面的代碼能夠看到咱們只是在原來代碼的基礎上實現了LifecycleObserver
接口,並在start()
和stop()
方法上加上了表明觸發它們的生命週期時機的註解,註解裏的參數對應着activity的生命週期。cdn
接下來就是在activity中使用就更簡單了。server
public class LocationActivity extends AppCompatActivity{
private LocationListener listener;
@Override
protected void onCreate(Bundle savedInstanceState) {
// 綁定UI控件
listener = new LocationListener(this);
listener.onLocationUpdate(new LocationCallback(){
@Override
public void onUpdate(Position position){
// 根據位置數據更新UI
}
});
getLifecycle().addObserver(listener);
}
}
複製代碼
到此就實現了最開始定位的功能。blog
在支持庫 Support Library 26.1.0 中 activity 和 fragment 提供了默認的getLifecycle()
方法,可是若是咱們想在低版本和非 activity 、fragment類中也實現生命週期該怎麼辦呢?方法以下:接口
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;
}
}
複製代碼
整個 Lifecycle 中有幾個重要的類:
Lifecycle
抽象類,定義了一些操做LifecycleObserver
的抽象方法,以及表明生命週期的State
、Event
枚舉類。
LifecycleObserver
接口,內部沒有定義任何方法,經過Lifecycle.addObserver()
能夠註冊監聽生命週期變化,以註釋的方法聲明監聽。
LifecycleOwner
接口,該接口是由生命週期宿主(activity / fragment)實現的,只有一個Lifecycle getLifecycle()
方法。
LifecycleRegistry
類,它是 Lifecycle
的子類,其內部定義了具體的實現細節,默認狀況下,一個宿主實現了 LifecycleOwner
接口後就應該在其內部聲明一個LifecycleRegistry
,並在本身的生命週期回調方法中爲其設置各類狀態:
this.mLifecycleRegistry.markState(State.CREATED);
複製代碼