Android编程实现打开其他应用且不重置应用状态的方法
解决方案
问题出在getLaunchIntentForPackage()本质是启动应用的主入口Activity,无论目标应用之前处于什么状态,都会强制回到主界面。要保留应用的操作上下文,需要优先恢复它的现有任务栈,而非重新启动主入口。
方法1:恢复目标应用的后台任务栈
通过系统服务获取当前运行的应用任务,找到目标应用的任务并将其调至前台,这是最直接保留上下文的方式:
val appPackageName = "com.target.app" val activityManager = getSystemService(Context.ACTIVITY_SERVICE) as ActivityManager // 遍历所有应用任务,查找目标包的任务 for (task in activityManager.appTasks) { val taskInfo = task.taskInfo if (taskInfo.baseActivity?.packageName == appPackageName) { // 将目标任务调至前台,保留原有操作上下文 task.moveToFront() return } } // 如果目标应用没有后台任务,再用启动Intent打开(带FLAG避免重置) val intent = packageManager.getLaunchIntentForPackage(appPackageName) intent?.addFlags(Intent.FLAG_ACTIVITY_REORDER_TO_FRONT) startActivity(intent)
权限说明
- Android 11及以上:需要在
AndroidManifest.xml中添加包查询权限,要么声明特定目标应用:
要么申请全量包查询权限(仅在必要时使用):<queries> <package android:name="com.target.app" /> </queries><uses-permission android:name="android.permission.QUERY_ALL_PACKAGES" />
方法2:使用FLAG_ACTIVITY_REORDER_TO_FRONT
如果无法获取后台任务(比如权限受限),可以给启动Intent添加FLAG_ACTIVITY_REORDER_TO_FRONT标记:
val intent = packageManager.getLaunchIntentForPackage(appPackageName) intent?.addFlags(Intent.FLAG_ACTIVITY_REORDER_TO_FRONT) startActivity(intent)
这个标记会让系统查找目标应用的现有任务栈,若存在则将其顶部Activity调至前台;若不存在,则正常启动主界面。
内容的提问来源于stack exchange,提问作者DeveloBär
相关产品推荐
相关产品推荐

