Unity中Android 觸發(fā)home,回收覆蓋在UnityPlayerActivity上層的activity的問(wèn)題

問(wèn)題

最近在開(kāi)發(fā)一個(gè)Android SDK的項(xiàng)目,提供給游戲方接入,發(fā)現(xiàn)游戲是unity引擎;正常游戲都是只有一個(gè)activity(繼承UnityPlayerActivity),但是SDK業(yè)務(wù)交互上需要特定場(chǎng)景會(huì)彈出一個(gè)或者多個(gè)新的activity在UnityPlayerActivity上,這個(gè)時(shí)候如果安卓手機(jī)點(diǎn)擊home回到桌面,再點(diǎn)擊圖標(biāo)返回,發(fā)現(xiàn)除了UnityPlayerActivity,其他的activity都被回收了。

分析

將打包的apk解析出AndroidManifest.xml發(fā)現(xiàn),UnityPlayerActivity在AndroidManifest.xml中的launchMode是singleTask,發(fā)現(xiàn)問(wèn)題了。

天真的想法一
一開(kāi)始天真的我發(fā)現(xiàn),修改一下項(xiàng)目的AndroidManifest.xml中的UnityPlayerActivity的launchMode就ok了。
修改之后,重新運(yùn)行項(xiàng)目,相同的操作,問(wèn)題還是存在;于是我又重新反編譯解析出apk的AndroidManifest.xml,驚訝的發(fā)現(xiàn):在AndroidManifest.xml中的UnityPlayerActivity的launchMode還是singleTask,沒(méi)有變化。后面,發(fā)現(xiàn)unityplayerActivity的launchMode是沒(méi)有辦法通過(guò)項(xiàng)目的修改

天真的想法二
接上面的情況,我想應(yīng)該是unity在打包默認(rèn)模板配置死了,所以直接到unity的安裝目錄下去查找

image.png

安卓目錄下的AndroidManifest.xml:

<?xml version="1.0" encoding="utf-8"?>
<manifest
    xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.unity3d.player"
    xmlns:tools="http://schemas.android.com/tools"
    android:installLocation="preferExternal"
    android:versionCode="1"
    android:versionName="1.0">
    <supports-screens
        android:smallScreens="true"
        android:normalScreens="true"
        android:largeScreens="true"
        android:xlargeScreens="true"
        android:anyDensity="true"/>

    <application
        android:theme="@style/UnityThemeSelector"
        android:icon="@drawable/app_icon"
        android:label="@string/app_name">
        <activity android:name="com.unity3d.player.UnityPlayerActivity"
                  android:label="@string/app_name">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
            <meta-data android:name="unityplayer.UnityActivity" android:value="true" />
        </activity>
    </application>
</manifest>

然并卵,因?yàn)檫@邊UnityPlayerActivity并沒(méi)有設(shè)置launchMode;但是心存僥幸的我,嘗試的在這個(gè)AndroidManifest.xml中給UnityPlayerActivity加上launchMode,然后重新unity打包apk,發(fā)現(xiàn)歷史總是驚人的相似,結(jié)果還是不行

解決

發(fā)現(xiàn)上面的兩個(gè)方法都不行,回到問(wèn)題本質(zhì),就是singleTask的問(wèn)題,再看AndroidManifest.xml的代碼

 <activity android:name="com.unity3d.player.UnityPlayerActivity"
                  android:label="@string/app_name">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
            <meta-data android:name="unityplayer.UnityActivity" android:value="true" />
        </activity>

代碼中發(fā)現(xiàn)了個(gè)問(wèn)題,于是我嘗試了,把UnityPlayerActivity切換成其他的activity是不會(huì)打包成singleTask的launchMode,所以,其實(shí)unity的打包是只針對(duì)UnityPlayerActivity的,游戲主窗口才會(huì)設(shè)置成singleTask。
于是乎,我們幫啟動(dòng)頁(yè)面的activity改掉,不設(shè)置為UnityPlayerActivity
擼碼

  • 新建啟動(dòng)Activity(LaunchActivity):
public class LaunchActivity extends Activity {

  public static LaunchActivity launchActivity = null;
  @Override
  protected void onCreate(Bundle bundle) {
    super.onCreate(bundle);
    launchActivity = this;
    if(MainPluginActivity.mainActivity == null)  {
      Intent intent = new Intent(this, MainPluginActivity.class);
      startActivity(intent);
    }else {
      finish();
    }
  }
}
  • 創(chuàng)建一個(gè)Activity繼承UnityPlayerActivity:
public class MainPluginActivity extends UnityPlayerActivity {

  public static MainPluginActivity mainActivity = null;
  @Override
  protected void onCreate(Bundle bundle) {
    super.onCreate(bundle);
    mainActivity = this;
  }
}
  • AndroidManifest的配置:
    <activity android:name="com.xxxx.fcm.sdk.LaunchActivity"
      android:screenOrientation="portrait">
      <intent-filter>
        <action android:name="android.intent.action.MAIN"/>

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

    <activity android:name="com.xxxx.fcm.sdk.MainPluginActivity"
      tools:replace="android:launchMode, android:screenOrientation"
      android:launchMode="singleInstance"
      android:screenOrientation="portrait">
      <meta-data android:name="unityplayer.UnityActivity" android:value="true" />
    </activity>

這樣做就可以跳過(guò)被home回收的問(wèn)題了。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

友情鏈接更多精彩內(nèi)容