恢复 Unity3d Android 应用程序并在其上放置另一个 activity

Restoring Unity3d Android application with another activity on top

我需要解决以下问题:

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

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

你知道我如何将这个 Unity activity 从启动器 恢复到 并且所有活动都在它上面,就像最小化它时一样吗?

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

您可能会发现此博客 post 有用:

http://inthecheesefactory.com/blog/understand-android-activity-launchmode/en

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

事实证明,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"。我设法通过反编译应用程序并从这些更改的资源中重建来更改和检查它。请问有没有什么优雅的方法可以设置这个值