Android启动流程——Home Launcher

  • 桌面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的时候是根据HOMEfilter(在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);        

        }    

}

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值