Android Launcher和SystemUI的启动

一、前提提要

        Launcher即桌面程序是在系统服务等启动后打开的第一个应用程序进程,主要管理手机内部的各个用户App的展示与打开等功能,在开启Launcher的过程中SystemUI 如导航栏等布局也相继加载到屏幕中。

        Launcher的启动在各种系统服务初始化完成后进行的,即SystemServer的startOtherService()方法最后

二、启动流程

        1、SystemServer.run()

//com.android.server.SystemServer
private void run() {
    try{
        ......
        //1、创建系统Context
        createSystemContext();
        ......
    }catch(..){..}
    ......
    try{
        ......
        //2、启动其他服务
        startOtherServices(); 
        ...... 
    }catch(..){..}
    //......         
}

        系统服务如:AMS\ATMS、PMS、WMS等都是在SystemServer的run()方法中启动初始化,关于系统服务的启动不做过多介绍,这里主要有是创建了系统Context为后续启动做准备,然后进入到startOtherServices方法中

        2、startOhterServices()

//com.android.server.SystemServer
private void startOtherServices() {
    final Context context = mSystemContext;
    ......
    //wms、ims等各种服务初始化
    ......
    //通过AMS做启动前的准备
    mActivityManagerService.systemReady(() -> {
        ......
        try {
            //2、启动系统UI
            startSystemUi(context, windowManagerF);
        } catch (Throwable e) {
            reportWtf("starting System UI", e);
        }
        ......
    },BOOT_TIMINGS_TRACE_LOG);
}

        在startOtherServices方法中先是完成必要的系统服务后,通过AMS开始对Launcher的启动进行准备工作,调用AMS的systemReady方法传入了一个Callback,并且在Callback中又对系统UI进行启动

        3、启动SystemUI

//com.android.server.SystemServer
private static void startSystemUi(Context context, WindowManagerService windowManager) {
    //启动系统UI Service
    Intent intent = new Intent();
    intent.setComponent(new ComponentName("com.android.systemui",
            "com.android.systemui.SystemUIService"));
    intent.addFlags(Intent.FLAG_DEBUG_TRIAGED_MISSING);
    //Slog.d(TAG, "Starting service: " + intent);
    context.startServiceAsUser(intent, UserHandle.SYSTEM);
    windowManager.onSystemUiStarted();
}

        通过启动Service的方式初始化UI

//com.android.systemui.SystemUIService
public class SystemUIService extends Service {
    @Override
    public void onCreate() {
        super.onCreate();
        //执行SystemUIApplication中的创建方法
        ((SystemUIApplication) getApplication()).startServicesIfNeeded();
        ......
    }
    ......
}

          在Service的onCreate()方法中又调用了当前Application的startServicesIfNeeded方法继续初始化

        在前面的createSystemContext()方法中创建了Context的同时也创建的Application对象,Application的具体实例类型是通过解析对应的AndroidManifest.xml获取,此处创建的Application所解析的xml在 /frameworks/base/packages/SystemUI 包下

//frameworks/base/packages/SystemUI/AndroidManifest.xml
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:androidprv="http://schemas.android.com/apk/prv/res/android"
     package="com.android.systemui"
     android:sharedUserId="android.uid.systemui"       
     coreApp="true">
     ......
      <application
          //Application类
         
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值