android架構組件Lifecycle
2023-07-08 22:15 ttylinux 閱讀(74) 評論(0) 收藏 舉報Lifecycle 組件指的是 android.arch.lifecycle 包下提供的各種類與接口,可以讓開發者構建能感知其他組件(主要指Activity 、Fragment)生命周期(lifecycle-aware)的類。
在android開發的過程中,我們常常需要讓一些操作能夠感知Activity/Fragment的生命周期,從而實現在活動狀態下允許操作,而在銷毀狀態下需要自動禁止操作,釋放資源,防止內存泄露。例如大名鼎鼎的圖片加載框架 Glide 在 Acticiy/Fragment 處于前臺的時候加載圖片,而在不可見的狀態下停止圖片的加載,又例如我們希望 RxJava 的 Disposable 能夠在Activity/Fragment 銷毀是自動 dispose。Lifecycle 的出現,讓開發者們能夠輕易地實現上述的功能。
使用
假設有一個Presenter,需要在Activity的各個生命周期,執行相應的方法,那么,只需要實現LifecycleObserver,這樣,在Activity處于相應的生命周期的時候,相應的方法就會被調用:
public class MyPresent implements IPresent, LifecycleObserver { @OnLifecycleEvent(Lifecycle.Event.ON_CREATE) @Override public void onCreate() { LogUtil.i(TAG, "onCreate"); } @OnLifecycleEvent(Lifecycle.Event.ON_START) @Override public void onStart() { LogUtil.i(TAG, "onStart"); } @OnLifecycleEvent(Lifecycle.Event.ON_RESUME) @Override public void onResume() { LogUtil.i(TAG, "onResume"); } @OnLifecycleEvent(Lifecycle.Event.ON_PAUSE) @Override public void onPause() { LogUtil.i(TAG, "onPause"); } @OnLifecycleEvent(Lifecycle.Event.ON_STOP) @Override public void onStop() { LogUtil.i(TAG, "onStop"); } @OnLifecycleEvent(Lifecycle.Event.ON_DESTROY) @Override public void onDestory() { LogUtil.i(TAG, "onDestory"); } }
上述代碼實現的是一個觀察者,被觀察者是Activity,Activity會將生命周期中的方法回調通知到觀察者中對應的方法
然后在需要監聽的 Activity 中注冊:
public class MyActivity extends AppCompatActivity { protected MyPresent myPresent; @Override public void onCreate(@Nullable Bundle savedInstanceState, @Nullable PersistableBundle persistentState) { super.onCreate(savedInstanceState, persistentState); getLifecycle().addObserver(new MyPresent()); //添加監聽對象 } }
原理:
-
LifecycleOwner:生命周期的事件分發者,在 Activity/Fragment 他們的生命周期發生變化的時發出相應的 Event 給 LifecycleRegistry。
-
LifecycleObserver:生命周期的觀察者,通過注解將處理函數與希望監聽的Event綁定,當相應的Event發生時,LifecycleRegistry會通知相應的函數進行處理。
-
LifecycleRegistry:控制中心。它負責控制state的轉換、接受分發event事件。

Lifecycle使用的三種基本使用方式:
第一種使用方式。使用@onLifecycleEvent注解。注解處理器會將該注解解析并動態生成GeneratedAdapter代碼,這個GeneratedAdapter會把對應的 Lifecycle.Event 封裝為方法調用。最終通過GenericLifecycleObserver的onStateChanged方法調用生成的GeneratedAdapter的callMechods方法進行事件分發
public class MyLifeCycleObserver implements LifeCycleObserver { @onLifecycleEvent(LifeCycle.Event.ON_CREATE) public onCreate(LifeCycleOwner owner) { //doSomething }
@onLifecycleEvent(LifeCycle.Event.ON_DESTROY) public onDestroy(LifeCycleOwner owner) { //doSomething } } public class MainActivity extends AppCompatActivity { @override public void onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_main) getLifecycle().addObserver(new MyLifeCycleObserver()); } }
上述的例子中的 MyLifeCycleObserver 將會在編譯時,生成GeneratedAdapter代碼如下:
public class MyLifeCycleObserver_LifecycleAdapter implements GeneratedAdapter { final MyLifeCycleObserver mReceiver; MyLifeCycleObserver_LifecycleAdapter(MyLifeCycleObserver receiver) { //mReceiver就是我們開發者傳入的MyLifeCycleObserver this.mReceiver = receiver; } //callMechod方法會被GenericLifecycleObserver的onStateChanged方法調用,用以分發生命周期 @Override public void callMethods(LifecycleOwner owner, Lifecycle.Event event, boolean onAny, MethodCallsLogger logger) { boolean hasLogger = logger != null; if (onAny) { return; } //如果生命周期事件是ON_CREATE,那么調用MyLifeCycleObserver的onCreate方法 if (event == Lifecycle.Event.ON_CREATE) { if (!hasLogger || logger.approveCall("onCreate", 2)) { mReceiver.onCreate(owner); } return; } //如果生命周期事件是ON_DESTROY,那么調用MyLifeCycleObserver的onDestroy方法 if (event == Lifecycle.Event.ON_DESTROY) { if (!hasLogger || logger.approveCall("onDestroy", 2)) { mReceiver.onDestroy(owner); } return; } } }
第二種使用方式。直接繼承 GenericLifecycleObserver,并實現onStateChange 方法:
public class MyLifeCycleObserver extends GenericLifeCycleObserver { @override void onStateChanged(LifecycleOwner source, Lifecycle.Event event) { if(event == LifeCycleEvent.Event.ON_CREATE) { //dosomething } else if(event == LifeCycleEvent.Event.ON_DESTROY) { //doSomething } } } public class MainActivity extends AppCompatActivity { @override public void onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_main) getLifecycle().addObserver(new MyLifeCycleObserver()); } }
第三種使用方式。繼承 DefaultLifecycleObserver 接口(DefaultLifecycleObserver 又繼承自 FullLifecycleObserver接口),并實現 FullLifecycleObserver 接口的 onCreate、onStart、onResume、onPause、onStop、onDestroy 等對應各自生命周期的方法
class MyLifycycleObserver implements DefaultLifecycleObserver { @Override public void onCreate(@NonNull LifecycleOwner owner) { //doSomething } ...... @Override public void onDestroy(@NonNull LifecycleOwner owner) { //doSomething } } public class MainActivity extends AppCompatActivity { @override public void onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_main) getLifecycle().addObserver(new MyLifeCycleObserver()); } }
版權聲明:
作者:ttylinux
本文版權歸作者,歡迎轉載,但未經作者同意必須保留此段聲明,且在文章頁面明顯位置給出原文連接,否則保留追究法律責任的權利。
浙公網安備 33010602011771號