Android内置多个launcher设置默认launcher

本文探讨了如何在Android系统中避免开机时选择launcher提示框的问题。通过分析高通和MTK平台的不同代码实现,提出了一种改动较小的方法。在高通7.1版本中,可以通过SetupWizard进行设置,而在MTK 6.0版本中,可以在Provision应用的AndroidManifest.xml中添加共享用户ID,并在DefaultActivity中初始化launcher。

Android设置默认launcher

前言

launcher因为开机即启动,若添加默认launcher过早则可能导致其他进程崩溃,添加过晚则起不到启动默认设置的效果且会弹出选择launcher的提示框.
查看了一些其他的修改方法,均需在ActivityManagerService.java的startHomeActivityLocked添加默认启动,但是发现添加后,若系统存在多个launcher apk,则仍然会弹出launcher选择提示框.经过几天折腾,发现一个比较简便且改动不大的方法.
主要思路是发现某些OS自带的apk也添加了

<category android:name="android.intent.category.HOME" />

的响应,且设置了 priority=“1”,则可以保证该应用在Launcher启动前就运行起来.

以下为具体code修改.

高通 code

7.1版本
若有编译 SetupWizard则使用此方法,无则使用 mtk code方法.
vendor\qcom\proprietary\qrdplus\Extension\apps\SetupWizard\src\com\qualcomm\qti\setupwizard\SetupWelcomeActivity.java

private static final String ORIGINAL_LAUNCHER_PACKAGENAME = "com.android.launcher3";//设置为定制的包名
private static final String ORIGINAL_LAUNCHER_CLASSNAME = "com.android.launcher3.Launcher";//设置为定制的类名

MTK code

6.0版本
packages\apps\Provision\AndroidManifest.xml
添加 android:sharedUserId=“android.uid.system”

packages\apps\Provision\src\com\android\provision\DefaultActivity.java
onCreate()方法添加

 if(SystemProperties.getInt("persist.sys.defualt.launcher",0)==0)//一次性使用系统变量,为免后续重复
<think>我们正在处理用户关于在Android 14系统中将第三方Launcher设置默认的询问。根据用户提供的引用资料以及Android系统的一般机制,我们可以梳理出设置默认Launcher的方法。 用户提供的引用中提到了几个关键点: 1.Android 9.0中,当系统内置两个Launcher时,可以通过修改ResolverActivity.java来默认设置Launcher3的那个为默认。 2. 在定制Launcher时,需要在AndroidManifest.xml中正确配置intent-filter,特别是`android.intent.category.HOME`。 3. Launcher的启动由AMS(ActivityManagerService)在系统就绪后启动。 但是,用户现在询问的是Android 14系统,且是设置第三方Launcher(非系统内置,可能是用户安装的)为默认。因此,我们不需要修改系统代码(如ResolverActivity.java),而是通过系统提供的用户交互方式或者命令方式(如adb)来设置。 在Android系统中,设置默认Launcher的标准方法是: 1. 用户安装第三方Launcher后,当按下Home键时,系统会弹出一个选择器(ResolverActivity),让用户选择使用哪个Launcher,并可以选择“始终”或“仅一次”。 2. 如果用户选择了“始终”,则下次按Home键就会直接启动该Launcher。 但用户可能不希望弹出选择器,或者希望以静默方式设置(例如在自动化测试或企业设备管理中)。这时,我们可以通过以下几种方法: 方法一:通过adb命令设置默认LauncherAndroid系统中,我们可以使用adb命令来设置默认Launcher。具体步骤如下: - 首先,找到要设置默认Launcher的包名和主Activity名。例如,假设第三方Launcher的包名是`com.example.my.launcher`,主Activity是`.MainActivity`,那么完整的组件名是`com.example.my.launcher/.MainActivity`。 - 然后,使用以下adb命令: ``` adb shell cmd package set-home-activity [COMPONENT] ``` 其中`[COMPONENT]`替换为上面提到的组件名。例如: ``` adb shell cmd package set-home-activity "com.example.my.launcher/.MainActivity" ``` 方法二:通过设备策略控制器(Device Policy Controller, DPC)设置(适用于企业设备管理) 如果设备由企业设备管理应用管理,则可以通过设备策略控制器设置默认主屏幕应用。具体可参考Android的Device Administration API。 方法三:在系统代码中修改(适用于ROM定制) 如果用户是系统开发人员,正在定制ROM,希望在系统内置时就将第三方Launcher设置默认,那么需要修改系统代码。常见做法: 1. 将第三方Launcher预置到系统中(放到/system/app或/system/priv-app目录下)。 2. 在系统启动时,设置默认的Home应用。这通常在PackageManagerService中处理,可以通过修改默认的Home应用列表,或者修改系统启动时选择Home应用的逻辑。 但是,根据用户提供的引用[1],在Android 9.0中是通过修改ResolverActivity.java来实现跳过选择并直接设置Launcher3的Launcher。在Android 14中,这个逻辑可能已经改变,但基本原理类似。然而,对于第三方Launcher,我们通常不建议修改系统代码(除非是系统开发者),因为这会破坏系统的可更新性。 因此,对于普通用户或开发者,推荐使用adb命令的方式。 另外,根据引用[2],确保第三方LauncherAndroidManifest.xml中正确声明了HOME的intent-filter: ```xml <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.HOME" /> <category android:name="android.intent.category.DEFAULT" /> <category android:name="android.intent.category.MONKEY" /> </intent-filter> ``` 注意:在Android 14中,可能还需要注意权限问题,例如需要REQUEST_SET_HOME_ACTIVITY权限(这个权限是系统权限,普通应用无法获取,因此只能通过adb或系统应用来设置)。 总结回答: 在Android 14中,设置第三方Launcher默认的方法: 1. 通过用户交互:安装第三方Launcher后,按Home键,选择该Launcher并选择“始终”。 2. 通过adb命令(需要USB调试开启): - 使用命令:`adb shell cmd package set-home-activity "com.example.my.launcher/.MainActivity"` 3. 通过设备策略管理(企业部署)。 4. 系统定制:预置到系统并修改系统代码使其成为默认(适用于ROM定制)。 特别注意:从Android 10(API 29)开始,普通应用无法通过`PackageManager.setComponentEnabledSetting`来设置默认Launcher,因此使用adb命令或系统级修改是主要方式。 根据用户的问题,他可能需要的是非系统定制的方法(即用户安装的第三方Launcher),因此推荐使用adb命令。 生成相关问题: 1. 如何获取第三方Launcher的包名和主Activity名? 2.Android 14中,adb命令设置默认Launcher需要什么条件? 3. 如果系统已经设置默认Launcher,如何重置选择? 4.Android 14中,普通应用能否以编程方式设置默认Launcher? </think>### 在Android 14系统中将第三方Launcher设置默认的方法 #### 核心原理 在Android系统中,Launcher作为系统启动入口由AMS(ActivityManagerService)管理,其默认选择逻辑取决于应用的`android.intent.category.HOME`声明和系统解析规则[^4]。Android 14延续了此机制,但需注意权限和配置的变化。 --- ### 具体方法 #### 方法1:通过用户交互设置(推荐) 1. **安装第三方Launcher** 确保第三方Launcher已安装(如通过ADB或应用商店) 2. **触发默认设置流程** - 按下设备的**Home键** - 系统会弹出选择对话框:"选择主屏幕应用" - 选择目标Launcher → 点击**始终** #### 方法2:ADB命令强制设置(需调试模式) ```bash adb shell cmd package set-home-activity [包名]/[主Activity全路径] ``` **示例**: ```bash adb shell cmd package set-home-activity com.example.my.launcher/com.example.my.launcher.MainActivity ``` > 需开启USB调试,此命令绕过用户交互直接生效 #### 方法3:定制系统固件(ROM开发者) 1. **修改Launcher声明** 在第三方Launcher的`AndroidManifest.xml`中强化声明: ```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] 2. **屏蔽系统选择器** 修改系统逻辑(参考`ResolverActivity.java`): ```java // 在shouldSkipItem()中添加过滤逻辑 if (isSystemLauncher(item)) { return true; // 跳过系统Launcher } ``` [^1] 3. **调整默认配置** 在`default_workspace.xml`中将第三方Launcher设为默认screen: ```xml <favorite launcher:screen="0" ... /> <!-- 0表示主屏 --> ``` [^3] --- ### 注意事项 1. **权限限制** Android 14加强了权限管理: - 普通应用无法修改`SET_HOME_ACTIVITY`权限 - 系统级修改需`platform`签名或root权限 2. **多Launcher冲突** 若保留系统Launcher,需确保: ```xml <category android:name="android.intent.category.HOME" /> ``` 仅在第三方Launcher中声明,避免系统弹出选择器[^1] 3. **首次启动逻辑** AMS在`systemReady()`阶段会检测有效HOME应用,确保第三方Launcher已预装到`/system/priv-app`[^4] --- ### 验证方法 ```bash adb shell dumpsys activity activities | grep -E "mResumedActivity|mHomeActivity" ``` 输出应包含第三方Launcher的组件名: ``` mHomeActivity: ActivityRecord{... com.example.my.launcher} ``` ---
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值