Android启动流程——Home Launcher

来源:互联网 发布:淘宝装修模板怎么使用 编辑:程序博客网 时间:2024/04/17 01:03

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

        }    

}

 

 

0 0