Activity的启动一般分为普通Activity的启动,根Activity的启动.而根Activity是指应用启动的第一个Activity过程,所以也可以理解为应用的启动过程.
相关内容链接:android系统启动流程
Activity的启动流程大致分为如下四个阶段:
二.ActivityTaskManagerService到ApplicationThread的调用过程
Activity启动过程涉及到进程之间的关系:
二.ActivityTaskManagerService到ApplicationThread的调用过程
类名: com.android.server.wm.ActivityTaskManagerService:
1. startActivity(IApplicationThread, String, Intent, String, IBinder, String, int, int, ProfilerInfo, Bundle)
startActivity和startActivityAsUser的区别仅在于方法多了一个参数UserHandle.getCallingUserId(),该方法会获取调用者的UserId,ATMS可以根据这个UserId来确定调用者的权限. 最后通过getActivityStartController().obtainStarter(intent, "startActivityAsUser")来获取ActivityStarter对象,调用ActivityStarter的execute()方法继续执行启动流程.
2. startActivityAsUser(IApplicationThread, String, Intent, String, IBinder, String, int, int, ProfilerInfo, Bundle, int)
3. startActivityAsUser(IApplicationThread, String, Intent, String, IBinder, String, int, int, ProfilerInfo, Bundle, int, boolean)
// android-29\com\android\server\wm\ActivityTaskManagerService.java
int startActivityAsUser(IApplicationThread caller, String callingPackage,
Intent intent, String resolvedType, IBinder resultTo, String resultWho, int requestCode,
int startFlags, ProfilerInfo profilerInfo, Bundle bOptions, int userId,
boolean validateIncomingUser) {
// 判断调用者进程是否被隔离,如果isIsolated则抛出SecurityException异常
enforceNotIsolatedCaller("startActivityAsUser");
// 检查调用者权限
userId = getActivityStartController().checkTargetUser(userId, validateIncomingUser,
Binder.getCallingPid(), Binder.getCallingUid(), "startActivityAsUser");
// TODO: Switch to user app stacks here.
return getActivityStartController().obtainStarter(intent, "startActivityAsUser")
.setCaller(caller)
.setCallingPackage(callingPackage)
.setResolvedType(resolvedType)
.setResultTo(resultTo)
.setResultWho(resultWho)
.setRequestCode(requestCode)
.setStartFlags(startFlags)
.setProfilerInfo(profilerInfo)
.setActivityOptions(bOptions)
.setMayWait(userId)
.execute();
}
类名: com.android.server.wm.ActivityStarter:
ActivityStarter是Android7.0中新增的类,它是用来加载Activity的控制类
4. execute()
5. startActivityMayWait()
这里主要是调用resolveActivity()来获取需要启动的activity信息,得到activity信息后继续调用startActivity()方法来继续启动Activity.
6. startActivity(IApplicationThread, Intent, Intent, String, .ActivityInfo, ResolveInfo, IVoiceInteractionSession, IVoiceInteractor, IBinder, String, int, int, int, String, int, int, int, SafeActivityOptions, boolean, boolean, ActivityRecord[], TaskRecord, String, boolean, PendingIntentRecord, boolean)
7. startActivity(IApplicationThread, Intent, Intent, String, ActivityInfo, ResolveInfo, IVoiceInteractionSession, IVoiceInteractor, IBinder, String, int, int, int, String, int, int, int, SafeActivityOptions, boolean, boolean, ActivityRecord[], TaskRecord, boolean, PendingIntentRecord, boolean)
这里首先会进行一系列错误检查,然后创建了ActivityRecord,随后获取当前具有用户输入焦点的ActivityStack. ActivityRecord记录了activity的所有信息,而ActivityStack是对这些activity以及activity任务栈进行管理
// android-29/com/androi