android系统从systemserver开始的launcher启动详细流程(5)

2019-08-01 23:40

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


android系统从systemserver开始的launcher启动详细流程(5).doc 将本文的Word文档下载到电脑 下载失败或者文档不完整,请联系客服人员解决!

下一篇:建设项目安全预评价报告 - 图文

相关阅读
本类排行
× 注册会员免费下载(下载后可以自由复制和排版)

马上注册会员

注:下载文档有可能“只有目录或者内容不全”等情况,请下载之前注意辨别,如果您已付费且无法下载或内容有问题,请联系我们协助你处理。
微信: QQ: