我正在尝试使用OnApplicationPause函数在Unity中实现暂停功能。 当我按下home按钮退出游戏(在Android上)并通过活动应用列表回来时,它似乎工作正常,但是当我在主屏幕上按下游戏图标时,它会重新启动游戏而不是将我带回原来的界面。 有什么解决办法吗?
当我在日志中看到android.os.DeadObjectException时,就会出现这种情况(表示应用已经崩溃了)。
请检查您的日志是否有类似以下内容:
I/ActivityManager( 600): Restarting because process died: ActivityRecord{439f9588 u0 com.mycompany.myapp/com.unity3d.player.UnityPlayerProxyActivity}
W/ActivityManager( 600): Exception when starting activity com.mycompany.myapp/com.unity3d.player.UnityPlayerProxyActivity
W/ActivityManager( 600): android.os.DeadObjectException
W/ActivityManager( 600): at android.os.BinderProxy.transact(Native Method)
W/ActivityManager( 600): at android.app.ApplicationThreadProxy.scheduleLaunchActivity(ApplicationThreadNative.java:759)
W/ActivityManager( 600): at com.android.server.am.ActivityStack.realStartActivityLocked(ActivityStack.java:1120)
W/ActivityManager( 600): at com.android.server.am.ActivityStack.startSpecificActivityLocked(ActivityStack.java:1247)
如果是这样的话,请在日志中进一步查看以确定应用程序为什么会崩溃。为了避免应用程序崩溃,我必须移动意图筛选器:
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
从UnityPlayerProxyActivity到UnityPlayerNativeActivity
。
<activity android:name="your_name_here.Activity" android:label="@string/app_name" android:configChanges="fontScale|keyboard|keyboardHidden|locale|mnc|mcc|navigation|orientation|screenLayout|screenSize|smallestScreenSize|uiMode|touchscreen" android:screenOrientation="your_orientation_here_if_needed">
它应该在你回到游戏的那一点继续。如果没有,那么可能是你的游戏在从暂停返回时自动重启了。
在你的游戏中,尝试检查OnApplicationPause的状态并从那里进行调试。代码示例在这个线程中http://answers.unity3d.com/questions/286939/detecting-when-applicationdidbecomeactive-in-unity.html
你检查过 Android Manifest 中的启动模式了吗?将值设置为 android:launchMode="singleTask"。
你尝试过在将应用程序导出为Android gradle项目时操纵其生命周期吗?
你可以这样做(在Unity 2018.4.5中,其他版本可能会有所不同),勾选文件-构建设置中的导出项目,然后点击导出。你可以在Android Studio中打开生成的gradle项目,并应该找到一个名为UnityPlayerActivity
的文件,其中包含以下内容:
// Pause
@Override protected void onPause()
{
super.onPause();
mUnityPlayer.pause();
}
// Resume Unity
@Override protected void onResume()
{
super.onResume();
mUnityPlayer.resume();
}
@Override protected void onStart()
{
super.onStart();
mUnityPlayer.start();
}
@Override protected void onStop()
{
super.onStop();
mUnityPlayer.stop();
}
// Low Memory Unity
@Override public void onLowMemory()
{
super.onLowMemory();
mUnityPlayer.lowMemory();
}
// Trim Memory Unity
@Override public void onTrimMemory(int level)
{
super.onTrimMemory(level);
if (level == TRIM_MEMORY_RUNNING_CRITICAL)
{
mUnityPlayer.lowMemory();
}
}
我对此没有经验,但想向您展示可能性 :)