安卓系统Fallback的结束到桌面启动

📅 2026/7/31 17:03:51
安卓系统Fallback的结束到桌面启动
主线支线HomeActivity和fallbackHome的联系结合Android系统HomeActivity启动流程相关内容二者的核心联系如下层级与定位关系‌FallbackHome是Android系统在Direct Boot设备未解锁阶段的‌临时HomeActivity‌而常规的HomeActivity就是用户日常使用的桌面Launcher主Activity。在设备加密未解锁时系统无法启动普通LauncherFallbackHome就作为临时的HomeActivity占位。启动时序关联‌系统开机时在用户完成设备解锁前系统通过resolveHomeActivity优先解析到FallbackHome启动用户解锁后FallbackHome会自动退出系统重新解析Home Intent启动真正的桌面HomeActivity完成接管。优先级与调度逻辑‌FallbackHome的intent-filter优先级被设为-1000远低于常规Launcher的HomeActivity优先级解锁后系统会自动将Home入口切换为正式的桌面HomeActivity避免临时界面长期占用前台。2launch是否也可以作为未解锁状态替换fallbackHome(未解锁)launch包含第三方应用如果是加密状态第三方应用也不该展示那显而易见就是无法控制第三方应用就设置一个fallbackHome什么都不展示但他可以在加密的状态下运行起来它是也是一种解密的状态可以在未解锁之前呢呃理论上就是说你要是真正想做这件事啊。也许是可以的但是你要想一个问题啊就是说如果你只是桌面的话啊你要是不跟其他的。应用有任何耦合的情况下那是可以的啊但是朗取的话啊他明显就可能跟其他第三方应用有较大的耦合对吧比如说我们桌面的那些小部件什么的对吧啊你这个时候可能是要第三方的那种应用啊或者要访问第三方的一些文件或者什么东西对吧那这个时候的话。你要是说。人家加密的这种状态的话你是不是也要求其他第三方应用他也跟你一样这样的一种状态那这肯定就不现实了对吧你肯定无法控制第三方应用3FallbackHome‌ 切换到正式 ‌HomeActivity (Launcher)‌ 的关键源码调用链路 ‌并补充核心节点的逻辑注释。这一过程主要发生在系统启动后期systemReady以及用户解锁设备时。核心逻辑位于 ActivityTaskManagerService (ATMS) 和 RootWindowContainer 中。1. 核心启动入口SystemServer - AMS系统服务准备就绪后AMS 会触发 Home 的启动流程。java// frameworks/base/services/java/com/android/server/SystemServer.javaprivate void startOtherServices() {// ... 其他服务启动mActivityManagerService.systemReady(() - {// systemReady 回调中启动 Home ActivitymAtmInternal.startHomeOnAllDisplays(currentUserId, systemReady);}, t);}2. ATMS 调度层解析与路由startHomeOnAllDisplays 最终委托给 RootWindowContainer 处理。这是决定“启动哪个 Home”的关键决策点。java// frameworks/base/services/core/java/com/android/server/wm/RootWindowContainer.javaboolean startHomeOnDisplay(int userId, String reason, int displayId,boolean allowInstrumenting, boolean fromHomeKey) {// 1. 构建标准的 Home Intent (Action: MAIN, Category: HOME)Intent homeIntent mService.getHomeIntent();// 2. 【关键节点】解析具体的 ActivityInfo// 这里会根据当前系统状态是否加密、是否解锁来决定返回 FallbackHome 还是 LauncherActivityInfo aInfo resolveHomeActivity(userId, homeIntent);if (aInfo null || homeIntent null) {return false;}// 3. 检查是否允许启动if (!canStartHomeOnDisplayArea(aInfo, taskDisplayArea, allowInstrumenting)) {return false;}// 4. 设置组件并启动homeIntent.setComponent(new ComponentName(aInfo.applicationInfo.packageName, aInfo.name));homeIntent.setFlags(homeIntent.getFlags() | FLAG_ACTIVITY_NEW_TASK);// 5. 执行真正的 Activity 启动流程mService.getActivityStartController().startHomeActivity(homeIntent, aInfo, reason, displayId);return true;}3. 核心决策逻辑resolveHomeActivity这是理解二者联系的最核心方法。它决定了在当前时刻谁才是真正的“Home”。java// frameworks/base/services/core/java/com/android/server/wm/RootWindowContainer.javaprivate ActivityInfo resolveHomeActivity(int userId, Intent homeIntent) {// 获取 PackageManagerServicefinal PackageManagerInternal pmi LocalServices.getService(PackageManagerInternal.class);// 【关键逻辑】判断当前用户是否处于“解锁”状态// 如果设备加密且未解锁 (Locked)或者用户尚未完成首次设置if (!mService.mUserController.isCurrentUserUnlockingOrUnlocked(userId)) {// 场景 A设备未解锁 / Direct Boot 模式// 优先查找标记了 directBootAwaretrue 的 Home Activity// FallbackHome (在 Settings 中) 通常配置了 android:directBootAwaretrue// 而普通 Launcher 通常没有这个属性因此在未解锁时不可见return pmi.resolveHomeActivityForDirectBoot(userId, homeIntent);} else {// 场景 B设备已解锁// 正常解析所有带有 CATEGORY_HOME 的 Activity// 此时会根据 priority (优先级) 选择。// FallbackHome 的 priority 通常设为 -1000 (极低)而 Launcher 为 0 或更高// 因此系统会选择正式的 Launcher 作为 HomeActivityreturn pmi.resolveHomeActivity(userId, homeIntent);}}注意‌不同 Android 版本中resolveHomeActivity 的具体实现可能略有差异例如 Android 11 引入了 TaskDisplayArea 的概念但核心判断逻辑依然是‌检查用户解锁状态‌ 和 ‌Intent 解析优先级‌。4. FallbackHome 的自我终结与切换FallbackHome 启动后并不是永远驻留。它内部有一个机制来检测何时该“退场”。java// packages/apps/Settings/src/com/android/settings/FallbackHome.javapublic class FallbackHome extends Activity {Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.fallback_home);// 注册一个广播接收器或监听器监控用户解锁状态// 当用户输入密码/指纹解锁成功后系统会发送 ACTION_USER_UNLOCKED}Overrideprotected void onResume() {super.onResume();// 检查用户是否已经解锁if (isUserUnlocked()) {// 如果已解锁说明正式的 Launcher 现在可以启动了// 启动真正的 Home Intent (此时 resolveHomeActivity 会返回 Launcher)startActivity(new Intent(Intent.ACTION_MAIN).addCategory(Intent.CATEGORY_HOME));// 结束自己finish();} else {// 如果未解锁保持显示等待解锁// 可能会显示一个进度条或 Android is starting... 提示}}private boolean isUserUnlocked() {UserManager um getSystemService(UserManager.class);return um.isUserUnlocked();}}5. 总结切换流程图mermaid生成失败请稍后重试关键点注释说明android:directBootAwaretrue‌:这是 FallbackHome 能在开机未解锁时启动的根本原因。普通 Launcher 如果没有声明此属性在设备加密未解锁阶段对系统是不可见的PackageManager 不会解析到它。Intent Filter Priority‌:FallbackHome 的 intent-filter 中通常设置 android:priority-1000。正式 Launcher 的 priority 通常为 0 或更高。当用户解锁后resolveHomeActivity 会重新查询所有 Home Activity由于优先级差异系统会自动选择正式 Launcher从而实现“无感切换”。startHomeActivity 的幂等性‌:系统可能会多次调用 startHomeOnDisplay。如果当前前台已经是 Home Activity无论是 Fallback 还是正式系统会根据情况决定是否需要重新启动或只是 bring to front。ANR 保护‌:FallbackHome 作为一个轻量级 Activity其启动速度极快避免了因 Launcher 加载缓慢如资源多、插件化初始化等导致的长时间黑屏或 ANRApplication Not Responding。它充当了一个“占位符”确保窗口管理器WMS始终有一个合法的 Home Task 存在。通过这套机制Android 保证了从开机到用户可交互界面的平滑过渡同时解决了加密设备在未解锁状态下的 UI 展示问题。4