1. 程式人生 > >AMS-啟動Activity之三

AMS-啟動Activity之三

                 

根據前面的介紹,當啟動一個新Activity時,系統將先行處理當前的Activity,即呼叫startPausingLocked()函式來

暫停當前Activity。

ActivityStack#startPausingLocked()

* 呼叫當前Activity所在程序的ActivityThread#schedulePauseActivity(...)

ActivityRecord prev = mResumedActivity;

mPausingActivity = prev;

//...

prev.app.thead.schedulePuaseActivity(prev, prev.finishing,userLeaving, prev.configChangeFlags);
這個schedulePuaseActivity()會在binder執行緒中執行,最終主要邏輯在該程序的主執行緒中執行,即

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的互動