AMS-啟動Activity之三
根據前面的介紹,當啟動一個新Activity時,系統將先行處理當前的Activity,即呼叫startPausingLocked()函式來
暫停當前Activity。
ActivityStack#startPausingLocked()
* 呼叫當前Activity所在程序的ActivityThread#schedulePauseActivity(...)
這個schedulePuaseActivity()會在binder執行緒中執行,最終主要邏輯在該程序的主執行緒中執行,即ActivityRecord prev = mResumedActivity; mPausingActivity = prev; //... prev.app.thead.schedulePuaseActivity(prev, prev.finishing,userLeaving, prev.configChangeFlags);
schedulePuaseActivity()中向主執行緒訊息佇列傳送PAUSE_ACTIVITY訊息,最終由handlePauseActivity
處理。
* 設定Pause超時,時間為500毫秒
mHandler.sendMessageDelayed(msg, PAUSE_TIMEOUT);
ActivityThread#handlePauseActivity(IBindler token, boolean finished, boolean userLeaving, int configChanges)
* 呼叫Activity的onPause
performPauseActivity(token,finished, r.isoreHoneycomb())
* 呼叫AMS的activityPause函式,activityPause呼叫ActivityStack#activityPause()
ActivityManagerNative.getDefault().activityPause();
ActivityStack#activityPause(IBinder token, boolean timeout)
* 移除超時訊息PAUSE_TIMEOUT_MSG
* 呼叫completePauseLocked,完成pause Activity最後一步,並呼叫resumeTopActivityLocked啟動目標Activity
ActivityStack#completePauseLocked()
* 將剛才被pause的Activity儲存到mStoppingActivities中
* 啟動目標Activity
if(!mService.isSleeping()) resumeTopActivittyLocked(prev);
由圖中可知,此次目標Activity resume後(走完了onResume),被pause的Activity才剛走完onPause。
那onStop在哪裡呼叫,之前的文章說了,目標程序的主執行緒訊息佇列沒有其他訊息時,回去處理Idler,
resume之前一直都會有很多訊息的,在resume後,很快會有機會處理Idler,最終會去到ActivityStack#
actvityIdleIternal,它將會為mStopingActivities中的成員呼叫stopActivityLocked()。
ActivityStack#stopActivityLocked(ActivityRecord r)
r.state = ActivitySate.STOPPING;
r.app.thread.scheduleStopActivity(r, r.visible, r.configChangeFlags);
如前面的launchActivity和pauseActivity一樣,最終會去到應用程序的主執行緒中。
scheduleStopActivity(...)將根據visible情況,向主執行緒訊息迴圈傳送H.STOP_ACTIVITY_HIDE
或H.STOP_ACTIVITY_SHOW訊息。不論哪種情況,最終都由handleStopActivity來處理。
ActivityStack#stopActivityLocked並沒有設定超時。
總結一下啟動Activity的三篇文章:
1.首先利用am start命令,發起本次目標Activity的啟動請求
2.進入ActivityServiceService和ActivityStack這兩個核心類。對於啟動Activity來說,
這流程可以細分為兩個階段。第一個階段的主要工作就是根據啟動模式和啟動
標誌找到或建立ActivityRecord及對應的TaskRecord;第二個階段工作是處理
Activity啟動或切換相關工作。
3.討論了目標程序中直接建立目標程序並執行Activity的流程,其中涉及目標程序的建立,目標
程序中Android執行環境的初始化,目標Activity的建立以及onCreate、onStart、onResume
等其生命週期中重要的函式的呼叫
4.討論了AMS先暫停當前Activity,然後再建立目標程序並執行Activity的流程。其中牽扯到兩個
應用程序和AMS的互動