Activity啟動流程

1、boolean onKeyDown(intkey Code,KeyEvent event)(Activity.java)? ——》

?2、void startActivity(Intent intent)(Activity.java)? ——》?

3、void startActivity(Intent intent,@Nullable Bundle options)(Activity.java)? ——》?

4、void startActivityForResult(@RequiresPermission Intent intent, intrequestCode,

@NullableBundle options)(Activity.java)? ——》

5、ActivityResult execStartActivity(

Context who,IBinder contextThread,IBinder token,Activity target,

Intent intent, intrequestCode,Bundle options)

(Instrumentation.java)? ——》

6、IActivityManager getDefault()(AMN) ——》

7、int startActivity(IApplicationThread caller,String callingPackage,Intent intent,

String resolvedType,IBinder resultTo,String resultWho, intrequestCode, intflags,

ProfilerInfo profilerInfo,Bundle options)throwsRemoteException(AMP,AMP是AMN的內(nèi)部類,實現(xiàn)IActivityManager類) (AMP經(jīng)過binder IPC,進入ActivityManagerNative(簡稱AMN)) ——》

8、boolean onTransact(int code,Parcel data,Parcel reply, int flags)

throwsRemoteException(AMN)? ——》(根據(jù)不同code情況,分別進入AMS不同的啟動Activity方法)(不知道為什么會進入AMS的方法,應該是代碼更改,將ActivityManagerProxy作為AMN內(nèi)部類,從而代碼依然是在AMN中)

9、int startActivity(IApplicationThread caller,StringcallingPackage,

Intent intent,StringresolvedType,IBinder resultTo,StringresultWho, intrequestCode,

intstartFlags,ProfilerInfo profilerInfo,Bundle bOptions)(AMN)? ——》(不知道為什么,又進入了ActivityStackSupervisor而不是ActivityStarter,應該是系統(tǒng)代碼更改,進入的是后者)

10、int startActivityMayWait(IApplicationThread caller,intcallingUid,? ? ? ? String callingPackage, Intent intent, String resolvedType,? ? ? ? IVoiceInteractionSession voiceSession, IVoiceInteractor voiceInteractor,? ? ? ? IBinder resultTo, String resultWho,intrequestCode,intstartFlags,? ? ? ? ProfilerInfo profilerInfo, WaitResult outResult, Configuration config,? ? ? ? Bundle options,booleanignoreTargetSecurity,intuserId,? ? ? ? IActivityContainer iContainer, TaskRecord inTask)(ActivityStarter.java)?

(ResolveInforInfo =mSupervisor.resolveIntent(intent,resolvedType,userId);

ActivityInfo aInfo =mSupervisor.resolveActivity(intent,rInfo,startFlags,profilerInfo);

(ASS.java resolveActivity()方法的核心功能是找到相應的Activity組件,并保存到intent對象)

通過resolveActivity來獲取ActivityInfo信息

然后再進入AS.startActivityLocked()

) ——》

11、ActivityInforesolveActivity(Intent intent,ResolveInfo rInfo, intstartFlags,

ProfilerInfo profilerInfo)(ASS)?

決定啟動模式:

ActivityManager類有如下4個flags用于調(diào)試:

START_FLAG_DEBUG:用于調(diào)試debug app

START_FLAG_OPENGL_TRACES:用于調(diào)試OpenGL tracing

START_FLAG_NATIVE_DEBUGGING:用于調(diào)試native

START_FLAG_TRACK_ALLOCATION: 用于調(diào)試allocation tracking

?——》

12、步驟10中resolveIntent(intent,resolvedType,userId)方法:

AppGlobals.getPackageManager().
resolveIntent(Intent intent,String resolvedType,

intflags, intuserId)(PMS)——》

13、List<ResolveInfo> queryIntentActivitiesInternal(Intent intent,

String resolvedType, int flags, int userId)

(PMS,遍歷activity)——》

14、ResolveInfo chooseBestActivity(Intent intent,String resolvedType,

intflags,List query, intuserId)(PMS.java 選擇activity)——》

15、步驟10中進入

int startActivityLocked(IApplicationThread caller,Intent intent,Intent ephemeralIntent,

String resolvedType,ActivityInfo aInfo,ResolveInfo rInfo,

IVoiceInteractionSession voiceSession,IVoiceInteractor voiceInteractor,

IBinder resultTo,String resultWho, intrequestCode, intcallingPid, intcallingUid,

String callingPackage, intrealCallingPid, intrealCallingUid, intstartFlags,

ActivityOptions options, booleanignoreTargetSecurity, booleancomponentSpecified,

ActivityRecord[] outActivity,ActivityStackSupervisor.ActivityContainer container,

TaskRecord inTask)(AS.java 其中有兩個返回值代表啟動Activity失?。?/p>

START_INTENT_NOT_RESOLVED: 從Intent中無法找到相應的Component或者ActivityInfo

START_NOT_CURRENT_USER_ACTIVITY:該Activity對當前用戶不可見)——》

16、步驟15中進入boolean checkAppSwitchAllowedLocked(intsourcePid, intsourceUid,

intcallingPid, intcallingUid,String name)(AMS.java 當mAppSwitchesAllowedTime時間小于當前時長,或者具有STOP_APP_SWITCHES的權限,則允許app發(fā)生切換操作.

其中mAppSwitchesAllowedTime, 在AMS.stopAppSwitches()的過程中會設置為:mAppSwitchesAllowedTime = SystemClock.uptimeMillis() + APP_SWITCH_DELAY_TIME. 禁止app切換的timeout時長為5s(APP_SWITCH_DELAY_TIME = 5s).

當發(fā)送5秒超時或者執(zhí)行AMS.resumeAppSwitches()過程會將mAppSwitchesAllowedTime設置0, 都會開啟允許app執(zhí)行切換的操作.另外,禁止App切換的操作,對于同一個app是不受影響的,有興趣可以進一步查看checkComponentPermission過程.)

17、步驟15中進入void doPendingActivityLaunchesLocked(booleandoResume)(AS.java mPendingActivityLaunches記錄著所有將要啟動的Activity, 是由于在startActivityLocked的過程時App切換功能被禁止, 也就是不運行切換Activity, 那么此時便會把相應的Activity加入到mPendingActivityLaunches隊列. 該隊列的成員在執(zhí)行完doPendingActivityLaunchesLocked便會清空.

啟動mPendingActivityLaunches中所有的Activity, 由于doResume = false, 那么這些activtity并不會進入resume狀態(tài),而是設置delayedResume = true, 會延遲resume.)

18、步驟15中進入

int startActivityUnchecked(finalActivityRecord r,ActivityRecord sourceRecord,

IVoiceInteractionSession voiceSession,IVoiceInteractor voiceInteractor,

intstartFlags, booleandoResume,ActivityOptions options,TaskRecord inTask)(AStarter.java? 找到或創(chuàng)建新的Activit所屬于的Task對象,之后調(diào)用AStack.startActivityLocked)——》

19、void startActivityLocked(ActivityRecord r, booleannewTask, booleankeepCurTransition,

ActivityOptions options)(ActivityStack.java)——》

20、void validateAppTokensLocked()(ActivityStack.java)——》

21、void validateAppTokens(int stackId,List tasks)(WindowManagerService.java)——》

22、

2.10 AS.startActivityLocked(書簽)

最后編輯于
?著作權歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內(nèi)容

  • 前言 Launcher啟動app launcher就是android桌面應用程序。也是操作系統(tǒng)啟動有第一個app。...
    第八區(qū)閱讀 1,138評論 0 2
  • 背景介紹 從事開發(fā)到了一定階段,想要提高就必須搞明白系統(tǒng)的一些工作原理。為什么?因為只有明白了這些,你才能針對平臺...
    CoorChice閱讀 73,672評論 57 508
  • 談藝 | 書法,可以改變一個人 書法,可以改變一個人 在我們身邊,有些朋友, 他們或懶惰、呆板; 或急躁、偏激; ...
    子正書院閱讀 460評論 0 2
  • 現(xiàn)在這世道,感情騙子特別多,前陣子爆出名秀恩愛死的快的小兵,同時交往了幾個女朋友,部隊的領導也受了處分,記...
    飛天小兔閱讀 445評論 0 0
  • 霍建華林心如520認愛以后,很少在公開場合秀恩愛,即使是共同參加的慈善活動也未能同席同框。 最近霍建華主演的電影《...
    莊小相閱讀 367評論 0 0

友情鏈接更多精彩內(nèi)容