通过Intent打开切换应用异常:Android13仅打开不切换问题求助
问题描述
之前用这段代码能正常打开并切换到com.x.y应用,但换电脑装了最新版Android Studio后,编译没问题,运行时却只能打开该应用,没法切换到已经打开的实例;而且这问题只在Android 13设备上出现,Android 8.1设备完全正常。
原代码:
Intent intent = context.getPackageManager().getLaunchIntentForPackage("com.x.y"); if (intent != null) { // We found the activity now start the activity intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); Bundle b = new Bundle(); b.putString(_key, _data); intent.putExtras(b); //Put your id to your next Intent context.startActivity(intent); return true; }
解决办法
1. 补充Intent启动标记
Android 13对后台唤起Activity的限制更严,只加FLAG_ACTIVITY_NEW_TASK不够,得添上能唤起现有实例的标记:
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_REORDER_TO_FRONT | Intent.FLAG_ACTIVITY_RESET_TASK_IF_NEEDED);
FLAG_ACTIVITY_REORDER_TO_FRONT:直接把目标应用已有的任务栈移到前台,实现切换效果FLAG_ACTIVITY_RESET_TASK_IF_NEEDED:配合新任务标记,保证任务栈行为符合预期
2. 适配Android 13的包可见性
Android 13默认不让应用随便查其他应用的信息,得在AndroidManifest.xml里加配置:
<!-- 明确声明要访问的目标应用包名 --> <queries> <package android:name="com.x.y" /> </queries>
如果要访问多个应用,也可以用<intent>标签声明对应Intent过滤,实在需要的话再加全权限(不推荐):
<uses-permission android:name="android.permission.QUERY_ALL_PACKAGES" tools:ignore="QueryAllPackagesPermission" />
3. 检查目标应用的启动模式
看看com.x.y的主Activity启动模式是不是singleTask或singleTop,要是standard模式,每次启动都会新建实例,自然没法切换。也可以直接在启动Intent里强制指定:
intent.setFlags(intent.getFlags() | Intent.FLAG_ACTIVITY_SINGLE_TOP);
4. 直接指定目标Activity启动
有时候系统返回的启动Intent可能不符合预期,试试直接指定目标应用的主Activity类名:
try { Intent intent = new Intent(); intent.setComponent(new ComponentName("com.x.y", "com.x.y.MainActivity")); intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_REORDER_TO_FRONT); intent.putExtras(b); context.startActivity(intent); } catch (ActivityNotFoundException e) { // 处理找不到Activity的情况 }
内容的提问来源于stack exchange,提问作者DongHyeon
相关产品推荐
相关产品推荐

