Activity生命周期流程簡單記錄

說到Activity生命周期是不是覺得很簡單叉信,在各個生命周期方法中打下log不就知道執(zhí)行的流程了票渠。但是還是想知道這些生命周期方法是在哪兒我擂,被誰調(diào)用的。So...<br />
這里我們接著上篇文章Activity啟動過程簡單記錄寫,因為里面記錄了從startActivity開始,AMS首先會執(zhí)行當前正在顯示的Activity的pause流程李根,然后創(chuàng)建應(yīng)用進程直到調(diào)用應(yīng)用進程ApplicationThread的scheduleLaunchActivity執(zhí)行真正的Activity的創(chuàng)建和顯示。所以這里就從scheduleLaunchActivity方法開始記錄整個流程干发。<br />
--數(shù)字 代表當前方法調(diào)用下一方法的代碼行號

  • ApplicationThread.scheduleLaunchActivity() AMS通過binder調(diào)用應(yīng)用進程(ApplicationThread就是AMS用來和應(yīng)用進程通信的接口)朱巨,實際上最終想要調(diào)用的是ActivityThread中的方法(通過Handler對象mH). ApplicationThread中所有schedule***的方法最終都是在ActivityThread中對應(yīng)的handle***方法中執(zhí)行。如這里調(diào)用的就是handleLaunchActivity方法枉长。
    • ActivityThread.handleLaunchActivity()
      • ActivityThread.performLaunchActivity()
        • Instrumentation.newActivity()
        • Activity.attach() 第一個生命周期方法
        • Instrumentation.callActivityOnCreate()
          • Activity.performCreate()
            • Activity.onCreate() 第二個
        • Activity.performStart()
          • Instrumentation.callActivityOnStart()
            • Activity.onStart() 第三
        • Instrumentation.callActivityOnPostCreate()
          • Activity.onPostCreate() 第四
      • 到這performLaunchActivity方法執(zhí)行完成,回到handleLaunchActivity方法
      • ActivityThread.handleResumeActivity()
        • ActivityThread.performResumeActivity()
          • Activity.performResume()
            • Instrumentation.callActivityOnResume()
              • Activity.onResume()
            • Activity.onPostResume()
        • 到這performResumeActivity執(zhí)行完成,回到handleResumeActivity方法
        • 接著會調(diào)用Activity的makeVisible方法,把decor添加到WindowManager顯示,這里不深入
        • 接著執(zhí)行Looper.myQueue().addIdleHandler(new Idler()),這個Idler會在主線程MessageQueue空閑時(比如說界面已經(jīng)顯示完成)執(zhí)行冀续,這個Idler過會兒會用到
        • 最后執(zhí)行ActivityManagerNative.getDefault().activityResumed()告訴AMS啟動完成。其中AMS也只是通知activity所在的ActivityStack這個activity已經(jīng)resumed必峰,其它什么都沒做洪唐。
  • 這里開始時比較奇怪,還以為執(zhí)行上一次顯示的activity的stop流程會在這里開始吼蚁,但是并沒有凭需。回到剛才提到的Idler中肝匆,這時界面已經(jīng)顯示完畢了粒蜈。
  • ActivityThread.Idler.queueIdle()

IActivityManager am = ActivityManagerNative.getDefault();
if (a.activity != null && !a.activity.mFinished) {
am.activityIdle(a.token, a.createdConfig, stopProfiling);
}
可以看出,這里會告訴AMS activity已經(jīng)空閑(?我的理解就是activity對應(yīng)的decor已經(jīng)添加到WMS中并且已經(jīng)展示出來)了旗国。

* `到這應(yīng)用進程啟動activity就算完成了枯怖。接著看AMS的后續(xù)處理。`
* `ActivityManagerService.activityIdle() --6683`
    * `ActivityStackSupervisor.activityIdleInternalLocked()`
        * ```
找到處理stopping狀態(tài)的activity執(zhí)行stop操作
final ArrayList<ActivityRecord> stops = processStoppingActivitiesLocked(true);
        int NS = stops != null ? stops.size() : 0;
for (int i = 0; i < NS; i++) {
            r = stops.get(i);
            final ActivityStack stack = r.task.stack;
            if (stack != null) {
                if (r.finishing) {
                    stack.finishCurrentActivityLocked(r, ActivityStack.FINISH_IMMEDIATELY, false);
                } else {
                    stack.stopActivityLocked(r);
                }
            }
        }
          ```
        * `這里只是普通的跳轉(zhuǎn)能曾,不會執(zhí)行finish.
ActivityStack.stopActivityLocked() --3291`
            * `這里會判斷要執(zhí)行stop操作的activity有木有FLAG_ACTIVITY_NO_HISTORY的flag,如果有執(zhí)行finish流程度硝。這里不走。`
            * `ApplicationThread.scheduleStopActivity()
到這里AMS又通過binder調(diào)用要執(zhí)行stop操作的activity所在進程(可能是剛才啟動的activity的進程也可能不是)寿冕。`

* `回到應(yīng)用進程ActivityThread中的ApplicationThread蕊程。
ApplicationThread.scheduleStopActivity()`
    * `ActivityThread.handleStopActivity()`
        * `ActivityThread.performStopActivityInner()`
            * `Activity.performStop()`
                * `Instrumentation.callActivityOnStop()`
                    * `Activity.onStop()`
    * ```
執(zhí)行完onStop后回到handleStopActivity.
這里會post一個StopInfo的Runnable對象,用于通知AMS,activity已經(jīng)stop完成驼唱。
StopInfo info = new StopInfo();
 info.activity = r;
 info.state = r.state;
 info.persistentState = r.persistentState;
 mH.post(info);
    *  `ActivityManagerNative.getDefault().activityStopped()`
        * `ActivityManagerService.activityStopped()`
            * `ActivityStack.activityStoppedLocked()`
                * `OVER`

為了走通onFinish生命周期方法藻茂,這里我們模擬在剛剛啟動的activity上執(zhí)行返回操作,其實也就是調(diào)用finish方法

Activity.finishActivity(){
    ActivityManagerNative.getDefault().finishActivity();
}
  • ActivityManagerService.finishActivity() --4894

    • ActivityStack.requestFinishActivityLocked() --3328
      • ActivityStack.finishActivityLocked() --3523 這一步中有個重要的操作是調(diào)用ActivityRecord.makeFinishingLocked()方法把這個ActivityRecord標記為finishing狀態(tài),后面會用到
        • ActivityStack.startPausingLocked() --1141
          • ApplicationThread.schedulePauseActivity()
            • ActivityThread.handlePauseActivity()
              • ActivityThread.performPauseActivity()
                • ActivityThread.performPauseActivityIfNeeded()
                  • Instrumentation.callActivityOnPause()
                    • Activity.perfomrPause()
                      * Activity.onPause()
                      * ActivityManagerNative.getDefault().activityPaused()
  • 在回到AMS中執(zhí)行Activity已經(jīng)pause完成的回調(diào)捌治。

  • ActivityManagerService.activityPaused() --6919

    • ActivityStack.activityPausedLocked() --1212
      • ActivityStack.completePauseLocked()
        • 這里先判斷ActivityRecord是否為finishing狀態(tài),當前為true ActivityStack.finishCurrentActivityLocked() 方法內(nèi)部也只是把這個Activity加入到mStackSupervisor.mStoppingActivities列表中岗钩,等下次AMS回調(diào)activityIdle時在執(zhí)行stop流程。
        • ActivityStackSupervisor.resumeFocusedStackTopActivityLocked() --1830
          • ActivityStack.resumeTopActivityUncheckedLocked() --2127
            • ActivityStack.resumeTopActivityInnerLocked() --2527
            • ApplicationThread.scheduleResumeActivity() 執(zhí)行到這AMS工作完成肖油,輪到應(yīng)用進程自己執(zhí)行activity的resume操作兼吓。
  • 到這又回到應(yīng)用進程的ActivityThread招待handleResumeActivity()方法。因為前面記錄activity啟動過程時已經(jīng)寫過這個方法的執(zhí)行流程森枪,這里就不在重新寫一遍了视搏。唯一不同的是多了下面的執(zhí)行restart的流程。

  • Activity.performResume() --6778

    • Activity.performRestart()
      • Instrumetation.callActivityOnRestart()
        • Activity.onRestart()
      • Activity.performStart()
        • Instrumetation.callActivityOnStart()
          • Activity.onStart()
  • 還有一點點不一樣的地方就是執(zhí)行完resume之后县袱,調(diào)用Activity.makeVisible()不像之前啟動時把decor添加到WMS浑娜,僅僅是設(shè)置為VISIBLE. 后面的就和之前的一樣了,通過一個Idler調(diào)用AMS的activityIdle方法式散。直接拷貝之前的

  • ActivityManagerService.activityIdle() --6683

    • ActivityStackSupervisor.activityIdleInternalLocked()

找到處理stopping狀態(tài)的activity執(zhí)行stop操作
final ArrayList<ActivityRecord> stops = processStoppingActivitiesLocked(true);
int NS = stops != null ? stops.size() : 0;
for (int i = 0; i < NS; i++) {
r = stops.get(i);
final ActivityStack stack = r.task.stack;
if (stack != null) {
if (r.finishing) {
stack.finishCurrentActivityLocked(r, ActivityStack.FINISH_IMMEDIATELY, false);
} else {
stack.stopActivityLocked(r);
}
}
}
```
* 這里因為是finishing狀態(tài)筋遭,所以執(zhí)行的是finishCurrentActivityLocked.還要注意這會傳過去的mode參數(shù)為FINISH_IMMEDIATELY(立刻finish)。 ActivityStack.finishCurrentActivityLocked() --3597
* ActivityStack.destroyActivityLocked() --4020
* ApplicationThread.scheduleDestroyActivity()

  • 到這又回到了應(yīng)用進程的ActivityThread中暴拄。 ActivityThread.handleDestroyActivity()
    • ActivityThread.performDestroyActivity()
      • ActivityThread.performPauseActivityIfNeeded() 不執(zhí)行漓滔,因為已經(jīng)pause過了。
      • Activity.performStop() --6857
        • Instrumentation.callActivityStop() --1289
          • Activity.onStop()
      • Instrumentation.callActivityOnDestroy() --1153
        • Activity.performDestroy() --6884
          • Activity.onDestroy()
    • 執(zhí)行完performDestroyActivity后回到handleDestroyActivity乖篷,WindowManager調(diào)用removeViewImmediate(decorView)方法把activity顯示的view從WMS中刪除响驴。
    • 最后通知AMS我執(zhí)行destroy完成。 ActivityManagerNative.getDefault().activityDestroyed(). ActivityManagerService的activityDestroyed方法也只是調(diào)用了下ActivityStack的activityDestroyedLocked方法撕蔼。后面就沒什么東西了豁鲤。。
總結(jié):感覺寫了挺久的鲸沮,但是回頭看才這么點東西琳骡。。讼溺。而且大多都是代碼楣号。。肾胯。唉唉唉
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末竖席,一起剝皮案震驚了整個濱河市耘纱,隨后出現(xiàn)的幾起案子敬肚,更是在濱河造成了極大的恐慌,老刑警劉巖束析,帶你破解...
    沈念sama閱讀 207,113評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件艳馒,死亡現(xiàn)場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機弄慰,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,644評論 2 381
  • 文/潘曉璐 我一進店門第美,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人陆爽,你說我怎么就攤上這事什往。” “怎么了慌闭?”我有些...
    開封第一講書人閱讀 153,340評論 0 344
  • 文/不壞的土叔 我叫張陵别威,是天一觀的道長。 經(jīng)常有香客問我驴剔,道長省古,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 55,449評論 1 279
  • 正文 為了忘掉前任丧失,我火速辦了婚禮豺妓,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘布讹。我一直安慰自己琳拭,他們只是感情好,可當我...
    茶點故事閱讀 64,445評論 5 374
  • 文/花漫 我一把揭開白布炒事。 她就那樣靜靜地躺著臀栈,像睡著了一般。 火紅的嫁衣襯著肌膚如雪挠乳。 梳的紋絲不亂的頭發(fā)上权薯,一...
    開封第一講書人閱讀 49,166評論 1 284
  • 那天,我揣著相機與錄音睡扬,去河邊找鬼盟蚣。 笑死,一個胖子當著我的面吹牛卖怜,可吹牛的內(nèi)容都是我干的屎开。 我是一名探鬼主播,決...
    沈念sama閱讀 38,442評論 3 401
  • 文/蒼蘭香墨 我猛地睜開眼马靠,長吁一口氣:“原來是場噩夢啊……” “哼奄抽!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起甩鳄,我...
    開封第一講書人閱讀 37,105評論 0 261
  • 序言:老撾萬榮一對情侶失蹤逞度,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后妙啃,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體档泽,經(jīng)...
    沈念sama閱讀 43,601評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡俊戳,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,066評論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了馆匿。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片抑胎。...
    茶點故事閱讀 38,161評論 1 334
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖渐北,靈堂內(nèi)的尸體忽然破棺而出阿逃,到底是詐尸還是另有隱情,我是刑警寧澤赃蛛,帶...
    沈念sama閱讀 33,792評論 4 323
  • 正文 年R本政府宣布盆昙,位于F島的核電站,受9級特大地震影響焊虏,放射性物質(zhì)發(fā)生泄漏淡喜。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 39,351評論 3 307
  • 文/蒙蒙 一诵闭、第九天 我趴在偏房一處隱蔽的房頂上張望炼团。 院中可真熱鬧,春花似錦疏尿、人聲如沸瘟芝。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,352評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽锌俱。三九已至,卻和暖如春敌呈,著一層夾襖步出監(jiān)牢的瞬間贸宏,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,584評論 1 261
  • 我被黑心中介騙來泰國打工磕洪, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留吭练,地道東北人。 一個月前我還...
    沈念sama閱讀 45,618評論 2 355
  • 正文 我出身青樓析显,卻偏偏與公主長得像鲫咽,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子谷异,可洞房花燭夜當晚...
    茶點故事閱讀 42,916評論 2 344

推薦閱讀更多精彩內(nèi)容