1. 程式人生 > 程式設計 >通過例項解析android Activity啟動過程

通過例項解析android Activity啟動過程

注:只是說明啟動activity的過程(ActivityThread如何與ActivityManagerService簡稱AmS進行程序間通訊呼叫全過程),不解析android從zygote(受精卵)到整個系統服務的啟動

具體來講,啟動activity的方式有以下幾種:

  • 在應用程式中startActivity()或startActivityForResult()方法啟動指定activity
  • 在HOME(桌面)程式中單擊應用圖示,啟動新的activity
  • 按"BACK"鍵結束當前activity,自動啟動上一個activity
  • 長按“Home”鍵,顯示出當前任務列表,從中選擇一個啟動。

先分析第2種方式

android的HOMe桌面程式(launcher)是android系統啟動的第一個應用程式,其他的應用程式安裝後,會在launcher上建立一個快捷圖示,我們點選桌面上的快捷圖示就會啟動相應的app

桌面程式Launcher.java(原始碼基於4.2.2,我沒有下載4.2.2,參考網上原始碼)

在android4.0\packages\apps\Launcher2\src\com\android\launcher2

當點選一個應用圖示時會執行一連串流程

-》Launcher.onClick(View v)單擊app圖示

-》Launcher.startActivitySafely(v,intent,tag)這裡比4.0多的一個引數,可能效能優化吧

-》Launcher.startActivity(v,tag)

-》Activity.startActivity(intent,opts.toBundle())

-》Activity.startActivityForResult(intent,-1,options);

到這裡直接跳轉到第一個問題上來了(直接分析第一個就可以解決第二個)

第4種方式---長按“Home”鍵,顯示出當前任務列表,從中選擇一個啟動

流程:

 public static final int KEYCODE_HOME      = 3;
PhoneWindowManager.interceptKeyBeforeDispatching()處理長按home事件
showRecentAppsDialog();//彈出近期任務的對話方塊 
RecentApplicationsDialog.onclick.getContext().startActivity(intent);//到這裡流程就相同了

這個呼叫的其實也是第1種的startActivity()。所以1,2,4可以用相同處理流程解析,在後面接紹第1中方式處理流程-----fly

第3種方式(原理與第1種大致相同)

假設一個app,ActivityA啟動ActivityB,然後ActivityB按下"BACK"鍵其實執行的是activity的finish()方法

簡單流程:

ActivityB.finish()
Activity.finish()
ActivityManagerNative.getDefault().finishActivity()
ActivityManagerService.finishActivity()
ActivityStack.requestFinishActivityLocked()
ActivityStack.finishActivityLocked()
ActivityStack.startPausingLocked()

ActivityB向AmS傳送finish()請求

// If the activity is PAUSING,we will complete the finish once
// it is done pausing; else we can just directly finish it here.

上面解釋。AmS會先會在ActivityStack.finishActivityLocked()方法中檢查我們要finish的activity的狀態是否處於pause狀態,如果是將直接執行finish操作,否則,必須先執行startPausingLocked()---這裡終點是resume恢復上一個ActivityA,將A顯示在前臺視窗

IApplicationThread.schedulePauseActivity()
ActivityThread.schedulePauseActivity()
ActivityThread.sendMessage()
ActivityThread.H.sendMessage()
ActivityThread.H.handleMessage()
ActivityThread.handlePauseActivity()
ActivityThread.performPauseActivity()
Instrumentation.callActivityOnPause()
Activity.performPause()
Activity.onPause()
ActivityManagerNative.getDefault().activityPaused()
ActivityManagerService.activityPaused()
ActivityStack.activityPausedLocked()
ActivityStack.completePauseLocked()

接上面,AmS通知當前ActivityB進入Paused狀態,當ActivityB進入paused狀態後即Activity.onPause()方法執行完後,通知AmS我已經執行完pause操作。於是AmS就準備要在ActivityB所在的程序和任務中恢復ActivityA了;

ActivityStack.resumeTopActivityLocked()
ActivityStack.resumeTopInnerLocked()
IApplicationThread.scheduleResumeActivity()
ActivityThread.scheduleResumeActivity()
ActivityThread.sendMessage()
ActivityTherad.H.sendMessage()
ActivityThread.H.handleMessage()
ActivityThread.H.handleResumeActivity()
Activity.performResume()
Activity.performRestart()
Instrumentation.callActivityOnRestart()
Activity.onRestart()
Activity.performStart()
Instrumentation.callActivityOnStart()
Activity.onStart()
Instrumentation.callActivityOnResume()
Activity.onResume()

到這裡activityA已經啟動起來了,但是ActivityB還沒有被finish掉,在ActivityThread.H.handleResumeActivity中會

呼叫Looper.myQueue().addIdleHandler(new Idler()) 這個方法實現ActivityB的最終銷燬操作

Looper.myQueue().addIdleHandler(new Idler())
ActivityManagerNative.getDefault().activityIdle()
ActivityManagerService.activityIdle()
ActivityStackSupervisor.activityIdleInternalLocked()
ActivityStack.destroyActivityLocked()
IApplicationThread.scheduleDestoryActivity()
ActivityThread.scheduleDestoryActivity()
ActivityThread.sendMessage()
ActivityThread.H.sendMessage()
ActivityThread.H.handleMessage()
ActivityThread.handleDestoryActivity()
ActivityThread.performDestoryActivity()
Activity.performStop()
Instrumentation.callActivityOnStop()
Activity.onStop()
Instrumentation.callActivityOnDestory()
Activity.performDestory()
Acitivity.onDestory()
ActivityManagerNative.getDefault().activityDestoryed()
ActivityManagerService.activityDestoryed()
ActivityStack.activityDestoryedLocked()

這就是finish()的全部流程了(具體與WindowsManagerService的互動以後再補充)

第1種方式--ActivityA啟動ActivityB為例

從startActivity()開始分析。

簡單流程(有時間完整過一遍原始碼)

Activity.startActivity
Activity.startActivityForResult
Instrumentation.execStartActivity
ActivityManagerProxy.startActivity
ActivityManagerService.startActivity
ActivityStack.startActivityMayWait
ActivityStack.startActivityLocked
ActivityStack.startActivityUncheckedLocked
ActivityStack.resumeTopActivityLocked
ActivityStack.startPausingLocked
ApplicationThreadProxy.schedulePauseActivity
ApplicationThread.schedulePauseActivity
ActivityThread.queueOrSendMessage
H.handleMessage
ActivityThread.handlePauseActivity
ActivityManagerProxy.activityPaused
ActivityManagerService.activityPaused
ActivityStack.activityPaused
ActivityStack.completePauseLocked
ActivityStack.resumeTopActivityLokced
ActivityStack.startSpecificActivityLocked
ActivityStack.realStartActivityLocked
ApplicationThreadProxy.scheduleLaunchActivity
ApplicationThread.scheduleLaunchActivity
ActivityThread.queueOrSendMessage
H.handleMessage
ActivityThread.handleLaunchActivity
ActivityThread.performLaunchActivity
AcitiviyB.onCreate

要檢視ActivityManagerNative.java,ActivityManagerProxy.java,ActivityManagerService,還有binder關係看一張圖就可以了

通過例項解析android Activity啟動過程

從圖中可以看出代理類:使用ActivityManagerProxy代理類,來代理ActivityManagerNative類的子類ActivityManagerService;

所以執行請求都是傳遞到ActivityManagerService進行處理

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支援我們。