Unity Android插件启动第三方应用后按返回键无法返回原应用求助
解决方案
现有逻辑无效的核心原因有两个:
- 你启动第三方应用时加了
FLAG_ACTIVITY_NEW_TASK标记,会把目标应用放到独立的新任务栈中,此时你的Unity应用处于后台任务栈,按返回键只会在目标应用的任务栈内导航,不会回到你的应用- 你的
LaunchOtherApp继承了Activity但从来没有被启动到前台,所以它的onBackPressed方法永远不会被系统触发,写的finish()自然无效
具体修改方案
你不需要自己实现返回键监听逻辑,只需要修改启动Intent的配置,让目标应用运行在你的Unity应用的任务栈中即可,按返回键系统会自动关闭目标应用回到你的Unity界面。
修改后的完整代码如下:
// 不需要继承Activity,普通单例类即可 public class LaunchOtherApp { protected static final String LOGTAG = "MyApp"; private static final LaunchOtherApp ourInstance = new LaunchOtherApp(); public static LaunchOtherApp getInstance() { return ourInstance; } public LaunchOtherApp(){ Log.i(LOGTAG,"Created LaunchOtherApp"); } public void Launch(final String pack) { // 直接拿Unity的当前Activity跑逻辑 Activity unityActivity = UnityPlayer.currentActivity; unityActivity.runOnUiThread(new Runnable() { @Override public void run() { Intent intent = new Intent(); intent.setPackage(pack); PackageManager pm = unityActivity.getPackageManager(); List<ResolveInfo> resolveInfos = pm.queryIntentActivities(intent, 0); Collections.sort(resolveInfos, new ResolveInfo.DisplayNameComparator(pm)); if (resolveInfos.size() > 0) { try { ResolveInfo launchable = resolveInfos.get(0); ActivityInfo activity = launchable.activityInfo; ComponentName name = new ComponentName(activity.applicationInfo.packageName, activity.name); Intent launchIntent = new Intent(Intent.ACTION_MAIN); // 去掉FLAG_ACTIVITY_NEW_TASK,只保留重置任务的标记 launchIntent.setFlags(Intent.FLAG_ACTIVITY_RESET_TASK_IF_NEEDED); launchIntent.setComponent(name); launchIntent.addCategory(Intent.CATEGORY_LAUNCHER); // 直接用Unity Activity启动,不要用ApplicationContext unityActivity.startActivity(launchIntent); } catch (SecurityException e) { Intent launchIntent = pm.getLaunchIntentForPackage(pack); launchIntent.setFlags(Intent.FLAG_ACTIVITY_RESET_TASK_IF_NEEDED); launchIntent.addFlags(Intent.FLAG_ACTIVITY_BROUGHT_TO_FRONT); launchIntent.addCategory(Intent.CATEGORY_LAUNCHER); unityActivity.startActivity(launchIntent); } } } }); } }
修改要点说明
- 移除了
LaunchOtherApp对Activity的继承,删除了无效的onBackPressed方法,避免不必要的资源占用 - 全程使用
UnityPlayer.currentActivity作为上下文启动目标应用,不使用ApplicationContext - 移除了启动标记中的
FLAG_ACTIVITY_NEW_TASK,确保目标应用的Activity直接压入Unity应用的当前任务栈 - 统一给启动Intent添加了
CATEGORY_LAUNCHER,提升兼容性
修改完成后测试:启动第三方应用后按返回键,会直接关闭第三方应用回到Unity界面,符合需求。
内容的提问来源于stack exchange,提问作者Hope1_
相关产品推荐
相关产品推荐

