Android – 在活动中embeddedUnity3d场景 – 需要注销接收器?

我一直是一个SO成员,但从来没有问过一个问题,所以在这里..

我的目标

我正在尝试做两个活动的Android应用程序。 首先是一个菜单屏幕(使用标准的Android UI元素)和一个打开游戏活动的button。 游戏活动将包含一些标准的Android UI元素和一个包含Unity 3D场景的FrameLayout。

我正在使用Unity 5和Eclipse Luna。

我正在工作

我用一个简单的button做了菜单屏幕来开始第二个活动。 我遵循这个教程,并设法让我的Unity场景embedded到我的第二个活动中。 迄今为止所有的好…

问题

我第一次开始玩游戏的时候,它可以正常工作(我可以看到我的FrameLayout中embedded了Unity场景),但是如果closures活动(返回菜单活动),然后再次启动游戏活动,则会出现此错误。 。

Activity has leaked IntentReceiver com.unity3d.player.UnityPlayer$17@41866de0 that was originally registered here. Are you missing a call to unregisterReceiver()? 

我试过了

我在网上做了很多search,看起来像我需要在onPauseonDestroy中调用这样的东西;

 m_UnityPlayer.currentActivity.unregisterReceiver(receiver); 

…但我不知道接收器是什么,所以我不能在我的unregisterReceiver调用中引用它 。 我已经尝试创build一个BroadcastReceiver,注册它,然后取消它在onPause注册,但没有任何区别。

我在统一论坛上发现了一个post ,提出了完全相同的问题,但令人沮丧的是,这个问题没有得到答复(Unity论坛上的很多问题似乎都没有得到答复,这就是为什么我带着这个问题来到这里)。

我也尝试在onDestroy中调用这个方法,但是当我closures游戏活动时,它实际上退出了我的整个应用程序。

 m_UnityPlayer.quit(); 

代码示例

这是我的游戏活动的代码(为了清楚起见,我已经删除了导入)。

 public class MyEmbeddedUnityActivity extends Activity { private UnityPlayer m_UnityPlayer; IntentFilter filter = new IntentFilter(""); private BroadcastReceiver bRec = new BroadcastReceiver() { @Override public void onReceive(Context context, Intent intent) { //String action = intent.getAction(); Log.d("", "onReceive intent: " + intent); } }; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_my_embedded_unity); if(m_UnityPlayer==null){ m_UnityPlayer = new UnityPlayer(this); int glesMode = m_UnityPlayer.getSettings().getInt("gles_mode", 1); m_UnityPlayer.init(glesMode, false); m_UnityPlayer.currentActivity.registerReceiver(bRec, filter); FrameLayout layout = (FrameLayout) findViewById(R.id.my_frame); LayoutParams lp = new LayoutParams(200, 300); layout.addView(m_UnityPlayer, 0, lp); } } public void onWindowFocusChanged(boolean hasFocus){ super.onWindowFocusChanged(hasFocus); m_UnityPlayer.windowFocusChanged(hasFocus); } @Override public void onDestroy (){ //m_UnityPlayer.quit(); m_UnityPlayer.currentActivity.unregisterReceiver(bRec); super.onDestroy(); } @Override public void onConfigurationChanged(Configuration newConfig){ super.onConfigurationChanged(newConfig); m_UnityPlayer.configurationChanged(newConfig); } @Override protected void onResume() { super.onResume(); m_UnityPlayer.resume(); } @Override protected void onPause() { super.onPause(); m_UnityPlayer.pause(); } } 

最后…

我在embeddedUnity场景中所遵循的步骤是在2011年编写的。整个过程(从Unity项目的暂存区域抓取文件并复制文件等)似乎非常糟糕且没有logging

使用Unity 5在Unity活动中embeddedUnity场景有更好的方法吗? 当然,将Unity场景添加到现有的应用程序是一个相当普遍的事情要做?

谢谢,任何帮助将不胜感激!

Solutions Collecting From Web of "Android – 在活动中embeddedUnity3d场景 – 需要注销接收器?"

所以,我做了一些更多的search,最终find了答案,就在这里!

正如在这个答案中所讨论的,将这一行添加到清单可以解决问题;

 android:process=":UnityKillsMe" 

所以清单的相关部分是这样的;

 ... <application android:allowBackup="true" android:icon="@drawable/ic_launcher" android:label="@string/app_name" android:theme="@style/AppTheme" > <activity android:name=".Studio" android:configChanges="orientation|keyboardHidden|screenSize" android:process=":UnityKillsMe" android:label="@string/title_activity_home" > </activity> ... 

这迫使游戏活动在独立的过程中启动。 这意味着你可以在activity的onDestroy方法中调用m_UnityPlayer.quit()而不closures整个应用程序。

简单的修复,但恼人的是,它似乎是完全无证的。

希望这可以帮助别人!