如何在当前应用内启动其他多启动器应用的指定Activity?
实现方案
要启动目标应用的非默认启动入口(即额外快捷方式对应的Activity),可以通过以下两种方式实现:
方式一:查询目标应用的所有LAUNCHER Activity
Android中,应用的启动快捷方式本质上对应带有ACTION_MAIN和CATEGORY_LAUNCHER过滤规则的Activity。你可以直接查询目标包下所有符合该规则的Activity,再选择指定的启动:
- 查询所有可启动的Activity信息
// 替换为目标应用的包名 val targetPackageName = "com.example.targetapp" val queryIntent = Intent(Intent.ACTION_MAIN).apply { addCategory(Intent.CATEGORY_LAUNCHER) setPackage(targetPackageName) } // 获取所有匹配的Activity列表 val launchableActivities = packageManager.queryIntentActivities(queryIntent, 0)
返回的launchableActivities列表中,每个ResolveInfo对象包含对应Activity的名称、显示标签等信息,你可以根据这些信息给用户展示选择界面。
- 启动指定的Activity
拿到目标ResolveInfo后,构造Intent启动对应的Activity:
val targetActivity = launchableActivities[0] // 替换为你要启动的Activity索引 val launchIntent = Intent(Intent.ACTION_MAIN).apply { component = ComponentName(targetPackageName, targetActivity.activityInfo.name) addCategory(Intent.CATEGORY_LAUNCHER) // 启动外部应用Activity必须添加此flag flags = Intent.FLAG_ACTIVITY_NEW_TASK } startActivity(launchIntent)
方式二:通过ShortcutManager获取快捷方式(Android 7.1+)
如果目标应用的快捷方式是通过系统Shortcut API创建的,你可以借助ShortcutManager获取这些快捷方式的Intent并启动:
注意:Android 11及以上需要申请
QUERY_ALL_PACKAGES权限(或针对目标包的QUERY_PACKAGES权限)才能获取其他应用的快捷方式。
val shortcutManager = getSystemService(ShortcutManager::class.java) // 获取所有类型的快捷方式(动态、清单声明、固定的) val allShortcuts = shortcutManager.getShortcuts( ShortcutManager.FLAG_MATCH_DYNAMIC or ShortcutManager.FLAG_MATCH_MANIFEST or ShortcutManager.FLAG_MATCH_PINNED ) // 筛选目标应用的快捷方式 val targetAppShortcuts = allShortcuts.filter { it.intent?.component?.packageName == targetPackageName } // 启动第一个快捷方式 targetAppShortcuts.firstOrNull()?.intent?.let { it.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK) startActivity(it) }
关于跳转到外部的说明
启动其他应用的Activity必然会切换到目标应用的进程,这是Android进程隔离的设计决定的,无法在你的应用内部直接运行其他应用的Activity。
内容的提问来源于stack exchange,提问作者Jagnath reddy
相关产品推荐
相关产品推荐

