android系统启动流程
4.10 ActivityStack.startActivityLocked
1)直到这里,launcher的activity才真正加到到activitystack的栈顶。
if (doResume) {
mStackSupervisor.resumeTopActivitiesLocked(); }
2)正常情况应该进入第二个分支的mWindowManager.addAppToken,并最后执行
注意:mWindowManager.addAppToken的调用将当前acitivity的apptoken加入到window管理里面去,后面才能把他显示出来。
21 / 41
android系统启动流程
4.11 ActivityStackSupervisor.resumeTopActivitiesLocked
和前面一样,这里传入的参数为空:
程序再回到ActivityStack. resumeTopActivityLocked。
4.12 ActivityStack.resumeTopActivityLocked
程序走到这里,才终于走到了显示出launcher的边缘。 下面的resumeTopActivityLocked需要仔细分析:
22 / 41
android系统启动流程
这个函数的层次:
1)if (next == null) {,启动home: resumeHomeActivity 2) 目标next已经是mResumedActivity,直接return
3)目标next的app和app.thread都已经建立,直接进入显示,调用mWindowManager.setAppVisibility(next.appToken, true)和
next.app.thread.scheduleResumeActivity;否则调用
mStackSupervisor.startSpecificActivityLocked(next, true, true)进入继续做其他处理..
显然此时不会走1);
如果能走2),一定是被别的地方已经调用了显示; 那么正常启动应该走3)。 对于层次3),做下分析:
如果不是persistent属性的launcher,显然从前面的分析看,一直走到这里也不会有人拉起他的进程;那么就是说正常情况下,普通不带persistent属性的launcher应该 会走到调用startSpecificActivityLocked,跟踪也多是如此。
之所以说多是如此,是因为实际上系统上还有其他方法来保证launcher这个activity进程被尽快拉起,所以有时会走到“if (next.app != null && next.app.thread != null) {”这个分支下。
问题:有没有可能走到层次2)上面去?假设有别的地方还调用了显示,何尝不会?
23 / 41
android系统启动流程
4.13 ActivityStackSupervisor.startSpecificActivityLocked
此时,如果满足条件if (app != null && app.thread != null),则会调用realStartActivityLocked。
而如果系统没有其他地方启动launcher的进程,显然就会进入mService.startProcessLocked(r.processName, r.info.applicationInfo, true, 0, \
来自己拉起进程,那么这个时候,谁去显示?似乎都没人去显示launcher了?
4.14 ActivityStackSupervisor.realStartActivityLocked
24 / 41
android系统启动流程
函数里面:
调用mWindowManager.setAppVisibility(r.appToken, true);设置窗口可见; 调用app.thread.scheduleLaunchActivity启动LaunchActivity的绘制,即oncreate+onresume.
调用stack.minimalResumeActivityLocked(r);记录该app为resumed状态:
走到这里,正常的launcher启动流程就讲完了,但却留下2个问题: 问题1:
如果launcher不带persistemt属性,也没有别的地方会主动创建launcher的进程,那么startSpecificActivityLocked会走入mService.startProcessLocked,而不是realStartActivityLocked,这种情况下谁来显示? 问题2:
假设有别的地方调用了realStartActivityLocked,而这时apptoken没准备好,显然光scheduleLaunchActivity画好了ui还是显示不出来,但是这时却仍然执行了: r.state = ActivityState.RESUMED;
这个时候上面的ActivityStack.resumeTopActivityLocked就会走入层次2,什么都不做就直接return了,导致launcher不显示。
因此我们还有必要跟着mService.startProcessLocked这个分支再继续看看。
4.15 ActivityManagerService.startProcessLocked
回顾下startSpecificActivityLocked走mService.startProcessLocked的情况:
这段代码也可以看出,ProcessRecord app由startProcessLocked产生,并同时创建了一个app.thread,也就是说每创建一个进程就一定有一个thread线程,至少对于activity而言是这样。 (注意:ActivityManagerService.SystemReady里面在主动启动persistent属性的apk时,也是调用的该函数)。
继续ActivityManagerService.startProcessLocked,
25 / 41