You need to enable JavaScript to run this app. Unity Android插件启动第三方应用后按返回键无法返回原应用求助
优惠活动
大模型
产品
解决方案
定价
更多

Unity Android插件启动第三方应用后按返回键无法返回原应用求助

解决方案

现有逻辑无效的核心原因有两个:

  1. 你启动第三方应用时加了FLAG_ACTIVITY_NEW_TASK标记,会把目标应用放到独立的新任务栈中,此时你的Unity应用处于后台任务栈,按返回键只会在目标应用的任务栈内导航,不会回到你的应用
  2. 你的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_

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.14 03:18:03