日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > Android >内容正文

Android

浅谈Android中Lifecycle

發布時間:2025/3/19 Android 29 豆豆
生活随笔 收集整理的這篇文章主要介紹了 浅谈Android中Lifecycle 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
首先確定如下幾個類并說明每個類的職責。?
  • 接口LifecycleOwner:生命周期持有者,代碼如下:

    其中google提供了接口LifecycleRegistryOwner繼承了LifecycleOwner

    具有生命周期的Activity、Fragment應該實現LifecycleRegistry并重寫getLifecycle()方法。

  • 抽象類Lifecycle主要具有添加觀察者addObserver()、移除觀察者removeObserver()功能

  • 抽象類LifecycleRegister繼承Lifecycle,重寫了addObserver()、removeObserver(),除此之外實現將Lifecycle.Event和State之間的轉換,并且狀態發生變化時,通知觀察者。

  • 一般使用Activity、Fragment繼承LifecycleRegistryOwner重寫getLifecyle(),方法示例如下:


    需要針對生命周期做出變化的類實現LifecycleObserver也就是觀察者,并通過LifecycleRegistry的addObserver()方法將觀察者添加到LifecycleRegistry中,其中紅框部分稍后分析,這里僅以Activity為例來分析Lifecycle的運作過程。啟動Activity調用棧如下所示:


    可以看到Activity啟動時,在ActivityThread類中installProvider方法中調用了ContentProvider的attchInfo方法,進而調用了LifecycleRuntimeTrojanProvider類的onCreate()方法,該方法如下所示

    跟進LifecycleDispatcher

    private static final String REPORT_FRAGMENT_TAG = "android.arch.lifecycle"+ ".LifecycleDispatcher.report_fragment_tag";private static AtomicBoolean sInitialized = new AtomicBoolean(false);static void init(Context context) {if (sInitialized.getAndSet(true)) {return;}((Application) context.getApplicationContext()).registerActivityLifecycleCallbacks(new DispatcherActivityCallback()); }復制代碼

    init方法只是將DispatherActivityCallback添加到Application存儲的map中去,繼續查看DispatcherActivityCallBack類

    static class DispatcherActivityCallback extends EmptyActivityLifecycleCallbacks {private final FragmentCallback mFragmentCallback;DispatcherActivityCallback() {mFragmentCallback = new FragmentCallback();}@Overridepublic void onActivityCreated(Activity activity, Bundle savedInstanceState) {if (activity instanceof FragmentActivity) {((FragmentActivity) activity).getSupportFragmentManager().registerFragmentLifecycleCallbacks(mFragmentCallback, true);}ReportFragment.injectIfNeededIn(activity);}@Overridepublic void onActivityStopped(Activity activity) {if (activity instanceof FragmentActivity) {markState((FragmentActivity) activity, CREATED);}}@Overridepublic void onActivitySaveInstanceState(Activity activity, Bundle outState) {if (activity instanceof FragmentActivity) {markState((FragmentActivity) activity, CREATED);}} }復制代碼

    經過斷點試驗發現當ThreadActivity執行performCreate方法時會調用DispatcherActivityCallback的onActivityCreated方法,該方法中會調用ReportFragment.injectIfNeedIn(activity),其中該activity即為實現了LifecycleRegistryOwner的對象,繼續更近ReportFragment代碼如下:

    public static void injectIfNeededIn(Activity activity) {// ProcessLifecycleOwner should always correctly work and some activities may not extend// FragmentActivity from support lib, so we use framework fragments for activitiesandroid.app.FragmentManager manager = activity.getFragmentManager();if (manager.findFragmentByTag(REPORT_FRAGMENT_TAG) == null) {manager.beginTransaction().add(new ReportFragment(), REPORT_FRAGMENT_TAG).commit();// Hopefully, we are the first to make a transaction.manager.executePendingTransactions();} }復制代碼

    從代碼可以看出相當于在activity中添加了一個沒有任何內容的Fragment,該Fragment用來監聽activity生命周期的變化并通知觀察者,利用Fragment應該是是因為Fragment的onCreate()、onStart()、onResume()方法均在其所在的Activity的相應的onCreate()、onStart()、onResume()方法之后執行,但是Fragment的onPause()、onStop()、onDestroy()均在所在Activit相應的onPause()、onStop()、onDestroy()之前執行,這一點兒很重要!

    當執行完畢Activity中的onCreate方法后,會執行ReportFragment方法中的onAcitivityCreate方法

    @Override public void onActivityCreated(Bundle savedInstanceState) {super.onActivityCreated(savedInstanceState);dispatchCreate(mProcessListener);dispatch(Lifecycle.Event.ON_CREATE); }復制代碼

    其中dispatch方法如下所示

    private void dispatch(Lifecycle.Event event) {if (getActivity() instanceof LifecycleRegistryOwner) {((LifecycleRegistryOwner) getActivity()).getLifecycle().handleLifecycleEvent(event);} }復制代碼

    這里個getActivity就是實現了第三張圖中實現LifecycleRegistryOwner的Activity,此處也應該注意被監聽生命周期變化的Activity應該繼承的是LifecycleRegisterOwner類,而不應該是LifecycleOwner。繼續跟進handleLifecycleEvent方法

    public void handleLifecycleEvent(Lifecycle.Event event) {if (mLastEvent == event) {return;}mLastEvent = event;mState = getStateAfter(event);for (Map.Entry<LifecycleObserver, ObserverWithState> entry : mObserverSet) {entry.getValue().sync();} }復制代碼

    只要mLastEvent!=event就會執行for循環,其中mObserverSet中的元素是在addObserver的時候添加的,如下所示

    @Override public void addObserver(LifecycleObserver observer) {ObserverWithState observerWithState = new ObserverWithState(observer);mObserverSet.putIfAbsent(observer, observerWithState);observerWithState.sync(); }復制代碼

    其中ObserverWithState對象對observer進行了封裝,

    ObserverWithState(LifecycleObserver observer) {mCallback = Lifecycling.getCallback(observer); }復制代碼

    ObserverWithState構造函數中調用了Lifecycleing.getCallback(observer)查看該方法(這里不再貼代碼)只是根據observer所在包名和類名通過反射構建出了一個“className”+"_LifecycleAdapter的類并調用該類的構造函數將observer作為參數傳遞給該類的實例,例如自己的demo中名為CustomLifecycleObser_LifeAdapter,該類在app/build/generated/source/apt/debug下,查看該類如下

    public class CustomLifecycleObserver_LifecycleAdapter implements GenericLifecycleObserver {final CustomLifecycleObserver mReceiver;CustomLifecycleObserver_LifecycleAdapter(CustomLifecycleObserver receiver) {this.mReceiver = receiver;}@Overridepublic void onStateChanged(LifecycleOwner owner, Lifecycle.Event event) {if (event == Lifecycle.Event.ON_CREATE) {mReceiver.onCreate(owner);}if (event == Lifecycle.Event.ON_START) {mReceiver.onStart(owner);}if (event == Lifecycle.Event.ON_RESUME) {mReceiver.onResume(owner);}if (event == Lifecycle.Event.ON_STOP) {mReceiver.onStop(owner);}if (event == Lifecycle.Event.ON_PAUSE) {mReceiver.onPause(owner);}if (event == Lifecycle.Event.ON_DESTROY) {mReceiver.onDestroy(owner);}mReceiver.onAny(owner,event);}public Object getReceiver() {return mReceiver;} }復制代碼

    注解處理器apt生成該類時會生成一個onStateChanged方法,并根據event調用observer中相應的方法,這些方法是observer中被onLifecycleEvent注解的方法,那onStateChanged方法在哪里被調用呢,例如上面的Activity的onCreate方法執行后會調用onActivityCreated方法,然后調用handleLifecycleEvent方法,該方法遍歷mObserverSet后調用sync方法,該方法如下所示

    void sync() {if (mState == DESTROYED && mObserverCurrentState == INITIALIZED) {mObserverCurrentState = DESTROYED;}while (mObserverCurrentState != mState) {Event event = mObserverCurrentState.isAtLeast(mState)? downEvent(mObserverCurrentState) : upEvent(mObserverCurrentState);mObserverCurrentState = getStateAfter(event);mCallback.onStateChanged(mLifecycleOwner, event);} }復制代碼


    當mState不等于mObserverCurrentState的時候就會進行兩種狀態的比較,其中返回的Event其實就是mObserverCurrentState過渡到mState時所需的Event詳見頭圖,例如mObserverCurrentState是INITIALIZED,而mState是CREATED的時候,這個時候然需要經過ON_CREATE事件后,mObserverCurrentState才可以過度到mState的狀態,進而更新mObserverState對應的狀態為mState,然后調用“className”+"_LifecycleAdapter的onStateChange方法,進而調用到觀察者中相應的方法。

    再說紅色方框中為啥要調用markState方法,因為Activity的onCreate方法要比Fragment的早,如果不手動調用的話mObserverCurrentState和mState都是INITIALIZED,進而不會執行

    mCallBack.onStateChanged方法。



    總結

    以上是生活随笔為你收集整理的浅谈Android中Lifecycle的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。