使用另一个活动恢复Unity3d Android应用程序

mrp*_*qal 5 resume android unity-game-engine android-intent android-activity

我需要解决以下问题:

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

  • Recently used apps屏幕 - 应用程序正在恢复到相同的状态,当它被最小化(这是我期望发生);
  • 来自发射器,是什么导致游戏UnityPlayerNativeActivity正在恢复,失去所有其他活动,已经打开了它.

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

你是否知道如何将这个Unity活动从启动器中带回到它之上的所有活动,因为它是在最小化它的同时?

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

mrp*_*qal 2

事实证明,解决方案非常简单,但并不那么明显。

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

    <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>
Run Code Online (Sandbox Code Playgroud)

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

    android:clearTaskOnLaunch="true"
    android:launchMode="singleTask"
Run Code Online (Sandbox Code Playgroud)

当我将它们更改为:

    android:clearTaskOnLaunch="false"
    android:launchMode="standard"
Run Code Online (Sandbox Code Playgroud)

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

正确的参数应设置如下:

    <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>
Run Code Online (Sandbox Code Playgroud)

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