10.6.5 启动persistent应用程序和Home
systemReady在第四部分完成后,便开始第五部分工作:启动persistent应用和Home应用,代码如下:
public void systemReady(final Runnable goingCallback){
……//省略前四部分工作
synchronized(this){
if(mFactoryTest!=SystemServer.FACTORY_TEST_LOW_LEVEL){
try{
//从Package Manager获取persistent应用程序的ApplicationInfo
List apps=AppGlobals.getPackageManager().
getPersistentApplications(STOCK_PM_FLAGS);
if(apps!=null){
int N=apps.size();
int i;
for(i=0;i<N;i++){
ApplicationInfo info=(ApplicationInfo)apps.get(i);
//过滤掉frameworks-res.apk,因为其已经启动
if(info!=null&&
!info.packageName.equals("android")){
//启动应用程序
addAppLocked(info, false);
}
……
//mBooting赋值为true,该状态对发送ACTION_BOOT_COMPLETED广播至关重要
mBooting=true;
……
//启动栈顶第一个Activity,默认为Home
mMainStack.resumeTopActivityLocked(null);
}
systemReady在第五部分工作中,首先启动persistent应用程序进程,然后启动第一个Activity,即Home。
Home启动后进入Idle状态,在Idle状态需要调用ActivityStack的activityIdleInternal方法处理IDLE消息。
注意 Idle状态和Idle状态消息处理机制请参考第7章、第11章内容。
接下来分析activityIdleInternal方法,代码如下:
final ActivityRecord activityIdleInternal(IBinder token,
boolean fromTimeout, Configuration config){
……
synchronized(mService){
……
if(mMainStack){
//mService即ActivityManagerService, mBooting已经赋值为true
booting=mService.mBooting;
mService.mBooting=false;
}
}
……
if(booting){//true
//发送ACTION_BOOT_COMPLETED广播
mService.finishBooting();
}
……
可见,ActivityManagerService在第五部分中还隐藏着一个重要操作:发送ACTION_BOOT_COMPLETED广播。这部分内容需要结合消息处理机制和应用程序启动过程才能真正理解,因此这里只列出其主要流程,在第11章分析应用程序启动过程时再详细分析。
至此,ActivityManagerService在系统启动init2阶段的使命已经完成了。