
本文介绍如何通过 intent 选择器绕过系统默认应用设置,强制向用户展示所有可处理指定 uri 的已安装应用(如 chrome、firefox、edge),从而恢复手动选择能力。
本文介绍如何通过 intent 选择器绕过系统默认应用设置,强制向用户展示所有可处理指定 uri 的已安装应用(如 chrome、firefox、edge),从而恢复手动选择能力。
在 Android 开发中,当用户对某类 Intent(例如 Intent.ACTION_VIEW + HTTP/HTTPS URI)执行“始终使用”操作后,系统会将该应用设为默认处理器,后续同类请求将直接启动该应用,不再弹出应用选择器(App Chooser)。这虽提升体验,却牺牲了灵活性——尤其在需要用户动态切换浏览器或调试多端兼容性时。
要打破这一限制,关键不是修改系统默认设置(需用户手动清除默认项),而是通过 Intent.createChooser() 构建一个显式的选择界面,并主动规避默认绑定机制。以下是推荐实现方式:
val uri = Uri.parse("https://example.com")
val intent = Intent(Intent.ACTION_VIEW, uri).apply {
addFlags(Intent.FLAG_ACTIVITY_NEW_TASK)
}
// 创建带标题的通用选择器
val chooserIntent = Intent.createChooser(intent, "Open with")
// 【核心步骤】清空历史默认偏好,确保所有匹配 Activity 均参与筛选
chooserIntent.putExtra(
Intent.EXTRA_EXCLUDE_COMPONENTS,
emptyArray<componentname>()
)
// 兼容性补充:确保在非 Activity 上下文中也能启动(如 Service 或 BroadcastReceiver)
chooserIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK)
startActivity(chooserIntent)</componentname>
✅ 关键说明:
远程控制 Android 设备,支持截图、自动化操作手机 App 等功能。本应用使用 uiautomator2 作为底层框架,通过 ADB 连接设备,用户无需 Root(1)查看手机屏幕;(2)自动化操作手机 App;(3)远程安装/卸载应用……
-
Intent.EXTRA_EXCLUDE_COMPONENTS传入空数组,是绕过默认应用的核心技巧。它告诉系统:不主动排除任何已注册ACTION_VIEW+ 匹配dataScheme(如http/https)的 Activity,从而让所有符合条件的应用重新出现在选择列表中。 -
Intent.createChooser()本身已隐式禁用默认行为,但加上EXTRA_EXCLUDE_COMPONENTS可进一步确保兼容性(尤其在 Android 12+ 及部分 OEM 定制系统上更可靠)。 - 不需要调用
PackageManager.resolveActivity()预检——选择器会自动过滤出真正能处理该 URI 的应用,无效项不会显示。
⚠️ 注意事项:
- 此方法不会清除用户已设置的全局默认应用,仅本次启动绕过;用户下次点击链接仍会走默认流程。若需彻底重置,需引导用户进入「设置 → 应用 → 默认应用 → 浏览器」手动清除。
- 确保目标 URI 的 scheme 和 host 符合目标 App 的
intent-filter声明(如 Chrome 支持https://*,而某些深度链接需额外android-app://scheme)。 - 在
Application或Service中调用时,务必添加FLAG_ACTIVITY_NEW_TASK,否则抛出AndroidRuntimeException。
通过该方案,你既能尊重用户原有默认偏好,又能在必要场景(如分享、调试、多浏览器测试)中提供完整的应用选择权,兼顾用户体验与开发可控性。










