使用 Lifecycle 管理 Activity 和 Fragment 組件的生命週期能夠減小重複的樣板代碼以及減小沒必要要的麻煩。bash
假設咱們要實現一個定位的功能,咱們須要在Activity的生命週期回調方法中添加定位sdk的啓動和中止方法:markdown
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(); } } 複製代碼
這是一個很常見的處理方式,可是存在一些缺點:ide
每次使用定位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的生命週期。orm
接下來就是在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); } } 複製代碼
到此就實現了最開始定位的功能。接口
在支持庫 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);
複製代碼