問(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的安裝目錄下去查找

安卓目錄下的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)題了。