Android系统默认Home应用程序(Launcher)的启动过程源代码分析(2)
Step 10. ActivityManagerService.systemReady 这个函数是在上面的Step 6中的ServerThread.run函数在将系统中的一系列服务都初始化完毕之后才调用的,它定义在frameworks/base/services/java/com/android/server/am/ActivityManagerServcie.java文件中: [java] view plain copy publicfinalclassActivityManagerServiceextendsActivityManagerNative implementsWatchdog.Monitor,BatteryStatsImpl.BatteryCallback{ ...... publicvoidsystemReady(finalRunnablegoingCallback){ ...... synchronized(this){ ...... mMainStack.resumeTopActivityLocked(null); } } ...... } 这个函数的内容比较多,这里省去无关的部分,主要关心启动Home应用程序的逻辑,这里就是通过mMainStack.resumeTopActivityLocked函数来启动Home应用程序的了,这里的mMainStack是一个ActivityStack类型的实例变量 Step 11. ActivityStack.resumeTopActivityLocked 这个函数定义在frameworks/base/services/java/com/android/server/am/ActivityStack.java文件中: [java] view plain copy publicclassActivityStack{ ...... finalbooleanresumeTopActivityLocked(ActivityRecordprev){ //Findthefirstactivitythatisnotfinishing. ActivityRecordnext=topRunningActivityLocked(null); ...... if(next==null){ //Therearenomoreactivities!Let'sjuststartupthe //Launcher... if(mMainStack){ returnmService.startHomeActivityLocked(); } } ...... } ...... } 这里调用函数topRunningActivityLocked返回的是当前系统Activity堆栈最顶端的Activity,由于此时还没有Activity被启动过,因此,返回值为null,即next变量的值为null,于是就调用mService.startHomeActivityLocked语句,这里的mService就是前面在Step 7中创建的ActivityManagerService实例了。 Step 12.ActivityManagerService.startHomeActivityLocked 这个函数定义在frameworks/base/services/java/com/android/server/am/ActivityManagerServcie.java文件中: [java] view plain copy publicfinalclassActivityManagerServiceextendsActivityManagerNative implementsWatchdog.Monitor,BatteryStatsImpl.BatteryCallback{ ...... booleanstartHomeActivityLocked(){ ...... Intentintent=newIntent( mTopAction, mTopData!=null?Uri.parse(mTopData):null); intent.setComponent(mTopComponent); if(mFactoryTest!=SystemServer.FACTORY_TEST_LOW_LEVEL){ intent.addCategory(Intent.CATEGORY_HOME); } ActivityInfoaInfo= intent.resolveActivityInfo(mContext.getPackageManager(), STOCK_PM_FLAGS); if(aInfo!=null){ intent.setComponent(newComponentName( aInfo.applicationInfo.packageName,aInfo.name)); //Don'tdothisifthehomeappiscurrentlybeing //instrumented. ProcessRecordapp=getProcessRecordLocked(aInfo.processName, aInfo.applicationInfo.uid); if(app==null||app.instrumentationClass==null){ intent.setFlags(intent.getFlags()|Intent.FLAG_ACTIVITY_NEW_TASK); mMainStack.startActivityLocked(null,intent,null,null,0,aInfo, null,null,0,0,0,false,false); } } returntrue; } ...... } 函数首先创建一个CATEGORY_HOME类型的Intent,然后通过Intent.resolveActivityInfo函数向PackageManagerService查询Category类型为HOME的Activity,这里我们假设只有系统自带的Launcher应用程序注册了HOME类型的Activity(见packages/apps/Launcher2/AndroidManifest.xml文件) [html] view plain copy <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.android.launcher" android:sharedUserId="@string/sharedUserId" > ...... <application android:name="com.android.launcher2.LauncherApplication" android:process="@string/process" android:label="@string/application_name" android:icon="@drawable/ic_launcher_home"> <activity android:name="com.android.launcher2.Launcher" android:launchMode="singleTask" android:clearTaskOnLaunch="true" android:stateNotNeeded="true" android:theme="@style/Theme" android:screenOrientation="nosensor" android:windowSoftInputMode="stateUnspecified|adjustPan"> <intent-filter> <actionandroid:name="android.intent.action.MAIN"/> <categoryandroid:name="android.intent.category.HOME"/> <categoryandroid:name="android.intent.category.DEFAULT"/> <categoryandroid:name="android.intent.category.MONKEY"/> </intent-filter> </activity> ...... </application> </manifest> 因此,这里就返回com.android.launcher2.Launcher这个Activity了。由于是第一次启动这个Activity,接下来调用函数getProcessRecordLocked返回来的ProcessRecord值为null,于是,就调用mMainStack.startActivityLocked函数启动com.android.launcher2.Launcher这个Activity了,这里的mMainStack是一个ActivityStack类型的成员变量。 本文转自 Luoshengyang 51CTO博客,原文链接:http://blog.51cto.com/shyluo/966528,如需转载请自行联系原作者