本文基于 Android 7.1.1 的源码进行分析。
am 启动 app 方式: am start package/activity
am 代码位置: com.android.commands.am.Am.java
main -> runStart()
调用 IActivityManager 的binder实例来执行安装任务,在 runStart函数中,根据传入的包名和activity名构建了一个intent,并且增加了标志:FLAG_ACTIVITY_NEW_TASK。
private void runStart() throws Exception {
Intent intent = makeIntent(UserHandle.USER_CURRENT);
......
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
if (mWaitOption) {
result = mAm.startActivityAndWait(null, null, intent, mimeType,
null, null, 0, mStartFlags, profilerInfo,
options != null ? options.toBundle() : null, mUserId);
res = result.result;
} else {
res = mAm.startActivityAsUser(null, null, intent, mimeType,
null, null, 0, mStartFlags, profilerInfo,
options != null ? options.toBundle() : null, mUserId);
}
........
}
由代码可以看到,如果使用了 -W 参数,则会走
startActivityAndWait 函数,否则走
startActivityAsUser 函数,这两个函数在 ActivityManagerService 中都有实现。
com.android.server.am.ActivityManagerService.java
1. startActivityAndWait ->mActivityStarter.startActivityMayWait
2. startActivityAsUser -> mActivityStarter.startActivityMayWait
实际启动app的过程是由 ActivityStarter 类完成的
com.android.server.am.ActivityStarter.java
这里面做了解析 activity 信息,做合法性检查,再根据启动标志觉得是从堆栈中拿现成的 activity还是创建一个,最后调用 ActivityStack 来完成启动;
startActivityMayWait->startActivityLocked->doPendingActivityLaunchesLocked->startActivityUnchecked->mTargetStack.startActivityLocked
com.android.server.am.ActivityStack.java
ActivityStack的函数 startActivityLocked 主要 mWindowManager.prepareAppTransition 进行堆栈中的任务切换;