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(書簽)