說到Activity生命周期是不是覺得很簡單,在各個生命周期方法中打下log不就知道執行的流程了。但是還是想知道這些生命周期方法是在哪兒,被誰調用的。So...<br />
這里我們接著上篇文章Activity啟動過程簡單記錄寫,因為里面記錄了從startActivity開始,AMS首先會執行當前正在顯示的Activity的pause流程,然后創建應用進程直到調用應用進程ApplicationThread的scheduleLaunchActivity執行真正的Activity的創建和顯示。所以這里就從scheduleLaunchActivity方法開始記錄整個流程。<br />
--數字 代表當前方法調用下一方法的代碼行號
-
ApplicationThread.scheduleLaunchActivity() AMS通過binder調用應用進程(ApplicationThread就是AMS用來和應用進程通信的接口),實際上最終想要調用的是ActivityThread中的方法(通過Handler對象mH). ApplicationThread中所有schedule***的方法最終都是在ActivityThread中對應的handle***方法中執行。如這里調用的就是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方法執行完成,回到handleLaunchActivity方法
-
ActivityThread.handleResumeActivity()
-
ActivityThread.performResumeActivity()
-
Activity.performResume()
-
Instrumentation.callActivityOnResume()
Activity.onResume()
Activity.onPostResume()
-
-
到這performResumeActivity執行完成,回到handleResumeActivity方法
接著會調用Activity的makeVisible方法,把decor添加到WindowManager顯示,這里不深入
接著執行Looper.myQueue().addIdleHandler(new Idler()),這個Idler會在主線程MessageQueue空閑時(比如說界面已經顯示完成)執行,這個Idler過會兒會用到
最后執行ActivityManagerNative.getDefault().activityResumed()告訴AMS啟動完成。其中AMS也只是通知activity所在的ActivityStack這個activity已經resumed,其它什么都沒做。
-
-
-
這里開始時比較奇怪,還以為執行上一次顯示的activity的stop流程會在這里開始,但是并沒有。回到剛才提到的Idler中,這時界面已經顯示完畢了。
-
ActivityThread.Idler.queueIdle()
IActivityManager am = ActivityManagerNative.getDefault();
if (a.activity != null && !a.activity.mFinished) {
am.activityIdle(a.token, a.createdConfig, stopProfiling);
}
可以看出,這里會告訴AMS activity已經空閑(?我的理解就是activity對應的decor已經添加到WMS中并且已經展示出來)了。
* `到這應用進程啟動activity就算完成了。接著看AMS的后續處理。`
* `ActivityManagerService.activityIdle() --6683`
* `ActivityStackSupervisor.activityIdleInternalLocked()`
* ```
找到處理stopping狀態的activity執行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);
}
}
}
```
* `這里只是普通的跳轉,不會執行finish.
ActivityStack.stopActivityLocked() --3291`
* `這里會判斷要執行stop操作的activity有木有FLAG_ACTIVITY_NO_HISTORY的flag,如果有執行finish流程。這里不走。`
* `ApplicationThread.scheduleStopActivity()
到這里AMS又通過binder調用要執行stop操作的activity所在進程(可能是剛才啟動的activity的進程也可能不是)。`
* `回到應用進程ActivityThread中的ApplicationThread。
ApplicationThread.scheduleStopActivity()`
* `ActivityThread.handleStopActivity()`
* `ActivityThread.performStopActivityInner()`
* `Activity.performStop()`
* `Instrumentation.callActivityOnStop()`
* `Activity.onStop()`
* ```
執行完onStop后回到handleStopActivity.
這里會post一個StopInfo的Runnable對象,用于通知AMS,activity已經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上執行返回操作,其實也就是調用finish方法
Activity.finishActivity(){
ActivityManagerNative.getDefault().finishActivity();
}
-
ActivityManagerService.finishActivity() --4894
-
ActivityStack.requestFinishActivityLocked() --3328
-
ActivityStack.finishActivityLocked() --3523 這一步中有個重要的操作是調用ActivityRecord.makeFinishingLocked()方法把這個ActivityRecord標記為finishing狀態,后面會用到
-
ActivityStack.startPausingLocked() --1141
-
ApplicationThread.schedulePauseActivity()
-
ActivityThread.handlePauseActivity()
-
ActivityThread.performPauseActivity()
-
ActivityThread.performPauseActivityIfNeeded()
-
Instrumentation.callActivityOnPause()
-
Activity.perfomrPause()
*Activity.onPause()
*ActivityManagerNative.getDefault().activityPaused()
-
-
-
-
-
-
-
-
-
在回到AMS中執行Activity已經pause完成的回調。
-
ActivityManagerService.activityPaused() --6919
-
ActivityStack.activityPausedLocked() --1212
-
ActivityStack.completePauseLocked()
這里先判斷ActivityRecord是否為finishing狀態,當前為true ActivityStack.finishCurrentActivityLocked() 方法內部也只是把這個Activity加入到mStackSupervisor.mStoppingActivities列表中,等下次AMS回調activityIdle時在執行stop流程。
-
ActivityStackSupervisor.resumeFocusedStackTopActivityLocked() --1830
-
ActivityStack.resumeTopActivityUncheckedLocked() --2127
ActivityStack.resumeTopActivityInnerLocked() --2527
ApplicationThread.scheduleResumeActivity() 執行到這AMS工作完成,輪到應用進程自己執行activity的resume操作。
-
-
-
到這又回到應用進程的ActivityThread招待handleResumeActivity()方法。因為前面記錄activity啟動過程時已經寫過這個方法的執行流程,這里就不在重新寫一遍了。唯一不同的是多了下面的執行restart的流程。
-
Activity.performResume() --6778
-
Activity.performRestart()
-
Instrumetation.callActivityOnRestart()
Activity.onRestart()
-
Activity.performStart()
-
Instrumetation.callActivityOnStart()
Activity.onStart()
-
-
-
還有一點點不一樣的地方就是執行完resume之后,調用Activity.makeVisible()不像之前啟動時把decor添加到WMS,僅僅是設置為VISIBLE. 后面的就和之前的一樣了,通過一個Idler調用AMS的activityIdle方法。直接拷貝之前的
-
ActivityManagerService.activityIdle() --6683
-
ActivityStackSupervisor.activityIdleInternalLocked()
-
找到處理stopping狀態的activity執行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狀態,所以執行的是finishCurrentActivityLocked.還要注意這會傳過去的mode參數為FINISH_IMMEDIATELY(立刻finish)。 ActivityStack.finishCurrentActivityLocked() --3597
* ActivityStack.destroyActivityLocked() --4020
* ApplicationThread.scheduleDestroyActivity()
-
到這又回到了應用進程的ActivityThread中。 ActivityThread.handleDestroyActivity()
-
ActivityThread.performDestroyActivity()
ActivityThread.performPauseActivityIfNeeded() 不執行,因為已經pause過了。
-
Activity.performStop() --6857
-
Instrumentation.callActivityStop() --1289
Activity.onStop()
-
-
Instrumentation.callActivityOnDestroy() --1153
-
Activity.performDestroy() --6884
Activity.onDestroy()
-
執行完performDestroyActivity后回到handleDestroyActivity,WindowManager調用removeViewImmediate(decorView)方法把activity顯示的view從WMS中刪除。
最后通知AMS我執行destroy完成。 ActivityManagerNative.getDefault().activityDestroyed(). ActivityManagerService的activityDestroyed方法也只是調用了下ActivityStack的activityDestroyedLocked方法。后面就沒什么東西了。。
-