如何以编程方式将设备默认启动器重置为系统出厂默认设置?
编程切换回系统默认启动器的可行方案
你只调用clearPackagePreferredActivities仅会清除当前应用的偏好启动设置,不会主动为系统启动器配置默认处理权限,因此按下Home键时系统找不到匹配的默认启动器,自然会弹出选择弹窗。要实现目标效果,可参考以下适配不同系统版本的方案:
步骤1:获取系统默认启动器的包名
首先需要通过包管理器查询系统中支持HOME意图的应用,过滤掉自身应用后即可得到系统自带启动器的包名,示例代码如下:
fun getSystemLauncherPackageName(context: Context): String? { val homeIntent = Intent(Intent.ACTION_MAIN).addCategory(Intent.CATEGORY_HOME) val resolveInfoList = context.packageManager.queryIntentActivities(homeIntent, PackageManager.MATCH_DEFAULT_ONLY) // 过滤自身应用,取第一个匹配项即为系统默认启动器 for (info in resolveInfoList) { if (info.activityInfo.packageName != context.packageName) { return info.activityInfo.packageName } } return null }
Java实现逻辑完全一致,仅语法存在差异。
步骤2:按系统版本适配切换逻辑
- Android 9(API 28)及更低版本
若你的应用持有android.permission.SET_PREFERRED_APPLICATIONS权限(该权限仅对系统预装应用、和系统签名一致的应用开放,普通第三方应用无法申请),可直接调用addPreferredActivity方法将系统启动器设置为HOME意图的默认处理方:val systemLauncherPkg = getSystemLauncherPackageName(context) ?: return val homeIntent = Intent(Intent.ACTION_MAIN).addCategory(Intent.CATEGORY_HOME) val targetComponent = ComponentName( systemLauncherPkg, homeIntent.resolveActivity(context.packageManager).className ) val filter = IntentFilter(Intent.ACTION_MAIN).apply { addCategory(Intent.CATEGORY_HOME) addCategory(Intent.CATEGORY_DEFAULT) } context.packageManager.addPreferredActivity( filter, IntentFilter.MATCH_CATEGORY_EMPTY, arrayOf(targetComponent), targetComponent ) - Android 10(API 29)及更高版本
系统已禁止第三方应用通过公开API直接修改默认应用配置,普通应用无法实现静默切换,只能引导用户手动到系统设置页完成修改:
如果你的应用是系统预装机或持有系统签名,可以通过反射调用隐藏API完成静默设置,但该方案不兼容普通第三方应用场景。// 直接跳转系统默认启动器设置页面 val intent = Intent(Settings.ACTION_HOME_SETTINGS) context.startActivity(intent)
注意事项
普通第三方应用如果没有系统级权限,无法实现绕过用户授权直接切换默认启动器的效果,所有声称可以实现该效果的非常规方案均不符合安卓权限管控规则,存在版本兼容性风险。
内容的提问来源于stack exchange,提问作者Aescaru
相关产品推荐
相关产品推荐

