Android Lifecycle 生命周期组件详解
轉(zhuǎn)載請(qǐng)標(biāo)明出處:https://blog.csdn.net/zhaoyanjun6/article/details/99695779
本文出自【趙彥軍的博客】
一、Lifecycle簡(jiǎn)介
為什么要引進(jìn)Lifecycle?
我們?cè)谔幚鞟ctivity或者Fragment組件的生命周期相關(guān)時(shí),不可避免會(huì)遇到這樣的問(wèn)題:
我們?cè)贏ctivity的onCreate()中初始化某些成員(比如MVP架構(gòu)中的Presenter,或者AudioManager、MediaPlayer等),然后在onStop中對(duì)這些成員進(jìn)行對(duì)應(yīng)處理,在onDestroy中釋放這些資源,這樣導(dǎo)致我們的代碼也許會(huì)像這樣:
class MyPresenter{public MyPresenter() {}void create() {//do something}void destroy() {//do something} }class MyActivity extends AppCompatActivity {private MyPresenter presenter;public void onCreate(...) {presenter= new MyPresenter ();presenter.create();}public void onDestroy() {super.onDestroy();presenter.destory();} }代碼沒(méi)有問(wèn)題,關(guān)鍵問(wèn)題是,實(shí)際生產(chǎn)環(huán)境中 ,這樣的代碼會(huì)非常復(fù)雜,你最終會(huì)有太多的類(lèi)似調(diào)用并且會(huì)導(dǎo)致 onCreate()和 onDestroy()方法變的非常臃腫。
二、解決方案
Lifecycle 是一個(gè)類(lèi),它持有關(guān)于組件(如 Activity或 Fragment)生命周期狀態(tài)的信息,并且允許其他對(duì)象觀察此狀態(tài)。
第1步:BasePresenter 繼承 LifecycleObserver
open class BasePresenter : LifecycleObserver {@OnLifecycleEvent(Lifecycle.Event.ON_CREATE)open fun onCreate(owner: LifecycleOwner) {}@OnLifecycleEvent(Lifecycle.Event.ON_START)open fun onStart(owner: LifecycleOwner) {}@OnLifecycleEvent(Lifecycle.Event.ON_RESUME)open fun onResume(owner: LifecycleOwner) {}@OnLifecycleEvent(Lifecycle.Event.ON_PAUSE)open fun onPause(owner: LifecycleOwner) {}@OnLifecycleEvent(Lifecycle.Event.ON_STOP)open fun onStop(owner: LifecycleOwner) {}@OnLifecycleEvent(Lifecycle.Event.ON_DESTROY)open fun onDestroy(owner: LifecycleOwner) {}@OnLifecycleEvent(Lifecycle.Event.ON_ANY)open fun onLifecycleChanged(owner: LifecycleOwner, event: Lifecycle.Event) {}}第2步:MainPresenter 繼承 BasePresenter
class MyPresenter : BasePresenter() {override fun onCreate(owner: LifecycleOwner) {super.onCreate(owner)Log.e("Lifecycle", "onCreate")}override fun onStart(owner: LifecycleOwner) {super.onStart(owner)Log.e("Lifecycle", "onStart")}override fun onResume(owner: LifecycleOwner) {super.onResume(owner)Log.e("Lifecycle", "onResume")}override fun onPause(owner: LifecycleOwner) {super.onPause(owner)Log.e("Lifecycle", "onPause")}override fun onStop(owner: LifecycleOwner) {super.onStop(owner)Log.e("Lifecycle", "onStop")}override fun onDestroy(owner: LifecycleOwner) {super.onDestroy(owner)Log.e("Lifecycle", "onDestroy")}override fun onLifecycleChanged(owner: LifecycleOwner, event: Lifecycle.Event) {super.onLifecycleChanged(owner, event)Log.e("Lifecycle", "onLifecycleChanged $event")}}第4步:在Activity/Fragment容器中添加Observer
package com.yanjunimport android.os.Bundle import android.support.v7.app.AppCompatActivity import android.util.Logclass MainActivity : AppCompatActivity() {override fun onCreate(savedInstanceState: Bundle?) {super.onCreate(savedInstanceState)setContentView(R.layout.activity_main)lifecycle.addObserver(MainPresenter())}override fun onDestroy() {super.onDestroy()} }如此,每當(dāng)Activity發(fā)生了對(duì)應(yīng)的生命周期改變,Presenter就會(huì)執(zhí)行對(duì)應(yīng)事件注解的方法:
除onCreate和onDestroy事件之外,Lifecycle一共提供了所有的生命周期事件,只要
通過(guò)注解進(jìn)行聲明,就能夠使LifecycleObserver觀察到對(duì)應(yīng)的生命周期事件:
三、Lifecycle.Event
Lifecycle 是一個(gè)抽象類(lèi)
public abstract class Lifecycle {public enum Event {/*** Constant for onCreate event of the {@link LifecycleOwner}.*/ON_CREATE,/*** Constant for onStart event of the {@link LifecycleOwner}.*/ON_START,/*** Constant for onResume event of the {@link LifecycleOwner}.*/ON_RESUME,/*** Constant for onPause event of the {@link LifecycleOwner}.*/ON_PAUSE,/*** Constant for onStop event of the {@link LifecycleOwner}.*/ON_STOP,/*** Constant for onDestroy event of the {@link LifecycleOwner}.*/ON_DESTROY,/*** An {@link Event Event} constant that can be used to match all events.*/ON_ANY}public enum State {/*** Destroyed state for a LifecycleOwner. After this event, this Lifecycle will not dispatch* any more events. For instance, for an {@link android.app.Activity}, this state is reached* <b>right before</b> Activity's {@link android.app.Activity#onDestroy() onDestroy} call.*/DESTROYED,/*** Initialized state for a LifecycleOwner. For an {@link android.app.Activity}, this is* the state when it is constructed but has not received* {@link android.app.Activity#onCreate(android.os.Bundle) onCreate} yet.*/INITIALIZED,/*** Created state for a LifecycleOwner. For an {@link android.app.Activity}, this state* is reached in two cases:* <ul>* <li>after {@link android.app.Activity#onCreate(android.os.Bundle) onCreate} call;* <li><b>right before</b> {@link android.app.Activity#onStop() onStop} call.* </ul>*/CREATED,/*** Started state for a LifecycleOwner. For an {@link android.app.Activity}, this state* is reached in two cases:* <ul>* <li>after {@link android.app.Activity#onStart() onStart} call;* <li><b>right before</b> {@link android.app.Activity#onPause() onPause} call.* </ul>*/STARTED,/*** Resumed state for a LifecycleOwner. For an {@link android.app.Activity}, this state* is reached after {@link android.app.Activity#onResume() onResume} is called.*/RESUMED;/*** Compares if this State is greater or equal to the given {@code state}.** @param state State to compare with* @return true if this State is greater or equal to the given {@code state}*/public boolean isAtLeast(@NonNull State state) {return compareTo(state) >= 0;}} }四、原理分析
我們先將重要的這些類(lèi)挑選出來(lái):
- LifecycleObserver接口( Lifecycle觀察者):
實(shí)現(xiàn)該接口的類(lèi),通過(guò)注解的方式,可以通過(guò)被LifecycleOwner類(lèi)的addObserver(LifecycleObserver o)方法注冊(cè),被注冊(cè)后,LifecycleObserver便可以觀察到LifecycleOwner的生命周期事件。
- LifecycleOwner接口 Lifecycle持有者):
實(shí)現(xiàn)該接口的類(lèi)持有生命周期(Lifecycle對(duì)象),該接口的生命周期(Lifecycle對(duì)象)的改變會(huì)被其注冊(cè)的觀察者LifecycleObserver觀察到并觸發(fā)其對(duì)應(yīng)的事件。
- Lifecycle(生命周期):
和LifecycleOwner不同的是,LifecycleOwner本身持有Lifecycle對(duì)象,LifecycleOwner通過(guò)其Lifecycle getLifecycle()的接口獲取內(nèi)部Lifecycle對(duì)象。
-
State(當(dāng)前生命周期所處狀態(tài)):如圖所示。
-
Event(當(dāng)前生命周期改變對(duì)應(yīng)的事件):
當(dāng)Lifecycle發(fā)生改變,如進(jìn)入onCreate,會(huì)自動(dòng)發(fā)出ON_CREATE事件。
下面我們將換一種方式在Fragment 中實(shí)現(xiàn) Lifecycle 的功能,來(lái)探究它的內(nèi)部實(shí)現(xiàn)原理:
1、Fragment:LifecycleOwner
Fragment(Activity同理,我們 本文以Fragment為例,下同):實(shí)現(xiàn)了LifecycleOwner接口,這意味著Fragment對(duì)象持有生命周期對(duì)象(Lifecycle),并可以通過(guò)Lifecycle getLifecycle()方法獲取內(nèi)部的Lifecycle對(duì)象:
public class Fragment implements xxx, LifecycleOwner {//...省略其他LifecycleRegistry mLifecycleRegistry = new LifecycleRegistry(this);@Overridepublic Lifecycle getLifecycle() {return mLifecycleRegistry;} }public interface LifecycleOwner {@NonNullLifecycle getLifecycle(); }可以看到,實(shí)現(xiàn)的getLifecycle()方法,實(shí)際上返回的是 LifecycleRegistry 對(duì)象,LifecycleRegistry對(duì)象實(shí)際上繼承了 Lifecycle,這個(gè)下文再講。
持有Lifecycle有什么作用呢?實(shí)際上在Fragment對(duì)應(yīng)的生命周期內(nèi),都會(huì)發(fā)送對(duì)應(yīng)的生命周期事件給內(nèi)部的 LifecycleRegistry對(duì)象處理:
隨著Fragment不同走到不同的生命周期,除了暴露給我們的生命周期方法onCreate/onStart/…/onDestroy等,同時(shí),Fragment內(nèi)部的Lifecycle對(duì)象(就是mLifecycleRegistry)還將生命周期對(duì)應(yīng)的事件作為參數(shù)傳給了 handleLifecycleEvent() 方法。
同時(shí),你會(huì)發(fā)現(xiàn)Fragment中performCreate()、performStart()、performResume()會(huì)先調(diào)用自身的onXXX()方法,然后再調(diào)用LifecycleRegistry的handleLifecycleEvent()方法;而在performPause()、performStop()、performDestroy()中會(huì)先LifecycleRegistry的handleLifecycleEvent()方法 ,然后調(diào)用自身的onXXX()方法。
FullLifecycleObserver
LifecycleObserver有一個(gè)子類(lèi)是 :FullLifecycleObserver ,下面我們看看它的實(shí)現(xiàn):
package android.arch.lifecycle;interface FullLifecycleObserver extends LifecycleObserver {void onCreate(LifecycleOwner owner);void onStart(LifecycleOwner owner);void onResume(LifecycleOwner owner);void onPause(LifecycleOwner owner);void onStop(LifecycleOwner owner);void onDestroy(LifecycleOwner owner); }不過(guò)可惜的是 FullLifecycleObserver 不是 public , 我們也用不了。
參考資料
Android官方架構(gòu)組件Lifecycle:生命周期組件詳解&原理分析
總結(jié)
以上是生活随笔為你收集整理的Android Lifecycle 生命周期组件详解的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: Kotlin实战指南十四:协程启动模式
- 下一篇: Android LiveData组件详解