android 启动launcher流程

本文介绍了Android系统中ActivityManagerService如何实现用户切换功能,并详细解释了设置默认Launcher应用程序的过程,包括通过Intent查询活动信息及优先级设定。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

ActivityManagerService.java :  switchUser(final int userId)

{

boolean homeInFront = mStackSupervisor.switchUserLocked(userId,uss);

if(homeInFront)

{

  startHomeActivityLocked(userId);

}

}


boolean startHomeActivityLocked( int userId) {

Intent intent = getHomeIntent();

...

mStackSupervisor.startHomeActivity(intent,aInfo);

}


Intent getHomeIntent(){

Intent intent = new Intent(mTopAction, mTopData != null ? Uri.parse(mTopData:null));

intent.setComponent()mTopComponent;

       ...

return intent;

}


设置默认launcher  在 defaultActivity.java

Intent intent  = new Intent();

intent.setAction(Intent.ACTION_MAIN);

intent.addCategory(Intent.CATEGORY_HOME);

intent.addCategory(Intent.CATEGORY_DEFAULT);

List<ResolveInfo> list = pm.queryIntentActivities(intent,PackageManager.GET_INTENT_FILTERS);

ComponentName[] components = new ComponentName[list.size()];

int defApk = -1;

for(int i = 0; i<list.size(); ++i)

{

ActivityInfo info = list.get(i).activityInfo;

if(info.packageName.equals("com.example.launcher")&&info.name.equals("xxxx"))

{

defApk = i ;

}

components[i] = new ComponentName(info.packageName,info.name);

}

 if(defApk != -1){

IntentFilter filter = new IntentFilter();

filter.addAction(Intent.ACTION_MAIN);

filter.addCategory(Intent.CATEGORY_HOME);

filter.addCategory(Intent.CATEGORY_DEFAULT);

pm.addPreferedActivity(filter, IntentFilter.MATCH_CATEGORY_EMPTY, components, components[defApk] );

}


### Android 设备上启动 Launcher 的方法及解决方案 #### 一、Launcher 启动流程概述 在 Android 系统中,Launcher 是作为 Home 应用程序存在,默认情况下由 `ActivityManagerService` 负责管理其生命周期。当设备启动时,系统会通过一系列机制加载并启动默认的 Launcher 应用。然而,在某些场景下(如 FallbackHome 存在或系统异常),可能会影响正常的 Launcher 加载行为。 以下是启动 Launcher 的核心原理和常见问题解决方案: --- #### 二、正常启动 Launcher 的方式 可以通过以下两种主要方式手动触发 Launcher启动: 1. **通过 ADB 命令启动** 使用 ADB 工具可以强制启动指定的 Launcher 应用: ```bash adb shell am start -n com.android.launcher3/.Launcher ``` 这里的 `com.android.launcher3/.Launcher` 需要替换为目标设备上的实际 Launcher 包名及其入口 Activity 名称[^1]。 2. **通过代码调用** 在应用程序中也可以通过 Intent 显式启动 Launcher: ```java Intent intent = new Intent(Intent.ACTION_MAIN); intent.addCategory(Intent.CATEGORY_HOME); intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); startActivity(intent); ``` 上述代码片段利用了标准的 `Intent` 动作 (`ACTION_MAIN`) 和类别 (`CATEGORY_HOME`) 来定位并启动当前系统的默认 Launcher。 --- #### 三、解决 Launcher 未正常启动的问题 如果遇到 Launcher 未能成功启动的情况,可以从以下几个方面排查和解决问题: 1. **屏蔽 FallbackHome 干扰** 如引用所述,FallbackHome 是一种降级处理机制,但在特定需求下可能导致用户体验不佳。可以通过修改系统源码禁用该功能: - 修改 `Settings` 中的相关逻辑,使 `FallbackHome` 不再被注册为 Home 属性的应用。 - 设置目标 Launcher 支持 Direct Boot 模式,从而绕过 FallbackHome 的介入[^3]。 2. **修复桌面图标大小不一致问题** 如果发现桌面图标显示异常(如大小与其他应用不同),需检查 Launcher 的图标加载逻辑。具体可参考如下路径调整: - 文件位置:`BaseIconFactory.java` 和 `FastBitmapDrawable.java`。 - 主要任务是对图标缩放比例进行统一控制,避免因自定义图标而导致的比例失调[^4]。 3. **验证默认 Launcher 是否正确设置** 确保系统已将目标 Launcher 正确设为默认 Home 应用。可通过以下命令确认: ```bash adb shell settings get secure home_activity ``` 若返回值为空,则说明尚未设置默认 Launcher,此时需要重新配置。 --- #### 四、自定义 Launcher 开发注意事项 对于开发者来说,创建或优化自定义 Launcher 时需要注意以下几点: 1. **声明必要的权限与属性** 自定义 Launcher 必须在其 `AndroidManifest.xml` 文件中声明支持 Home 类别的意图过滤器: ```xml <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.HOME" /> <category android:name="android.intent.category.DEFAULT" /> </intent-filter> ``` 2. **兼容 Direct Boot 模式** 若要实现开机后直接跳转至 Launcher 页面而不经过 “Android 正在启动”,则需要确保 Launcher 支持 Direct Boot 特性。这通常涉及设置 `android:directBootAware=true` 属性,并适配加密存储环境下的数据访问逻辑。 3. **性能优化** 提高 Launcher 初始化速度是提升用户体验的关键之一。建议减少首次渲染所需资源量,延迟加载非必要组件,并充分利用异步操作提高响应效率。 --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值