您的位置:首页 > 移动开发 > Android开发

Android启动流程——Home Launcher

2015-04-13 15:00 155 查看



桌面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);

}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: