android系统启动流程
ArrayList中加入了这个数据,仅此而已。
4.2 进入ActivityStackSupervisor.resumeTopActivitiesLocked
这里最终执行的是resumeTopActivitiesLocked(null, null, null);
mStacks在setWindowManager的时候已经加入了mhomeStack,所以此时mStacks.size()为1,stack即为mHomeStack,进入分支stack.resumeTopActivityLocked(null);
4.3 进入ActivityStack.resumeTopActivityLocked
显然这时,topRunningActivityLocked一定返回null,程序回到mStackSupervisor.resumeHomeActivity(prev);prev为NULL。 注意:
这里的mStackSupervisor正是ActivityManagerService.main中初始化的
16 / 41
android系统启动流程
ActivityStackSupervisor,在ActivityStackSupervisor. setWindowManager 内部创建ActivityStack实例mHomeStack被创建的时候传进来
4.4 回到ActivityStackSupervisor.resumeHomeActivity。
mHomeStack这个空间被movetop,但是此时launcher的activity并没有运
行,.topRunningActivityLocked(null);自然还是null,mIsHomeActivityStarted为false,程序进入mProbeThread.start();。 注意:
mProbeThread是final变量,性质是线程,定义时就初始化,但是并没有start,所以mProbeThread.isAlive()必为false,mProbeThread.getState() != Thread.State.TERMINATED为true。
4.5 ActivityStackSupervisor.mProbeThread
mProbeThread为ActivityStackSupervisor的内部类,run方法给handler发出START_HOME_MSG消息。
17 / 41
android系统启动流程
4.6 ActivityStackSupervisor.mProbeHandler
mProbeHandler为私有final成员变量。他的工作只有一个就是调用ActivityServiceManger的startHomeActivityLocked,执行这一步后mIsHomeActivityStarted变为true。
特别注意:这一步是消息发送,可能存在调度问题而导致startHomeActivityLocked实际调用慢。前面已经分析过,ActivityStackSupervisor中的mService就是ActivityManagerService。
4.7 回到ActivityManagerService.startHomeActivityLocked
18 / 41
android系统启动流程
首先调用getHomeIntent构造一个intent为CATEGORY_HOME类型,
然后通过resolveActivityInfo函数向PackageManagerService查询Category类型为HOME的Activity,此时aInfo即luancher的ActivityInfo。
通过getProcessRecordLocked,进一步查询该app的执行情况,如果查不到则表明进程都没启动,如果app进程查到了但是instrumentationClass为空则表明activity未启动,此时调用mStackSupervisor.startHomeActivity(intent, aInfo);
4.8 ActivityStackSupervisor.startHomeActivity
传入startActivityLocked的参数只有intent和aInfo不为空,程序很容易判断进入 err = startActivityUncheckedLocked(r, sourceRecord, startFlags, true, options); r正是根据intent和ainfo创建的ActivityRecord,直到这时才有了实际的Activity准备启动,但是此时还没有加入到activityStack的栈顶。
19 / 41
android系统启动流程
4.9 ActivityStackSupervisor.startActivityUncheckedLocked
这个函数很长,仔细梳理并通过加打印,确认其会进入最后ActivityStack类的的startActivityLocked,而targetStack为之前创建的homestack。
特别注意:
doResume参数为true.,
newTask为true(因为启动方式为Intent.FLAG_ACTIVITY_NEW_TASK)
20 / 41