自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

源碼進(jìn)階之lifecycle組件原理分析

移動(dòng)開發(fā) Android
如何利用 android.arch.lifecycle 包提供的類來控制數(shù)據(jù)、監(jiān)聽器等的 lifecycle。同時(shí),LiveData 與 ViewModel 的 lifecycle 也依賴于 Lifecycle 框架;今天我們就來聊聊lifecycle的實(shí)現(xiàn)原理,來一波分析。

[[421728]]

前言

如何利用 android.arch.lifecycle 包提供的類來控制數(shù)據(jù)、監(jiān)聽器等的 lifecycle。同時(shí),LiveData 與 ViewModel 的 lifecycle 也依賴于 Lifecycle 框架;

今天我們就來聊聊lifecycle的實(shí)現(xiàn)原理,來一波分析

一、為什么要引進(jìn)Lifecycle?

1、沒有引進(jìn)Lifecycle做法

  • 在處理Activity或者Fragment組件的生命周期相關(guān)時(shí),不可避免會遇到這樣的問題;
  • 在Activity的onCreate()中初始化某些成員(比如MVP架構(gòu)中的Presenter,或者AudioManager、MediaPlayer等),然后在onStop中對這些成員進(jìn)行對應(yīng)處理,在onDestroy中釋放這些資源,這樣導(dǎo)致我們的代碼也許會像這樣;
  1. class MyPresenter{ 
  2.     public MyPresenter() { 
  3.     } 
  4.     void create() { 
  5.         //do something 
  6.     } 
  7.     void destroy() { 
  8.         //do something 
  9.     } 
  10. class MyActivity extends AppCompatActivity { 
  11.     private MyPresenter presenter; 
  12.     public void onCreate(...) { 
  13.         presenter= new MyPresenter (); 
  14.         presenter.create(); 
  15.     } 
  16.     public void onDestroy() { 
  17.         super.onDestroy(); 
  18.         presenter.destory(); 
  19.     } 

代碼沒有問題,關(guān)鍵問題是,實(shí)際生產(chǎn)環(huán)境中 ,這樣的代碼會非常復(fù)雜,你最終會有太多的類似調(diào)用并且會導(dǎo)致 onCreate() 和 onDestroy() 方法變的非常臃腫;

2、引進(jìn)Lifecycle做法

Lifecycle 是一個(gè)類,它持有關(guān)于組件(如 Activity 或 Fragment)生命周期狀態(tài)的信息,并且允許其他對象觀察此狀態(tài);

代碼如下:

Prestener繼承LifecycleObserver接口

  1. public interface IPresenter extends LifecycleObserver { 
  2.     @OnLifecycleEvent(Lifecycle.Event.ON_CREATE) 
  3.     void onCreate(@NotNull LifecycleOwner owner); 
  4.     @OnLifecycleEvent(Lifecycle.Event.ON_DESTROY) 
  5.     void onDestroy(@NotNull LifecycleOwner owner); 
  6.     @OnLifecycleEvent(Lifecycle.Event.ON_ANY) 
  7.     void onLifecycleChanged(@NotNull LifecycleOwner owner, 
  8.                             @NotNull Lifecycle.Event event); 
  9. public class BasePresenter implements IPresenter { 
  10.     private static final String TAG = "com.qingmei2.module.base.BasePresenter";     
  11.     @Override 
  12.     public void onLifecycleChanged(@NotNull LifecycleOwner owner, @NotNull Lifecycle.Event event) { 
  13.     } 
  14.     @Override 
  15.     public void onCreate(@NotNull LifecycleOwner owner) { 
  16.         Log.d("tag""BasePresenter.onCreate" + this.getClass().toString()); 
  17.     } 
  18.     @Override 
  19.     public void onDestroy(@NotNull LifecycleOwner owner) { 
  20.         Log.d("tag""BasePresenter.onDestroy" + this.getClass().toString()); 
  21.     } 

直接將我想要觀察到Presenter的生命周期事件都列了出來,然后封裝到BasePresenter 中,這樣每一個(gè)BasePresenter 的子類都能感知到Activity容器對應(yīng)的生命周期事件,并在子類重寫的方法中,對應(yīng)相應(yīng)行為

在Activity/Fragment容器中添加Observer

  1. public class MainActivity extends AppCompatActivity { 
  2.     private IPresenter mPresenter; 
  3.     @Override 
  4.     protected void onCreate(Bundle savedInstanceState) { 
  5.         super.onCreate(savedInstanceState); 
  6.         Log.d("tag""onCreate" + this.getClass().toString()); 
  7.         setContentView(R.layout.activity_main); 
  8.         mPresenter = new MainPresenter(this); 
  9.         getLifecycle().addObserver(mPresenter);//添加LifecycleObserver 
  10.     } 
  11.     @Override 
  12.     protected void onDestroy() { 
  13.         Log.d("tag""onDestroy" + this.getClass().toString()); 
  14.         super.onDestroy(); 
  15.     } 

每當(dāng)Activity發(fā)生了對應(yīng)的生命周期改變,Presenter就會執(zhí)行對應(yīng)事件注解的方法

二、Lifecycle原理層層深入分析

在Activity 獲取 Lifecycle,實(shí)際上是通過Activity的父類 ComponentActvitiy 獲取,父類實(shí)現(xiàn)了 LifecycleOwner 接口,就能獲取 Lifecycle ,最后注冊 LifecycleObserver 就能拿到生命周期回調(diào)了

1、 onCreate

  1. 在ComponentActvitiy的 onCreate 方法里面可以看到 ReportFragment 的創(chuàng)建。 
  2.     /* ComponentActvitiy */ 
  3.     @Override 
  4.     protected void onCreate(@Nullable Bundle savedInstanceState) { 
  5.         ... 
  6.         ReportFragment.injectIfNeededIn(this); 
  7.         ... 
  8.     } 

2、 getLifecycle方法

  1. /* ComponentActvitiy */ 
  2.   private final LifecycleRegistry mLifecycleRegistry = new LifecycleRegistry(this); 
  3.   @NonNull 
  4.   @Override 
  5.   public Lifecycle getLifecycle() { 
  6.       return mLifecycleRegistry; 
  7.   } 
  8.  Life 

3、 Lifecycle.Event

Lifecycle.Event 是個(gè)枚舉類,這里的生命周期 Event 并不是Fragment的,在后面的生命周期處理時(shí)會用上的。

  1. public enum Event { 
  2.      ON_CREATE, 
  3.      ON_START, 
  4.      ON_RESUME, 
  5.      ON_PAUSE, 
  6.      ON_STOP, 
  7.      ON_DESTROY, 
  8.      ON_ANY; 
  9.     ... 
  10.  } 

4、 ReportFragment的創(chuàng)建

ReportFragment 是一個(gè) 沒有界面的Fragment,如果有了解過Glide原理的同學(xué),應(yīng)該也知道這個(gè)方法,就是通過看不見的Fragment,來感知生命周期,讓使用者無需考慮生命周期的問題。

在SDK29以上的版本 使用的是 LifecycleCallbacks.registerIn(activity)。

  1. /* ReportFragment */ 
  2.   public static void injectIfNeededIn(Activity activity) { 
  3.       if (Build.VERSION.SDK_INT >= 29) { 
  4.           // On API 29+, we can register for the correct Lifecycle callbacks directly 
  5.           LifecycleCallbacks.registerIn(activity); 
  6.       } 
  7.       // Prior to API 29 and to maintain compatibility with older versions of 
  8.       // ProcessLifecycleOwner (which may not be updated when lifecycle-runtime is updated and 
  9.       // need to support activities that don't extend from FragmentActivity from support lib), 
  10.       // use a framework fragment to get the correct timing of Lifecycle events 
  11.       android.app.FragmentManager manager = activity.getFragmentManager(); 
  12.       if (manager.findFragmentByTag(REPORT_FRAGMENT_TAG) == null) { 
  13.           manager.beginTransaction().add(new ReportFragment(), REPORT_FRAGMENT_TAG).commit(); 
  14.           // Hopefully, we are the first to make a transaction
  15.           manager.executePendingTransactions(); 
  16.       } 
  17.   } 

5、 LifecycleCallbacks.registerIn(activity)

LifecycleCallbacks 實(shí)現(xiàn)了 Application.ActivityLifecycleCallbacks接口,在SDK29以上的生命周期分發(fā)是由Application 分發(fā)的,activity注冊就能回調(diào)。

大名鼎鼎的LeakCanary在監(jiān)聽Activity生命周期,也是使用

  1. Application.ActivityLifecycleCallbacks。 
  2.     @RequiresApi(29) 
  3.     static class LifecycleCallbacks implements Application.ActivityLifecycleCallbacks { 
  4.         static void registerIn(Activity activity) { 
  5.             activity.registerActivityLifecycleCallbacks(new LifecycleCallbacks()); 
  6.         } 
  7.         ... 
  8.         @Override 
  9.         public void onActivityPostCreated(@NonNull Activity activity, 
  10.                 @Nullable Bundle savedInstanceState) { 
  11.             dispatch(activity, Lifecycle.Event.ON_CREATE); 
  12.         } 
  13.       ... 
  14.     } 

6、 ReportFragment.dispatch 版本兼容

如果SDK版本小于29,ReportFragment的各個(gè)生命周期方法里,會調(diào)用 dispatch 方法。

比如 onActivityCreated。

反正無論是使用 LifecycleCallbacks.registerIn(activity),還是 Fragment 的生命周期回調(diào),最后都會dispatch。

  1. @Override 
  2.    public void onActivityCreated(Bundle savedInstanceState) { 
  3.        super.onActivityCreated(savedInstanceState); 
  4.        dispatchCreate(mProcessListener); 
  5.        dispatch(Lifecycle.Event.ON_CREATE); 
  6.    } 
  7.    private void dispatch(@NonNull Lifecycle.Event event) { 
  8.        if (Build.VERSION.SDK_INT < 29) { 
  9.            // Only dispatch events from ReportFragment on API levels prior 
  10.            // to API 29. On API 29+, this is handled by the ActivityLifecycleCallbacks 
  11.            // added in ReportFragment.injectIfNeededIn 
  12.            dispatch(getActivity(), event); 
  13.        } 
  14.    } 
  15.    static void dispatch(@NonNull Activity activity, @NonNull Lifecycle.Event event) { 
  16.        if (activity instanceof LifecycleRegistryOwner) { 
  17.            ((LifecycleRegistryOwner) activity).getLifecycle().handleLifecycleEvent(event); 
  18.            return
  19.        } 
  20.        if (activity instanceof LifecycleOwner) { 
  21.            Lifecycle lifecycle = ((LifecycleOwner) activity).getLifecycle(); 
  22.            if (lifecycle instanceof LifecycleRegistry) { 
  23.                ((LifecycleRegistry) lifecycle).handleLifecycleEvent(event); 
  24.            } 
  25.        } 
  26.    } 

7、 Lifecycle.State

State只有5個(gè)但是生命周期可是不止5個(gè),所以Google他們設(shè)計(jì)時(shí),就創(chuàng)建流程正著走,銷毀流程就反正走。

  1. Lifecycle.State 
  2.     /* Lifecycle.State */ 
  3.     public enum State { 
  4.         DESTROYED, 
  5.         INITIALIZED, 
  6.         CREATED, 
  7.         STARTED, 
  8.         RESUMED; 
  9.         public boolean isAtLeast(@NonNull State state) { 
  10.             return compareTo(state) >= 0; 
  11.         } 
  12.     } 

8、 handleLifecycleEvent

LifecycleRegistryOwner 也是繼承 LifecycleOwner,所以他們最后都會執(zhí)行 LifecycleRegistry 的 handleLifecycleEvent 方法。

就是把 Lifecycle.Event處理一下,轉(zhuǎn)化成 Lifecycle.State

  1. /* Lifecycle.Event */ 
  2.       @NonNull 
  3.       public State getTargetState() { 
  4.           switch (this) { 
  5.               case ON_CREATE: 
  6.               case ON_STOP: 
  7.                   return State.CREATED; 
  8.               case ON_START: 
  9.               case ON_PAUSE: 
  10.                   return State.STARTED; 
  11.               case ON_RESUME: 
  12.                   return State.RESUMED; 
  13.               case ON_DESTROY: 
  14.                   return State.DESTROYED; 
  15.               case ON_ANY: 
  16.                   break; 
  17.           } 
  18.           throw new IllegalArgumentException(this + " has no target state"); 
  19.       } 
  20. Lifecycle.State 繼續(xù)往下傳,先用 mState 保存,再 sync 方法處理。 
  21.   /* LifecycleRegistry  */ 
  22.   public void handleLifecycleEvent(@NonNull Lifecycle.Event event) { 
  23.       enforceMainThreadIfNeeded("handleLifecycleEvent"); 
  24.       moveToState(event.getTargetState()); 
  25.   } 
  26.   private void moveToState(State next) { 
  27.       if (mState == next) { 
  28.           return
  29.       } 
  30.       //保存state狀態(tài) 
  31.       mState = next
  32.       if (mHandlingEvent || mAddingObserverCounter != 0) { 
  33.           mNewEventOccurred = true
  34.           // we will figure out what to do on upper level
  35.           return
  36.       } 
  37.       mHandlingEvent = true
  38.       sync(); 
  39.       mHandlingEvent = false
  40.   } 

9、 sync

這里利用上一個(gè)方法保存的mState,用于比較,判斷是正向執(zhí)行還是反向執(zhí)行生命周期

  1. /* LifecycleRegistry  */ 
  2.    private void sync() { 
  3.        //這是弱引用包裝過的LifecycleOwner  
  4.        LifecycleOwner lifecycleOwner = mLifecycleOwner.get(); 
  5.        if (lifecycleOwner == null) { 
  6.            throw new IllegalStateException("LifecycleOwner of this LifecycleRegistry is already" 
  7.                    + "garbage collected. It is too late to change lifecycle state."); 
  8.        } 
  9.        while (!isSynced()) { 
  10.            mNewEventOccurred = false
  11.            // no need to check eldest for nullability, because isSynced does it for us. 
  12.            //上一個(gè)方法保存的mState,跟組件之前的的mState對比 
  13.            if (mState.compareTo(mObserverMap.eldest().getValue().mState) < 0) { 
  14.                //返向執(zhí)行流程 
  15.                backwardPass(lifecycleOwner); 
  16.            } 
  17.            Map.Entry<LifecycleObserver, ObserverWithState> newest = mObserverMap.newest(); 
  18.            if (!mNewEventOccurred && newest != null 
  19.                    && mState.compareTo(newest.getValue().mState) > 0) { 
  20.                //正向執(zhí)行流程 
  21.                forwardPass(lifecycleOwner); 
  22.            } 
  23.        } 
  24.        mNewEventOccurred = false
  25.    } 

10、 forwardPass

反向的邏輯差不多,只是執(zhí)行 backwardPass ,先轉(zhuǎn)換Stata,最后執(zhí)行 observer.dispatchEvent。

這里又把 Lifecycle.State 轉(zhuǎn)回 Lifecycle.Event,然后給觀察者分發(fā)出去。

  1. /* Lifecycle.Event */ 
  2.      @Nullable 
  3.      public static Event upFrom(@NonNull State state) { 
  4.          switch (state) { 
  5.              case INITIALIZED: 
  6.                  return ON_CREATE; 
  7.              case CREATED: 
  8.                  return ON_START; 
  9.              case STARTED: 
  10.                  return ON_RESUME; 
  11.              default
  12.                  return null
  13.          } 
  14.      } 

轉(zhuǎn)換 Event.upFrom ,發(fā)送 observer.dispatchEvent。

  1. /* LifecycleRegistry  */ 
  2.   private void forwardPass(LifecycleOwner lifecycleOwner) { 
  3.       Iterator<Map.Entry<LifecycleObserver, ObserverWithState>> ascendingIterator = 
  4.               mObserverMap.iteratorWithAdditions(); 
  5.       while (ascendingIterator.hasNext() && !mNewEventOccurred) { 
  6.           Map.Entry<LifecycleObserver, ObserverWithState> entry = ascendingIterator.next(); 
  7.           ObserverWithState observer = entry.getValue(); 
  8.           while ((observer.mState.compareTo(mState) < 0 && !mNewEventOccurred 
  9.                   && mObserverMap.contains(entry.getKey()))) { 
  10.               pushParentState(observer.mState); 
  11.               //轉(zhuǎn)化 
  12.               final Event event = Event.upFrom(observer.mState); 
  13.               if (event == null) { 
  14.                   throw new IllegalStateException("no event up from " + observer.mState); 
  15.               } 
  16.               //發(fā)送 
  17.               observer.dispatchEvent(lifecycleOwner, event); 
  18.               popParentState(); 
  19.           } 
  20.       } 
  21.   } 

11、 發(fā)送生命周期狀態(tài)

ObserverWithState 發(fā)送出 Lifecycle.Event ,至此就結(jié)束了,有注冊訂閱關(guān)系的地方就能收到

  1. static class ObserverWithState { 
  2.       State mState; 
  3.       LifecycleEventObserver mLifecycleObserver; 
  4.       ObserverWithState(LifecycleObserver observer, State initialState) { 
  5.           mLifecycleObserver = Lifecycling.lifecycleEventObserver(observer); 
  6.           mState = initialState; 
  7.       } 
  8.       /* 分發(fā)生命周期狀態(tài) */ 
  9.       void dispatchEvent(LifecycleOwner owner, Event event) { 
  10.           State newState = event.getTargetState(); 
  11.           mState = min(mState, newState); 
  12.           mLifecycleObserver.onStateChanged(owner, event); 
  13.           mState = newState; 
  14.       } 
  15.   } 

原理比較清晰:Activity/Fragment實(shí)現(xiàn)LifecycleOwner接口,通過LifecycleRegistry在對應(yīng)生命周期分發(fā)事件Lifecycle.Event,回調(diào)到生命周期觀察者LifecycleObserver對應(yīng)訂閱方法

圖片

總結(jié)

Lifecycle還是有可取之處的,相對于其它架構(gòu)組件之間的配合,Lifecycle更簡單且獨(dú)立;

LifecycleObserver接口( Lifecycle觀察者):實(shí)現(xiàn)該接口的類,通過注解的方式,可以通過被LifecycleOwner類的addObserver(LifecycleObserver o)方法注冊,被注冊后,LifecycleObserver便可以觀察到LifecycleOwner的生命周期事件;

LifecycleOwner接口(Lifecycle持有者):實(shí)現(xiàn)該接口的類持有生命周期(Lifecycle對象),該接口的生命周期(Lifecycle對象)的改變會被其注冊的觀察者LifecycleObserver觀察到并觸發(fā)其對應(yīng)的事件;

Lifecycle(生命周期):和LifecycleOwner不同的是,LifecycleOwner本身持有Lifecycle對象,LifecycleOwner通過其Lifecycle getLifecycle()的接口獲取內(nèi)部Lifecycle對象;

State(當(dāng)前生命周期所處狀態(tài));

Event(當(dāng)前生命周期改變對應(yīng)的事件),當(dāng)Lifecycle發(fā)生改變,如進(jìn)入onCreate,會自動(dòng)發(fā)出ON_CREATE事件;

后面會陸續(xù)介紹一些官方架構(gòu)方面的知識點(diǎn);

本文轉(zhuǎn)載自微信公眾號「Android開發(fā)編程」

 

責(zé)任編輯:姜華 來源: Android開發(fā)編程
相關(guān)推薦

2021-09-09 06:55:43

AndroidViewDragHel原理

2021-09-07 06:40:25

AndroidLiveData原理

2024-08-30 10:40:12

2021-09-01 06:48:16

AndroidGlide緩存

2021-09-08 06:51:52

AndroidRetrofit原理

2021-10-15 09:19:17

AndroidSharedPrefe分析源碼

2021-08-12 16:28:10

AndroidHandleLooper

2021-05-17 09:50:06

Kubebuilde源碼CURD

2022-01-05 08:53:13

Spring原理分析MVC

2019-09-20 08:54:38

KafkaBroker消息

2021-02-22 21:49:33

Vue動(dòng)態(tài)組件

2021-08-05 20:39:34

AndroidKotlinStandard.kt

2021-11-26 17:17:43

Android廣播運(yùn)行原理源碼分析

2021-08-09 11:15:28

MybatisJavaSpring

2011-05-26 10:05:48

MongoDB

2021-09-02 07:00:01

Glide流程Android

2021-09-12 07:30:10

配置

2021-08-28 07:48:04

AndroidActivityRecActivitySta

2023-02-26 08:42:10

源碼demouseEffect

2012-09-20 10:07:29

Nginx源碼分析Web服務(wù)器
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號