如何在Unity导出的普通Activity中获取androidx上下文并使用OnBackPressedDispatcher
在Unity导出的Android项目中使用AndroidX的OnBackPressedDispatcher
方案1:自定义继承ComponentActivity的Unity入口Activity
Unity允许替换默认的UnityPlayerActivity,你可以创建一个继承自ComponentActivity的自定义Activity,内部持有UnityPlayer实例,这样就能直接调用getOnBackPressedDispatcher()。
步骤:
- 在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", ""); // } // }); } }
- 修改
AndroidManifest.xml,将入口Activity替换为这个自定义类,确保intent-filter和原UnityPlayerActivity一致,保留Unity相关的meta-data配置。
方案2:在现有Activity中嵌入AndroidX Fragment
如果不想替换整个Activity基类,可以在UnityPlayerActivity中嵌入AndroidX Fragment,通过Fragment获取OnBackPressedDispatcher。
步骤:
- 自定义继承
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(); } }
- 创建自定义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
相关产品推荐
相关产品推荐

