Activity 中mParent 成員變量是如何被賦值的。 - CSDN博客
Android 視圖渲染過程的源碼分析 - CSDN博客
android系統啟動框架、Activity界面顯示過程詳解 - snow_flower - 博客園
Android源碼之Activity從啟動到顯示到界面 - 阿里云
以下的源碼都是API26.
?context的初始化過程:https://www.jianshu.com/p/7d4b605f5060
????????----------------------------------------------------------------------------------------------------------------------------------------------
? ? ? ??系統級別的Context實例化過程:
????????SystemServer的run方法中,調用createSystemContext方法
????????
????????1)systemMain方法
? ? ? ? 通過ActivityThread的systemMain方法創建了一個系統級別的ActivityThread
????????
????????調用activityThread的attach方法,傳入true。
????????該方法創建了application并調用了onCreate方法。
? ? ? ?
? ? ? 2)getSystemContext()
? ? ??
? ? ?
? ? ? 以上是系統級別的context實例化過程,為了弄清activity這個context是如何實例化的,就得研究一下activity的啟動過程。https://blog.csdn.net/qq_23547831/article/details/51224992
? ? ??需要注意的是activity,service啟動activity的過程都各不一樣,activity復寫了startActivity方法,service直接調用了父類的方法。
? ? ?activity之所以要復寫startActivity方法,是為了復用activity獨有的startActivityForResult方法。
? ? ??最終都會調用到Instrumentation的啟動activity方法,再調用ActivityManagerNative
? ? ??
? ? ?
????????
????????
?很明顯,啟動activity使用了binder。
????這個"activity"為key的service是何時添加的呢?
? ??我嘗試著在SystemServer里找,但是沒有找到。在ActivityManagerService自身的代碼里找到。而setSystemProcess在SystemServer里被調用。
? ? ? ?
?????
? ??
ActivityManagerService的實例是怎么創建出來的呢?

?
?
? ? ?
上面根據字節碼反射創建了service的實例,實例實際是ActivityManagerService的內部類:Lifecycle.
??

調用了
getService方法得到了真正的ActivityManagerService.

? 調用了service的onStart方法。
??
? 上面說了這么多,關于ActivityManagerService創建的過程。? ? ??
? 但是疑問尚在:
? 1)activity怎么就具備了context的特性了,它也沒有new,怎么使之成為一個context。
? 2)startActivity怎么android系統就會彈出一個界面
?前面
?開啟activity,最終會通過Binder機制(數據傳輸機制比較麻煩,后面研究)跨進程調用
? ActivityManagerServcie的startActivityAsUser方法:

繼而調用ActivityStarter的startActivityMayWait方法

在方法中又會調用到startActivityLocked方法

方法最后會調用到?startActivityUnchecked方法

最終調用了ActivityStack的startActivityLocked方法:
?
注意下面這部分代碼,不同版本的源碼會有很大的區別。
?
1)首先判斷開啟的activity是否是新任務,分別做不同的處理。

? 2)主要是調用WindowManager
? ? ***準備事務
? ? ***添加token

調用WindowManagerService的H來發送消息

注意ensureActivitiesVisibleLocked這個方法

接著方法調用順序:
??makeVisibleAndRestartIfNeeded (ActivityStack)
??startSpecificActivityLocked (ActivityStackSupervisor)
??realStartActivityLocked?(ActivityStackSupervisor)
? 此方法內部會調用?app.thread.scheduleLaunchActivity,這個app.thread是IApplicationThread類的實例,具體的子類是哪個呢?
? 下面的源碼為API26
? app即Proce***ecord類

? 在里面搜索thread的set方法:
??
? makeActive點擊發現有2處引用:
? 引用1:
? ?
??
? ?
??
??
? 引用2:
??
? 找到上一個調用的地方

?
??
?
? 由上面的分析可知:app.thread的thread是ActivityThread
? 下面看它的scheduleLaunchActivity方法,看它是如何啟動Activity的:
? ?1)發送消息給H這個Handler
? ?
? ?注意這個r變量,在后面有關Activity渲染繪制的源碼中會用到。
?2)handler的處理
? ?
??
? ?實例化了Activity的對象:
? ?
? 通過Instrumentation的newActivity方法創建了Activity的實體:
??
??
?嘗試創建Application
?
???
下面的代碼說明了Application只存在一個實例。

? 接著看performLaunchActivity方法:
??
?
?
?將ContextImpl對象通過Activity的attach方法傳入到Activity
?


最后這個也說明了ContextWrapper里的mBase是對ContextImpl。
看官方對ContextWrapper類解釋:

英文的意思是說ContextWrapper是對Context的一種代理實現。
#Activity的onCreate方法回調


下面我們來細摳Activity的onCreate方法:
@MainThread
@CallSuper
protected?void?onCreate(@Nullable?Bundle?savedInstanceState)?{
????if?(DEBUG_LIFECYCLE)?Slog.v(TAG,?"onCreate?"?+?this?+?":?"?+?savedInstanceState);
????if?(getApplicationInfo().targetSdkVersion?>?O?&&?mActivityInfo.isFixedOrientation())?{
????????final?TypedArray?ta?=?obtainStyledAttributes(com.android.internal.R.styleable.Window);
????????final?boolean?isTranslucentOrFloating?=?ActivityInfo.isTranslucentOrFloating(ta);
????????ta.recycle();
????????if?(isTranslucentOrFloating)?{
????????????throw?new?IllegalStateException(
????????????????????"Only?fullscreen?opaque?activities?can?request?orientation");
????????}
????}
????if?(mLastNonConfigurationInstances?!=?null)?{
????????mFragments.restoreLoaderNonConfig(mLastNonConfigurationInstances.loaders);
????}
????if?(mActivityInfo.parentActivityName?!=?null)?{
????????if?(mActionBar?==?null)?{
????????????mEnableDefaultActionBarUp?=?true;
????????}?else?{
????????????mActionBar.setDefaultDisplayHomeAsUpEnabled(true);
????????}
????}
????if?(savedInstanceState?!=?null)?{
????????mAutoFillResetNeeded?=?savedInstanceState.getBoolean(AUTOFILL_RESET_NEEDED,?false);
????????mLastAutofillId?=?savedInstanceState.getInt(LAST_AUTOFILL_ID,
????????????????View.LAST_APP_AUTOFILL_ID);
????????if?(mAutoFillResetNeeded)?{
????????????getAutofillManager().onCreate(savedInstanceState);
????????}
????????Parcelable?p?=?savedInstanceState.getParcelable(FRAGMENTS_TAG);
????????mFragments.restoreAllState(p,?mLastNonConfigurationInstances?!=?null
??????????????????mLastNonConfigurationInstances.fragments?:?null);
????}
????mFragments.dispatchCreate();
????getApplication().dispatchActivityCreated(this,?savedInstanceState);
????if?(mVoiceInteractor?!=?null)?{
????????mVoiceInteractor.attachActivity(this);
????}
????mCalled?=?true;
}?mFragments.dispatchCreate() :將onCreate事件分發給fragment,至于具體怎么分發的,后面再研究。
?getApplication().dispatchActivityCreated(this, savedInstanceState) :這個方法是將activity的生命周期方法回調給Application
?
? ? ? ?
? ? ? ? 在Application里即可利用這2個方法來監聽activity的狀態:
? ? ? ??
????????這樣,不需要通過廣播,就能監聽到Activity的生命周期方法了。(所以不閱讀源碼,很多好用的東西發現不了?。?/p>
?Activity的onCreate方法里會有一個mCalled變量,來判斷程序員復寫onCreate方法是否調用了super.onCreate方法。
????????緊接著onCreate,又調用了onStart等其它的生命周期方法。
? ? ? ? 所以Activity初始創建的生命周期方法調用順序是:
attach
onCreate
onStart
? ? ? 上面我們的注重點在于activity是如何實例化的,下面來研究一下UI方面的:Activity是怎么彈出并展示到我們的眼前的呢?
? ? ? 請看??Android源碼個個擊破之Activity的渲染過程
??
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。