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类
         
<think>好的,我现在需要帮助用户了解如何通过SystemUI实现滑动解锁以启动Launcher。用户的问题涉及Android系统UI部分,特别是滑动解锁后启动Launcher的流程。首先,我需要回忆一下Android的解锁机制SystemUI的相关组件。 根据用户提供的引用[^1],代码位于TouchInteractionService,这个服务可能处理触摸交互,可能与滑动解锁相关。SystemUI中的解锁逻辑通常涉及Keyguard(锁屏)Launcher的交互。我需要考虑用户滑动解锁时,SystemUI如何通知系统解锁,并启动Launcher。 首先,SystemUI中的锁屏模块(Keyguard)负责处理解锁操作。当用户滑动解锁时,Keyguard会验证用户身份,比如无密码、图案、密码等。一旦验证通过,Keyguard会向系统发送解锁成功的信号,这可能会调用WindowManagerService来隐藏Keyguard界面。 接下来,Launcher作为主屏幕应用,通常在系统启动时由系统服务(如ActivityManagerService)启动。当解锁完成后,SystemUI可能需要通过Intent或系统服务来启动Launcher。但根据引用中的代码,TouchInteractionService可能直接处理触摸事件,并将手势传递给Launcher3的快速步骤(QuickStep)功能,这可能涉及启动Launcher的Activity。 另外,滑动解锁的实现可能涉及手势检测Launcher的通信。例如,在TouchInteractionService中检测到滑动动作后,会触发相应的回调,进而通过Intent或绑定服务的方式通知Launcher启动。同时,权限方面,该服务需要STATUS_BAR_SERVICE权限,确保只有系统组件可以调用。 可能还需要考虑系统服务的注册清单文件中的声明,如引用[^1]中的AndroidManifest.xml定义了服务并指定了intent-filter,以便系统能够正确路由事件。此外,Launcher3的QuickStep功能可能负责处理手势导航,包括滑动解锁后的跳转。 用户的问题还涉及到具体代码实现,可能需要查看TouchInteractionService的源码,了解其如何与SystemUI的其他部分(如PhoneWindowManager)交互,以及如何启动Launcher。例如,解锁后可能调用startActivity或者发送广播,让Launcher3的Activity获得焦点。 需要注意的是,不同Android版本可能实现方式不同,用户提到的引用[^3]中的Android版本比较可能影响具体实现细节。因此,在回答时应指出代码位置关键类,同时提醒用户注意版本差异。 最后,生成相关问题需要考虑用户可能进一步想知道的内容,比如如何自定义手势、处理权限问题、或调试解锁流程,这些都是自然延伸的问题。</think>在Android中,滑动解锁到Launcher的实现涉及SystemUI的锁屏模块与Launcher的交互机制,关键实现步骤如下: ### 1. 手势识别与事件分发 SystemUI的触摸交互服务$TouchInteractionService$负责处理边缘滑动手势(如全面屏导航手势),通过$QUICKSTEP_SERVICE$声明实现与Launcher3的绑定。该服务检测到解锁手势后,会触发以下流程: ```xml <!-- 服务声明代码位置 --> <packages/apps/Launcher3/quickstep/AndroidManifest.xml> <service android:name="com.android.quickstep.TouchInteractionService" android:permission="android.permission.STATUS_BAR_SERVICE" android:directBootAware="true"> <intent-filter> <action android:name="android.intent.action.QUICKSTEP_SERVICE"/> </intent-filter> </service> ``` ### 2. 解锁状态同步 当滑动解锁操作被识别后,SystemUI通过以下方式通知系统: - 调用$KeyguardViewMediator$的`handleHide()`方法,发送`KEYGUARD_DONE`广播 - 更新$WindowManagerService$的锁屏状态标志: ```java // SystemUI关键调用路径 KeyguardUpdateMonitor.onAuthenticationSucceeded() → KeyguardViewMediator.handleHide() → WindowManagerService.onKeyguardDone() ``` ### 3. Launcher启动控制 Launcher作为默认的Home应用,在以下两种场景会被激活: - **冷启动**:系统启动时通过$ActivityManagerService$启动$LauncherActivity$ - **热切换**:解锁后通过$ActivityTaskManagerService$将任务栈顶的Launcher带到前台 ### 4. 滑动动画衔接 SystemUILauncher3通过共享内存表面(SurfaceControl)实现手势动画的无缝衔接,具体由$RecentsAnimationController$控制过渡效果,确保滑动解锁手势与Launcher启动动画的连续性。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值