am 启动 activity 流程分析

本文基于 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 进行堆栈中的任务切换;




 




你可能感兴趣的:(Android开发)