LifeCycle源碼解讀

對于LifeCycle的簡單使用可以看上一篇文章:LiveData+ViewModel+Repository搭建MVVM

這篇文章主要是為了閱讀源碼,盡量深入閱讀,能力還是一般,見諒:

LifeCycle的作用

解決onCreate等生命周期方法,由于各種原因,后期越來越臃腫的問題。

關鍵類闡述

LifecycleRegistryOwner/LifecycleOwner

在Activity等組件生命周期發生變化的時候,發出相應的Event給LifecycleRegistry。

LifecycleRegistry

控制state的轉換、接受分發Event事件。

LifecycleObserver

通過注解綁定Event和自定義的函數,實現對生命周期的監聽并處理。

Event

@SuppressWarnings("WeakerAccess")
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
}
復制代碼

源碼分析

依賴庫版本:implementation "android.arch.lifecycle:extensions:1.1.1"

項目地址:github.com/fengqingxiu…

入口

getLifecycle().addObserver(new ActivityLifecycleObserver(getApplicationContext()));
復制代碼

進入addObserver

@Override
public void addObserver(@NonNull LifecycleObserver observer) { //這里的LifecycleObserver就是我們自定義的ActivityLifecycleObserverState initialState = mState == DESTROYED ? DESTROYED : INITIALIZED;//把帶著狀態的observer封裝成ObserverWithStateObserverWithState statefulObserver = new ObserverWithState(observer, initialState);ObserverWithState previous = mObserverMap.putIfAbsent(observer, statefulObserver);if (previous != null) {return;}LifecycleOwner lifecycleOwner = mLifecycleOwner.get();if (lifecycleOwner == null) {// it is null we should be destroyed. Fallback quicklyreturn;}boolean isReentrance = mAddingObserverCounter != 0 || mHandlingEvent;State targetState = calculateTargetState(observer);mAddingObserverCounter++;while ((statefulObserver.mState.compareTo(targetState) < 0&& mObserverMap.contains(observer))) {pushParentState(statefulObserver.mState);statefulObserver.dispatchEvent(lifecycleOwner, upEvent(statefulObserver.mState));popParentState();// mState / subling may have been changed recalculatetargetState = calculateTargetState(observer);}if (!isReentrance) {// we do sync only on the top level.sync();}mAddingObserverCounter--;
}
復制代碼

進入ObserverWithState

static class ObserverWithState {State mState;GenericLifecycleObserver mLifecycleObserver;ObserverWithState(LifecycleObserver observer, State initialState) {//通過不同的observer返回不同的mLifecycleObservermLifecycleObserver = Lifecycling.getCallback(observer);mState = initialState;}void dispatchEvent(LifecycleOwner owner, Event event) {State newState = getStateAfter(event);mState = min(mState, newState);mLifecycleObserver.onStateChanged(owner, event);mState = newState;}
}
復制代碼

進入getCallback

@NonNull
static GenericLifecycleObserver getCallback(Object object) {if (object instanceof FullLifecycleObserver) {return new FullLifecycleObserverAdapter((FullLifecycleObserver) object);}if (object instanceof GenericLifecycleObserver) {return (GenericLifecycleObserver) object;}final Class<?> klass = object.getClass();int type = getObserverConstructorType(klass);if (type == GENERATED_CALLBACK) {List<Constructor<? extends GeneratedAdapter>> constructors =sClassToAdapters.get(klass);if (constructors.size() == 1) {GeneratedAdapter generatedAdapter = createGeneratedAdapter(constructors.get(0), object);return new SingleGeneratedAdapterObserver(generatedAdapter);}GeneratedAdapter[] adapters = new GeneratedAdapter[constructors.size()];for (int i = 0; i < constructors.size(); i++) {adapters[i] = createGeneratedAdapter(constructors.get(i), object);}return new CompositeGeneratedAdaptersObserver(adapters);}return new ReflectiveGenericLifecycleObserver(object); //走到了這里
}
復制代碼

進入ReflectiveGenericLifecycleObserver

class ReflectiveGenericLifecycleObserver implements GenericLifecycleObserver {private final Object mWrapped;private final CallbackInfo mInfo;ReflectiveGenericLifecycleObserver(Object wrapped) {mWrapped = wrapped;mInfo = ClassesInfoCache.sInstance.getInfo(mWrapped.getClass());}@Overridepublic void onStateChanged(LifecycleOwner source, Event event) {mInfo.invokeCallbacks(source, event, mWrapped); //這里:通過反射實現事件分發}
}
復制代碼

那么是在哪里調用onStateChanged的呢?下面我們繼續分析:

LifecycleDispatcher

When initialized, it hooks into the Activity callback of the Application and observes Activities. It is responsible to hook in child-fragments to activities and fragments to report their lifecycle events. Another responsibility of this class is to mark as stopped all lifecycle providers related to an activity as soon it is not safe to run a fragment transaction in this activity.

第一次冷啟動App的時候會通過ActivityThread創建,并且之后會在Activity創建的時候,添加ReportFragment去實現生命周期事件的分發,下面看下源碼:

@SuppressWarnings("WeakerAccess")
@VisibleForTesting
static class DispatcherActivityCallback extends EmptyActivityLifecycleCallbacks {//省略...@Overridepublic void onActivityCreated(Activity activity, Bundle savedInstanceState) {if (activity instanceof FragmentActivity) {((FragmentActivity) activity).getSupportFragmentManager().registerFragmentLifecycleCallbacks(mFragmentCallback, true);}ReportFragment.injectIfNeededIn(activity); //這里添加了ReportFragment}//省略...
}
復制代碼

進入ReportFragment

@RestrictTo(RestrictTo.Scope.LIBRARY_GROUP)
public class ReportFragment extends Fragment {private static final String REPORT_FRAGMENT_TAG = "android.arch.lifecycle"+ ".LifecycleDispatcher.report_fragment_tag";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();}}static ReportFragment get(Activity activity) {return (ReportFragment) activity.getFragmentManager().findFragmentByTag(REPORT_FRAGMENT_TAG);}private ActivityInitializationListener mProcessListener;private void dispatchCreate(ActivityInitializationListener listener) {if (listener != null) {listener.onCreate();}}private void dispatchStart(ActivityInitializationListener listener) {if (listener != null) {listener.onStart();}}private void dispatchResume(ActivityInitializationListener listener) {if (listener != null) {listener.onResume();}}@Overridepublic void onActivityCreated(Bundle savedInstanceState) {super.onActivityCreated(savedInstanceState);dispatchCreate(mProcessListener);dispatch(Lifecycle.Event.ON_CREATE); //這里分發事件,我們自定義的觀察者定義的注解其實就是Lifecycle.Event.ON_CREATE這一類}@Overridepublic void onStart() {super.onStart();dispatchStart(mProcessListener);dispatch(Lifecycle.Event.ON_START);}@Overridepublic void onResume() {super.onResume();dispatchResume(mProcessListener);dispatch(Lifecycle.Event.ON_RESUME);}@Overridepublic void onPause() {super.onPause();dispatch(Lifecycle.Event.ON_PAUSE);}@Overridepublic void onStop() {super.onStop();dispatch(Lifecycle.Event.ON_STOP);}@Overridepublic void onDestroy() {super.onDestroy();dispatch(Lifecycle.Event.ON_DESTROY);// just want to be sure that we won't leak reference to an activitymProcessListener = null;}private void dispatch(Lifecycle.Event event) {Activity activity = getActivity();if (activity instanceof LifecycleRegistryOwner) {((LifecycleRegistryOwner) activity).getLifecycle().handleLifecycleEvent(event); //這里將事件分發交接給了LifecycleRegistryOwnerreturn;}if (activity instanceof LifecycleOwner) {Lifecycle lifecycle = ((LifecycleOwner) activity).getLifecycle();if (lifecycle instanceof LifecycleRegistry) {((LifecycleRegistry) lifecycle).handleLifecycleEvent(event); //這里將事件分發交接給了LifecycleRegistry}}}void setProcessListener(ActivityInitializationListener processListener) {mProcessListener = processListener;}interface ActivityInitializationListener {void onCreate();void onStart();void onResume();}
}
復制代碼

進入handleLifecycleEvent

/*** Sets the current state and notifies the observers.* <p>* Note that if the {@code currentState} is the same state as the last call to this method,* calling this method has no effect.** @param event The event that was received*/
public void handleLifecycleEvent(@NonNull Lifecycle.Event event) {State next = getStateAfter(event); //獲取下一個statemoveToState(next);
}
復制代碼

這里借用官方的一張圖(LifeCycle-States):

大概意思就是可以通過不同的Event知道不同的State。例如:當你的Event是ON_RESUME的時候就代表他當前的State是STARTED,所以Next State就是RESUMED,接著分析getStateAfter:

//對照著表其實很簡單,events是ON_CREATE和ON_STOP的下一個狀態指向都是CREATED,所以返回CREATED,其他的類似。
static State getStateAfter(Event event) {switch (event) {case ON_CREATE:case ON_STOP:return CREATED;case ON_START:case ON_PAUSE:return STARTED;case ON_RESUME:return RESUMED;case ON_DESTROY:return DESTROYED;case ON_ANY:break;}throw new IllegalArgumentException("Unexpected event value " + event);
}
復制代碼

所以getStateAfter獲取的是下一個State,也就是下一個生命周期。

進入moveToState

private void moveToState(State next) {//判斷當前State是不是等于我們上面獲取的if (mState == next) {return;}//不一樣則重新賦值mState = next;if (mHandlingEvent || mAddingObserverCounter != 0) {mNewEventOccurred = true;// we will figure out what to do on upper level.return;}mHandlingEvent = true;sync(); //同步mHandlingEvent = false;
}// happens only on the top of stack (never in reentrance),
// so it doesn't have to take in account parents
private void sync() {LifecycleOwner lifecycleOwner = mLifecycleOwner.get();if (lifecycleOwner == null) {Log.w(LOG_TAG, "LifecycleOwner is garbage collected, you shouldn't try dispatch "+ "new events from it.");return;}//當前的State和最早的State或最新的State進行比較,mObserverMap這個集合存放的是ObserverWithState,而ObserverWithState有我們的狀態。 while (!isSynced()) {mNewEventOccurred = false;// no need to check eldest for nullability, because isSynced does it for us.if (mState.compareTo(mObserverMap.eldest().getValue().mState) < 0) {backwardPass(lifecycleOwner); //繼承Activity走這里}Entry<LifecycleObserver, ObserverWithState> newest = mObserverMap.newest();if (!mNewEventOccurred && newest != null&& mState.compareTo(newest.getValue().mState) > 0) {forwardPass(lifecycleOwner); //繼承FramgentActivity走這里,因為Activity的子類SupportActivity實現了LifecycleOwner,而且SupportActivity是FragmentActivity的父類}}mNewEventOccurred = false;
}private void forwardPass(LifecycleOwner lifecycleOwner) {Iterator<Entry<LifecycleObserver, ObserverWithState>> ascendingIterator =mObserverMap.iteratorWithAdditions();//第一個while循壞遍歷我們存儲觀察者的集合while (ascendingIterator.hasNext() && !mNewEventOccurred) {Entry<LifecycleObserver, ObserverWithState> entry = ascendingIterator.next();ObserverWithState observer = entry.getValue();//第二個是要處理各個狀態經過的eventwhile ((observer.mState.compareTo(mState) < 0 && !mNewEventOccurred&& mObserverMap.contains(entry.getKey()))) {pushParentState(observer.mState);//upEvent返回所要經歷的Event,例如:當前是STARTED, 那么他的經過的Event就是ON_RESUMEobserver.dispatchEvent(lifecycleOwner, upEvent(observer.mState)); //在這里分發事件popParentState();}}
}private void backwardPass(LifecycleOwner lifecycleOwner) {Iterator<Entry<LifecycleObserver, ObserverWithState>> descendingIterator =mObserverMap.descendingIterator();//第一個while循壞遍歷我們存儲觀察者的集合while (descendingIterator.hasNext() && !mNewEventOccurred) {Entry<LifecycleObserver, ObserverWithState> entry = descendingIterator.next();ObserverWithState observer = entry.getValue();//第二個是要處理各個狀態經過的eventwhile ((observer.mState.compareTo(mState) > 0 && !mNewEventOccurred&& mObserverMap.contains(entry.getKey()))) {//downEvent返回下一個EventEvent event = downEvent(observer.mState);pushParentState(getStateAfter(event));//upEvent返回所要經歷的Event,例如:當前是STARTED, 那么他的經過的Event就是ON_RESUMEobserver.dispatchEvent(lifecycleOwner, event); //在這里分發事件popParentState();}}
}
復制代碼

進入dispatchEvent

static class ObserverWithState { //是不是很熟悉,又回到了這個類State mState;GenericLifecycleObserver mLifecycleObserver;ObserverWithState(LifecycleObserver observer, State initialState) {mLifecycleObserver = Lifecycling.getCallback(observer);mState = initialState;}void dispatchEvent(LifecycleOwner owner, Event event) {State newState = getStateAfter(event);mState = min(mState, newState);mLifecycleObserver.onStateChanged(owner, event); //最后在這里調用事件分發,并通過反射實現事件分發mState = newState;}
}
復制代碼

附上一個簡單的流程圖(圖片來源于參考文章)

參考文章

  • Android新組件Lifecycle詳解

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/277087.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/277087.shtml
英文地址,請注明出處:http://en.pswp.cn/news/277087.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Microsoft SQL Server 2005 Service Pack 2 已經可以下載

下載地址為http://www.microsoft.com/downloads/details.aspx?FamilyIDd07219b2-1e23-49c8-8f0c-63fa18f26d3a&DisplayLangzh-cn嘿嘿,這么快就SP2了 轉載于:https://www.cnblogs.com/lazerjulysky/archive/2007/03/04/663279.html

單點登錄(sso)入門

單點登錄的英文名叫做Single Sign On&#xff0c;簡稱SSO。 在以前&#xff0c;一般我們就單系統&#xff0c;所有的功能都在同一個系統上。 后來&#xff0c;我們為了合理利用資源和降低耦合性&#xff0c;于是把單系統拆分成多個子系統。 比如阿里系的淘寶和天貓&#xff0c;…

Cocopods的升級錯誤解決

2019獨角獸企業重金招聘Python工程師標準>>> 寫在前面&#xff1a; 這篇筆記的由來&#xff0c;是因為在這個周五下班后想起了之前 GitHub 上一個關于 iOS Charts 的 demo 仍處于未完待續的狀態。便想著完成了它&#xff0c;遂打開了該工程&#xff0c;開始用 pod 更…

XML 命名空間以及它們如何影響 XPath 和 XSLT (Extreme XML)

Dare Obasanjo Microsoft Corporation 2002 年 5 月 20 日 本文是有望長期發表的系列文章的第一篇&#xff0c;這些文章專門闡釋由 Microsoft 支持的 W3C XML 技術的更微妙的內容。盡管 XML 的核心仍相當簡單&#xff0c;但是圍繞它的技術已經變得日益復雜&#xff0c;而且其中…

帆軟報表(finereport)點擊事件對話框打開

點擊事件對話框打開iframe var iframe $("<iframe id001 name001 width100% height100% scrollingyes frameborder0>") // iframe參數的命名及寬高等iframe.attr("src", "http://192.168.100.17:8075/WebReport/ReportServer?reportlet1.cpt&…

部署虛擬環境

創建虛擬環境 導入Virtualenv虛擬環境模塊 pip install virtualenv python -m pip install virtualenv 創建虛擬環境 cd 項目文件夾 virtualenv 虛擬環境名 激活虛擬環境 cd 虛擬環境文件夾 運行 Scripts 目錄下的 activate 腳本 Scripts\activate 退出當前虛擬環境 Scripts\d…

走馬觀花:Visual Studio Code Name Orcas Mar07CTP /體驗DLINQ

不知道什么叫“Orcas”&#xff1f;簡單說應該就是下一版本的Visual Studio 吧。現在atlas&#xff0c;LINQ&#xff0c;WF之類東西&#xff0c;對于VS2005是單獨安裝的&#xff0c;Orcas應該是全內置吧。還有很多功能的增強&#xff0c;可以參考英文說明。閑話不說&#xff0c…

各種學習資源

C&#xff1a;http://huangdingjun.blog.163.com/ 網易博客 有好多關于C的博文 http://hi.baidu.com/dudiaodaoke/home獨釣刀客 vim&#xff1a;http://easwy.com/blog/ vim linux 牛人 http://www.swaroopch.com/notes/Vim_zh-cn:%E7%A8%8B%E5%BA%8F%E5%91%98%E7%9A%84%E7%BC…

智課雅思詞匯---二十六、形容詞后綴-ble

智課雅思詞匯---二十六、形容詞后綴-ble 一、總結 一句話總結&#xff1a; assemble 英 [?semb(?)l] 美 [?s?mbl] vt. 集合&#xff0c;聚集&#xff1b;裝配&#xff1b;收集vi. 集合&#xff0c;聚集[ 過去式 assembled 過去分詞 assembled 現在分詞 assembling ] 詞根詞…

[導入]C#實現Des加密和解密

文章來源:http://blog.csdn.net/21aspnet/archive/2007/03/24/1540018.aspx 轉載于:https://www.cnblogs.com/zhaoxiaoyang2/archive/2007/03/25/816385.html

帆軟報表(finereport)圖表鉆取詳細類別 當前頁對話框展示

添加參數欄&#xff0c;季度下拉框的控件命名為 jd 這里添加雷達圖做案例 編輯→特效→ 添加JavaScript 參數&#xff1a;wd 值&#xff1a;分類名 #取雷達圖所點擊的點 參數&#xff1a;jd 值&#xff1a;公式$jd #取參數下拉所選參數 JavaScript詳細: var if…

聊聊storm的PartialKeyGrouping

序 本文主要研究一下storm的PartialKeyGrouping 實例 Testpublic void testPartialKeyGrouping() throws InvalidTopologyException, AuthorizationException, AlreadyAliveException {String spoutId "wordGenerator";String counterId "counter";Strin…

ArcGIS Server安裝的幾個問題

今天安裝 了ArcGIS Server &#xff0c;本來一直不愿意裝這么“重”的東西&#xff0c;不過新事物還是要看看。安裝沒有出很大的問題&#xff0c;基本上一次成功&#xff0c;比很久前&#xff08;大概要到03年了吧&#xff09;第一次裝ArcIMS要好多了&#xff0c;那次可是重裝…

大數據之MySql筆記-0916

2019獨角獸企業重金招聘Python工程師標準>>> 復習: 1.MySQL部署 拓展題: rm -rf $MYSQL_HOME/arch/* binlog日志 恢復 主從同步 rm -rf $MYSQL_HOME/data/* 數據 $MYSQL_HOME/scripts/mysql_install_db \ --usermysqladmin \ --basedir/usr/local/mysql \ --dat…

delphi調用c#寫的webservice中文出現亂碼的問題

解決方法&#xff1a;HTTPRIO1的屬性---HttpWebNode--UseUtf8InHeader設置為true 代碼片斷&#xff1a; function TLoginManager.Get_LoginManagerSoap: ILoginManagerSoap; const defSvcLoginManager; defPrtLoginManagerSoap; var RIO: THTTPRIO; begin Result: nil…

浮浮沉沉的上海

來到上海已經快有一年&#xff0c;抱著學習的心態來的&#xff0c;卻發現忘掉了更多&#xff0c;最近一直在回顧&#xff0c;總想把冷卻的技能重新拾回來&#xff0c;卻也發現不簡單。剛剛從餐北斗辭職&#xff0c;也正如朋友所說&#xff0c;趁早走&#xff0c;再遲一點&#…

GridView的操作大全

一、GridView和DataGrid的異同 GridView 是 DataGrid的后繼控件&#xff0c;在.net framework 2 中&#xff0c;雖然還存在DataGrid&#xff0c;但是GridView已經走上了歷史的前臺&#xff0c;取代DataGrid的趨勢已是勢不可擋。GridView和DataGrid功能相似&#xff0c;都是在we…

Sql Server設置用戶只能查看并訪問特定數據庫

1.新建登錄用戶 以管理員身份登陸數據庫&#xff08;權限最高的身份如sa&#xff09;&#xff0c;點擊安全性->登錄名&#xff0c;右鍵新建登錄名&#xff0c;輸入登錄名和密碼&#xff0c;取消強制實施密碼策略。 2.將服務器角色設置為public 注意&#xff1a;很重要的一…

arcgis jsapi接口入門系列(6):樣式

2019獨角獸企業重金招聘Python工程師標準>>> symbol: function () {//線樣式//樣式詳情請看官方文檔let style {//線顏色&#xff0c;支持多種格式&#xff1a;//CSS color string&#xff1a;例如"dodgerblue";//HEX&#xff1a;例如"#33cc33"…

ORM(四)應用.腳本管理工具

ORM(四)應用.腳本管理工具數據腳本的維護,不知道各位有什么好的工具推薦沒有,由于以前一直是用手工來進行腳本的維護操作,很麻煩,而且容易出錯.大多數時候,都在原來的基礎上進行直接修改.今天有點時間就完成了一個簡陋的工具,也是對ORM組件的應用.下面是程序的運行界面http://f…