android - 使用顶部的另一个 Activity 恢复 Unity3d Android 应用程序

标签 android android-intent android-activity unity3d resume

我需要解决以下问题:

UnityPlayerNativeActivity 我开始一个标准的 Android Activity (可能是我的,可能是来自广告网络的广告 - 没关系)。当通过按 home 按钮隐藏游戏并将此 Activity 隐藏在顶部(不是 Unity Activity )时,作为用户,我有两种恢复它的方法:

  • 最近使用的应用程序屏幕 - 应用程序正在恢复到最小化时的相同状态(这是我期望发生的情况);
  • 在启动器中,导致游戏 UnityPlayerNativeActivity 的原因正在恢复,但丢失了在其上打开的所有其他 Activity 。

这些 Activity 以某种方式丢失了(以一种我不完全知道的方式,它们发生了什么)。我的游戏逻辑取决于那里发生的过程的结果,即。我需要知道,此特定 Activity 已以任何特定方式退出(例如提供回调)。

你知道我如何将这个 Unity Activity 从启动器带回它上面的所有 Activity ,就像最小化它一样吗?

我想了解从 Recently used screen 和启动器恢复应用程序的方式之间的区别。我猜它与 AndroidManifest.xml 文件中的 intent-filter 部分有关,该文件包含在 UnityPlayerNativeActivity 条目中。

最佳答案

结果证明解决方案非常简单,但不是那么明显。

事实证明,Unity 默认生成的 AndroidManifest.xml 配置导致了这个问题。对于从启动器启动的主要 Activity ,定义了以下参数(取自反编译的应用程序):

    <activity 
        android:alwaysRetainTaskState="true"
        android:clearTaskOnLaunch="true"
        android:configChanges="locale|fontScale|keyboard|keyboardHidden|mcc|mnc|navigation|orientation|screenLayout|screenSize|smallestScreenSize|touchscreen|uiMode" 
        android:label="@string/app_name" 
        android:launchMode="singleTask" 
        android:name="com.unity3d.player.UnityPlayerNativeActivity" 
        android:screenOrientation="fullSensor" 
        launchMode="singleTask">

        <meta-data android:name="unityplayer.ForwardNativeEventsToDalvik" android:value="true"/>

        <intent-filter>
            <action android:name="android.intent.action.MAIN"/>
            <category android:name="android.intent.category.LAUNCHER"/>
            <category android:name="android.intent.category.LEANBACK_LAUNCHER"/>
        </intent-filter>
    </activity>

问题行为是由这两个参数引起的:

    android:clearTaskOnLaunch="true"
    android:launchMode="singleTask"

当我将它们更改为:

    android:clearTaskOnLaunch="false"
    android:launchMode="standard"

然后应用程序从启动器正常恢复。

正确的参数应该设置如下:

    <activity 
        android:alwaysRetainTaskState="true" 
        android:clearTaskOnLaunch="false"
        android:configChanges="locale|fontScale|keyboard|keyboardHidden|mcc|mnc|navigation|orientation|screenLayout|screenSize|smallestScreenSize|touchscreen|uiMode" 
        android:label="@string/app_name" 
        android:launchMode="standard" 
        android:name="com.unity3d.player.UnityPlayerNativeActivity" 
        android:screenOrientation="fullSensor" 
        launchMode="standard">

        <meta-data android:name="unityplayer.ForwardNativeEventsToDalvik" android:value="true"/>

        <intent-filter>
            <action android:name="android.intent.action.MAIN"/>
            <category android:name="android.intent.category.LAUNCHER"/>
            <category android:name="android.intent.category.LEANBACK_LAUNCHER"/>
        </intent-filter>
    </activity>

注意:虽然我可以为这个 Activity 显式设置值 android:clearTaskOnLaunch="false",但是 launchMode 参数将被 Unity3d 强制设置为 "singleTask"。我设法通过反编译应用程序并从这些更改的资源中重建来更改和检查它。我想知道是否有任何优雅的方式来设置这个值。

关于android - 使用顶部的另一个 Activity 恢复 Unity3d Android 应用程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31611670/

相关文章:

java - 如何将文件存储在我的 Android 模拟设备上,然后从我的程序中访问它?

java - 退出后杀死应用程序进程吗?

java - 如何通过 Intent 共享多个文件?

android - 启动谷歌地图应用

Android应用程序和Activity之间的静态存储

android - 如何在android中使用finish()方法

Android - 捏缩放触摸事件坐标

java - 使用数组而不是缓冲区加载 Android OpenGL ES 2.0 纹理

java - 通过 'if (position == x)' 方法更改 ListView 项目的文本颜色

android - 如何从所有其他 fragment 导航到特定 fragment ?