- 桌面Home launcher
frameworks/base/services/java/com/android/server/am/ActivityManagerService.java
系统启动成功后,SystemServer调用ActivityManagerNative.getDefault().systemReady()通知启动成功。
frameworks/base/services/java/com/android/server/am/ActivityManagerService.java
//调用systemReady通知启动成功。
public void systemReady(final RunnablegoingCallback){
...
mMainStack.resumeTopActivityLocked(null); // 这里启动Home应用程序
...
}
//利用topRunningActivityLocked返回当前系统Activity堆栈最顶端的Activity
//为null则调用startHomeActivityLocked()
private final boolean resumeTopActivityLocked(HistoryRecord prev){
HistoryRecordnext =topRunningActivityLocked(null);
if (next == null) {
// There are no more activities! Let's just start up the
// Launcher...
return startHomeActivityLocked();
}
...
}
private boolean startHomeActivityLocked() {
...
//创建一个CATEGORY_HOME类型的Intent
if (mFactoryTest != SystemServer.FACTORY_TEST_LOW_LEVEL) {
intent.addCategory(Intent.CATEGORY_HOME);
}
//通过resolveActivityInfo函数向PackageManagerService查询CATEGORY是否类型为HOME
//这里返回Launcher
ActivityInfoaInfo =
intent.resolveActivityInfo(mContext.getPackageManager(),STOCK_PM_FLAGS);
ProcessRecordapp =getProcessRecordLocked(aInfo.processName,aInfo.applicationInfo.uid);
//第一次启动则利用startActivityLocked启动这个Activity。
if (app == null || app.instrumentationClass== null) {
startActivityLocked(null, intent, null, null, 0, aInfo,
null, null, 0, 0, 0, false, false);
}
}
在寻找Launcher的时候是根据HOME的filter(在Manifest中定义的<categoryandroid:name=”android.intent.category.HOME” />)来过滤。然后根据filter出来的HOME来启动,如果只有一个HOME,则启动这个HOME,如果用户自己装了HOME,那就会弹出来一个列表供用户选择。
- 开机自启动的第三方应用程序
ActivityManager启动成功后,通过设置变量mBooting,通知它的另一线程,该线程会发送广播android.intent.action.BOOT_COMPLETED以告知已注册的第三方程序在开机时自动启动。
frameworks/base/core/java/android/content/Intent.java
/**
* Broadcast Action: This is broadcast once, after the system hasfinished booting. It can be used toperform application-specific initialization, such as installing alarms. You must hold the {@linkandroid.Manifest.permission#RECEIVE_BOOT_COMPLETED} permission in order toreceive this broadcast. *
* <p class="note">This is a protected intent that canonly be sent
* by the system.
*/
@SdkConstant(SdkConstantType.BROADCAST_INTENT_ACTION)
public static final StringACTION_BOOT_COMPLETED = "android.intent.action.BOOT_COMPLETED";
在要启动的app的AndroidManifest.xml文件里要添加监听广播权限,注册广播。
添加权限
<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />
在application标签里注册广播
<receiver android:name="com.netmoon.broadcast.BootBroadCastReceiver" >
<intent-filter>
<action android:name="android.intent.action.BOOT_COMPLETED" >
</action>
</intent-filter>
</receiver>
在项目里面创建一个BootUpReceiver的类(MyActivity是你自己的app的main activity)
public class BootUpReceiver extendsBroadcastReceiver{
//重写onReceive方法
public void onReceive(Context context, Intent intent) {
Intent i = new Intent(context, MyActivity.class);
i.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
context.startActivity(i);
}
}