You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Unity导出的普通Activity中获取androidx上下文并使用OnBackPressedDispatcher

在Unity导出的Android项目中使用AndroidX的OnBackPressedDispatcher

方案1:自定义继承ComponentActivity的Unity入口Activity

Unity允许替换默认的UnityPlayerActivity,你可以创建一个继承自ComponentActivity的自定义Activity,内部持有UnityPlayer实例,这样就能直接调用getOnBackPressedDispatcher()。

步骤:

  1. 在Android Studio项目中创建新的Java类,比如MyUnityActivity:
import android.os.Bundle;
import androidx.appcompat.app.AppCompatActivity;
import com.unity3d.player.UnityPlayer;

public class MyUnityActivity extends AppCompatActivity {
    protected UnityPlayer mUnityPlayer;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        mUnityPlayer = new UnityPlayer(this);
        setContentView(mUnityPlayer);
        mUnityPlayer.requestFocus();
    }

    // 重写UnityPlayer需要的生命周期方法
    @Override
    protected void onDestroy() {
        mUnityPlayer.destroy();
        super.onDestroy();
    }

    @Override
    protected void onPause() {
        mUnityPlayer.pause();
        super.onPause();
    }

    @Override
    protected void onResume() {
        super.onResume();
        mUnityPlayer.resume();
    }

    @Override
    public void onBackPressed() {
        // 直接使用OnBackPressedDispatcher
        getOnBackPressedDispatcher().onBackPressed();
        // 也可添加自定义回调
        // getOnBackPressedDispatcher().addCallback(this, new OnBackPressedCallback(true) {
        //     @Override
        //     public void handleOnBackPressed() {
        //         // 示例:通知Unity处理返回逻辑
        //         UnityPlayer.UnitySendMessage("GameManager", "OnAndroidBackPressed", "");
        //     }
        // });
    }
}
  1. 修改AndroidManifest.xml,将入口Activity替换为这个自定义类,确保intent-filter和原UnityPlayerActivity一致,保留Unity相关的meta-data配置。

方案2:在现有Activity中嵌入AndroidX Fragment

如果不想替换整个Activity基类,可以在UnityPlayerActivity中嵌入AndroidX Fragment,通过Fragment获取OnBackPressedDispatcher。

步骤:

  1. 自定义继承UnityPlayerActivity的类,动态添加Fragment容器:
import android.os.Bundle;
import androidx.fragment.app.FragmentContainerView;
import com.unity3d.player.UnityPlayerActivity;

public class CustomUnityPlayerActivity extends UnityPlayerActivity {
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        // 创建Fragment容器
        FragmentContainerView container = new FragmentContainerView(this);
        container.setId(R.id.fragment_container);
        // 将容器添加到UnityPlayer的视图层级
        mUnityPlayer.addView(container);
        
        // 嵌入自定义处理返回逻辑的Fragment
        getSupportFragmentManager().beginTransaction()
                .replace(R.id.fragment_container, new BackHandlerFragment())
                .commit();
    }
}
  1. 创建自定义Fragment:
import androidx.fragment.app.Fragment;
import androidx.activity.OnBackPressedCallback;

public class BackHandlerFragment extends Fragment {
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        // 通过Fragment获取OnBackPressedDispatcher并添加回调
        requireActivity().getOnBackPressedDispatcher().addCallback(this, new OnBackPressedCallback(true) {
            @Override
            public void handleOnBackPressed() {
                // 示例:通知Unity处理返回逻辑
                com.unity3d.player.UnityPlayer.UnitySendMessage("GameManager", "OnAndroidBackPressed", "");
            }
        });
    }
}

注意:这种方式需要确保Activity能调用getSupportFragmentManager(),如果默认UnityPlayerActivity不支持,还是需要让它继承AppCompatActivity(方案1的变种)。

关键说明

  • 无法直接修改Unity默认Activity的基类,但可以通过创建继承AndroidX ComponentActivity的自定义入口Activity替换原有Activity,这是Unity官方允许的方式,核心的UnityPlayer实例仅被持有在自定义Activity中,不会破坏Unity运行逻辑。
  • 普通Activity无法获取AndroidX的SupportFragmentManager,必须让Activity继承AppCompatActivity或ComponentActivity才能使用AndroidX的Fragment相关API。

内容的提问来源于stack exchange,提问作者Nith

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.21 13:03:17