通過實(shí)例解析android Activity啟動過程
注:只是說明啟動activity的過程(ActivityThread如何與ActivityManagerService簡稱AmS進(jìn)行進(jìn)程間通信調(diào)用全過程),不解析android從zygote(受精卵)到整個系統(tǒng)服務(wù)的啟動
具體來講,啟動activity的方式有以下幾種:
在應(yīng)用程序中startActivity()或startActivityForResult()方法啟動指定activity 在HOME(桌面)程序中單擊應(yīng)用圖標(biāo),啟動新的activity 按'BACK'鍵結(jié)束當(dāng)前activity,自動啟動上一個activity 長按“Home”鍵,顯示出當(dāng)前任務(wù)列表,從中選擇一個啟動。先分析第2種方式
android的HOMe桌面程序(launcher)是android系統(tǒng)啟動的第一個應(yīng)用程序,其他的應(yīng)用程序安裝后,會在launcher上創(chuàng)建一個快捷圖標(biāo),我們點(diǎn)擊桌面上的快捷圖標(biāo)就會啟動相應(yīng)的app
桌面程序Launcher.java(源碼基于4.2.2,我沒有下載4.2.2,參考網(wǎng)上源碼)
在android4.0packagesappsLauncher2srccomandroidlauncher2
當(dāng)點(diǎn)擊一個應(yīng)用圖標(biāo)時(shí)會執(zhí)行一連串流程
-》Launcher.onClick(View v)單擊app圖標(biāo)
-》Launcher.startActivitySafely(v,intent,tag)這里比4.0多的一個參數(shù),可能性能優(yōu)化吧
-》Launcher.startActivity(v, intent,tag)
-》Activity.startActivity(intent,opts.toBundle())
-》Activity.startActivityForResult(intent,-1,options);
到這里直接跳轉(zhuǎn)到第一個問題上來了(直接分析第一個就可以解決第二個)
第4種方式---長按“Home”鍵,顯示出當(dāng)前任務(wù)列表,從中選擇一個啟動
流程:
public static final int KEYCODE_HOME = 3;PhoneWindowManager.interceptKeyBeforeDispatching()處理長按home事件showRecentAppsDialog();//彈出近期任務(wù)的對話框 RecentApplicationsDialog.onclick.getContext().startActivity(intent);//到這里流程就相同了
這個調(diào)用的其實(shí)也是第1種的startActivity()。所以1,2,4可以用相同處理流程解析,在后面接紹第1中方式處理流程-----fly
第3種方式(原理與第1種大致相同)
假設(shè)一個app,ActivityA啟動ActivityB,然后ActivityB按下'BACK'鍵其實(shí)執(zhí)行的是activity的finish()方法
簡單流程:
ActivityB.finish() Activity.finish() ActivityManagerNative.getDefault().finishActivity() ActivityManagerService.finishActivity() ActivityStack.requestFinishActivityLocked() ActivityStack.finishActivityLocked() ActivityStack.startPausingLocked()
ActivityB向AmS發(fā)送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的狀態(tài)是否處于pause狀態(tài),如果是將直接執(zhí)行finish操作,否則,必須先執(zhí)行startPausingLocked()---這里終點(diǎn)是resume恢復(fù)上一個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通知當(dāng)前ActivityB進(jìn)入Paused狀態(tài),當(dāng)ActivityB進(jìn)入paused狀態(tài)后即Activity.onPause()方法執(zhí)行完后,通知AmS我已經(jīng)執(zhí)行完pause操作。于是AmS就準(zhǔn)備要在ActivityB所在的進(jìn)程和任務(wù)中恢復(fù)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已經(jīng)啟動起來了,但是ActivityB還沒有被finish掉,在ActivityThread.H.handleResumeActivity中會
調(diào)用Looper.myQueue().addIdleHandler(new Idler()) 這個方法實(shí)現(xiàn)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的交互以后再補(bǔ)充)
第1種方式--ActivityA啟動ActivityB為例
從startActivity()開始分析。
簡單流程(有時(shí)間完整過一遍源碼)
Activity.startActivityActivity.startActivityForResultInstrumentation.execStartActivityActivityManagerProxy.startActivityActivityManagerService.startActivityActivityStack.startActivityMayWaitActivityStack.startActivityLockedActivityStack.startActivityUncheckedLockedActivityStack.resumeTopActivityLockedActivityStack.startPausingLockedApplicationThreadProxy.schedulePauseActivityApplicationThread.schedulePauseActivityActivityThread.queueOrSendMessageH.handleMessageActivityThread.handlePauseActivityActivityManagerProxy.activityPausedActivityManagerService.activityPausedActivityStack.activityPausedActivityStack.completePauseLockedActivityStack.resumeTopActivityLokcedActivityStack.startSpecificActivityLockedActivityStack.realStartActivityLockedApplicationThreadProxy.scheduleLaunchActivityApplicationThread.scheduleLaunchActivityActivityThread.queueOrSendMessageH.handleMessageActivityThread.handleLaunchActivityActivityThread.performLaunchActivityAcitiviyB.onCreate
要查看ActivityManagerNative.java,ActivityManagerProxy.java,ActivityManagerService,還有binder關(guān)系看一張圖就可以了
從圖中可以看出代理類:使用ActivityManagerProxy代理類,來代理ActivityManagerNative類的子類ActivityManagerService;
所以執(zhí)行請求都是傳遞到ActivityManagerService進(jìn)行處理
以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持好吧啦網(wǎng)。
相關(guān)文章:
