Lifecycle官方文檔地址:https://developer.android.com/topic/libraries/architecture/lifecycle。android
Activity 和 Fragment 是有聲明週期的,開發時咱們的不少操做須要寫在聲明週期的方法中,好比,下載、文件操做等。這樣不少狀況下會致使,咱們在 Activity中 的聲明週期方法中寫愈來愈多的代碼,從而使得 Activity 或者 Fragment 愈來愈臃腫,代碼維護愈來愈困難。這時咱們使用Lifecycle就能夠很好的解決這類問題。
Lifecycle代碼簡潔,咱們能夠經過實現LifecycleObserver 接口來監聽聲明週期,而後咱們在Activity和Fragment中去註冊監聽。git
Lifecycle 的原理圖以下:github
看完原理圖後,咱們應該對Lifecycle有一些簡單的理解和認知了,下面咱們來說述一下Lifecycle如何使用。編程
Lifecycle: Lifecycle是一個持有組件生命週期狀態(如Activity或Fragment)的信息的類,並容許其餘對象觀察此狀態。網絡
Event :從框架和Lifecycle類派發的生命週期事件。這些事件映射到活動和片斷中的回調事件。框架
State :由Lifecycle對象跟蹤的組件的當前狀態。編程語言
LifecycleOwner (重要)Lifecycle持有者:實現該接口的類持有生命週期(Lifecycle對象),該接口的生命週期(Lifecycle對象)的改變會被其註冊的觀察者LifecycleObserver觀察到並觸發其對應的事件。ide
LifecycleObserver(重要)Lifecycle觀察者:實現該接口的類,經過註解的方式,能夠經過被LifecycleOwner類的addObserver(LifecycleObserver o)方法註冊,被註冊後,LifecycleObserver即可以觀察到LifecycleOwner的生命週期事件。測試
簡單來講,LifecycleOwner 就是一個接口,誰繼承了它,就持有了lifecycle對象。而後就能夠調用getLifecycle()方法獲取繼承了抽象類Lifecycle的LifecycleRegistry,而後調用 addObserver(@NonNull LifecycleObserver observer) 方法來註冊監聽。
這樣,該接口的生命週期 (Lifecycle對象) 的改變會被其註冊的觀察者LifecycleObserver觀察到並觸發其對應的事件。ui
注意:Support Library 26.1.0 及其之後的版本,Activity 和Fragment 已經實現了LifecycleOwner 接口。咱們能夠直接在Activity 和Fragment中使用getLifecycle()方法來獲取 Lifecycle 對象,來添加觀察者監聽。
LifecycleObserver 是一個觀察者接口,實現了它,能夠經過註解或者繼承的方式,來管理聲明週期的監聽。只要在持有lifecycle的類中註冊了它,當聲明週期發生變化時,它就能收到,進行咱們自定義的操做。
目前Activity能夠不用實現 LifecycleOwner,從API14開始 AppCompatActivity已經在內部實現了 LifecycleOwner,咱們只須要使用AppCompatActivity結合Lifecycle一塊兒使用便可。
頁面代碼:
public class MainActivity extends AppCompatActivity { MyObserver myObserver; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); myObserver = new MyObserver(); getLifecycle().addObserver(myObserver); } public void toSecond(View view) { startActivity(new Intent(this, SecondActivity.class)); } @Override protected void onDestroy() { super.onDestroy(); getLifecycle().removeObserver(myObserver); } }
組件監聽代碼:
package com.renhui.lifecycle; import android.arch.lifecycle.Lifecycle; import android.arch.lifecycle.LifecycleObserver; import android.arch.lifecycle.OnLifecycleEvent; public class MyObserver implements LifecycleObserver { @OnLifecycleEvent(Lifecycle.Event.ON_CREATE) public void ON_CREATE() { System.out.println("MyObserver:ON_CREATE"); } @OnLifecycleEvent(Lifecycle.Event.ON_START) public void ON_START() { System.out.println("MyObserver:ON_START"); } @OnLifecycleEvent(Lifecycle.Event.ON_RESUME) public void ON_RESUME() { System.out.println("MyObserver:ON_RESUME"); } @OnLifecycleEvent(Lifecycle.Event.ON_PAUSE) public void ON_PAUSE() { System.out.println("MyObserver:ON_PAUSE"); } @OnLifecycleEvent(Lifecycle.Event.ON_STOP) public void ON_STOP() { System.out.println("MyObserver:ON_STOP"); } @OnLifecycleEvent(Lifecycle.Event.ON_DESTROY) public void ON_DESTROY() { System.out.println("MyObserver:ON_DESTROY"); } }
Demo地址:https://github.com/renhui/LiftCycle-master
咱們能夠在初始化MyObserver的時候將lifecycle傳入,在MyObserver中進行操做時再次確認宿主的」生命週期」狀態。
if (lifecycle.getCurrentState().isAtLeast(STARTED)) { //do something }
另外,官網提供了生命週期感知組件的最佳實戰的建議:
若是你喜歡用Java編程語言來作到這一點,可使用像Butter Knife這樣的庫來避免樣板代碼而且有更好的抽象。
若是ViewModel超出活動(在配置更改的狀況下),則活動會泄漏而且垃圾收集器沒法正確處理。