? ? ? ?做過unity與安卓原生交互的同學(xué)應(yīng)該都知道,我們在unity里面調(diào)用安卓原生的activity,按Home鍵返回到桌面,之后重新進入unity場景,安卓原生的activity就會被殺掉。
? ? ? ? 其實這個問題做過安卓的人都知道,這個關(guān)乎到安卓對于activity的運行機制問題,這些問題這里不想再多說了,網(wǎng)上有太多關(guān)于launchMode的解答例如:
http://blog.csdn.net/liuhe688/article/details/6754323/
如果對activity 的四種launchMode:1.standard、2.singleTop、3.singleTask、4.singleInstance不了解 可以先去查查資料。
因為unity默認(rèn)程序打包出來的Androidmanifest配置android:launchMode="singleTask",一看到這里,做安卓開發(fā)的同學(xué)基本就知道了,哦原來是這里搞的鬼,所以只要將launchMode="singleTask"改成標(biāo)準(zhǔn)的launchMode="singleInstance"就可以了,因為默認(rèn)就是標(biāo)準(zhǔn)的所以可以直接把這一行直接去掉。
? ? ? ? 但是你以為這樣就可以了么,眾所周知,安卓的手機何其之多,所以就會出現(xiàn)各種的定制系統(tǒng),出現(xiàn)各種奇奇怪怪的問題也是再所難免,對于程序員來說,有bug實在是太正常不過了,我們最不怕的就是bug,只要給出相應(yīng)的機子,重現(xiàn)出相應(yīng)的bug,對我們來說就不是bug 了,而是一個丟在臭水溝的西瓜皮,爛掉只是時間的問題而已。
? ? ? ? 好了說重點,就是在將launchMode改成標(biāo)準(zhǔn)的之后在很多手機會出現(xiàn)這樣一種情況安裝完應(yīng)用之后直接點擊打開按鈕進入游戲之后按HOME鍵退到桌面,再次點擊應(yīng)用圖標(biāo)進入游戲就會出現(xiàn)重新開始應(yīng)用(其實這里是是因為重新創(chuàng)建主activity,才會看到重啟游戲),在某些安卓發(fā)布平臺就會因為這個問題而導(dǎo)致審核不通過,然后發(fā)給你的日志報錯信息只能看到:
```
07-21 14:17:15.714 632-632/? A/DEBUG: *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** ***
07-21 14:17:15.714 632-632/? A/DEBUG: Build fingerprint: 'Xiaomi/land/land:6.0.1/MMB29M/V8.2.3.0.MALCNDL:user/release-keys'
07-21 14:17:15.714 632-632/? A/DEBUG: Revision: '0'
07-21 14:17:15.714 632-632/? A/DEBUG: ABI: 'arm'
07-21 14:17:15.714 632-632/? A/DEBUG: pid: 25450, tid: 25721, name: UnityMain? >>> com.sinyee.babybus.shadow <<<
07-21 14:17:15.714 632-632/? A/DEBUG: signal 11 (SIGSEGV), code 1 (SEGV_MAPERR), fault addr 0xdc
07-21 14:17:15.726 632-632/? W/debuggerd: type=1400 audit(0.0:1386133): avc: denied { search } for name="com.sinyee.babybus.shadow" dev="dm-1" ino=138908 scontext=u:r:debuggerd:s0 tcontext=u:object_r:app_data_file:s0:c512,c768 tclass=dir permissive=0
07-21 14:17:15.768 632-632/? A/DEBUG:? ? r0 00000000? r1 00000001? r2 df7d1a30? r3 00000000
07-21 14:17:15.769 632-632/? A/DEBUG:? ? r4 e140bc20? r5 df7d13e4? r6 df7d13e8? r7 df7d1510
07-21 14:17:15.769 632-632/? A/DEBUG:? ? r8 efc2a101? r9 df7d1510? sl 00000001? fp df7d138c
07-21 14:17:15.769 632-632/? A/DEBUG:? ? ip df7d1a90? sp df7d1218? lr e12ff97c? pc e109b154? cpsr a00f0010
07-21 14:17:15.773 632-632/? A/DEBUG: backtrace:
07-21 14:17:15.773 632-632/? A/DEBUG:? ? #00 pc 00021154? /data/app/com.sinyee.babybus.shadow-1/lib/arm/libmono.so
07-21 14:17:15.773 632-632/? A/DEBUG:? ? #01 pc 001f2738? /data/app/com.sinyee.babybus.shadow-1/lib/arm/libmono.so (mono_runtime_invoke+136)
07-21 14:17:15.773 632-632/? A/DEBUG:? ? #02 pc 003e93a0? /data/app/com.sinyee.babybus.shadow-1/lib/arm/libunity.so
07-21 14:17:15.773 632-632/? A/DEBUG:? ? #03 pc 0034e548? /data/app/com.sinyee.babybus.shadow-1/lib/arm/libunity.so
07-21 14:17:15.773 632-632/? A/DEBUG:? ? #04 pc 000f78e8? /data/app/com.sinyee.babybus.shadow-1/lib/arm/libunity.so
07-21 14:17:15.773 632-632/? A/DEBUG:? ? #05 pc 00387998? /data/app/com.sinyee.babybus.shadow-1/lib/arm/libunity.so
07-21 14:17:15.774 632-632/? A/DEBUG:? ? #06 pc 0038d1e0? /data/app/com.sinyee.babybus.shadow-1/lib/arm/libunity.so
07-21 14:17:15.774 632-632/? A/DEBUG:? ? #07 pc 004e2c58? /data/app/com.sinyee.babybus.shadow-1/lib/arm/libunity.so
07-21 14:17:15.774 632-632/? A/DEBUG:? ? #08 pc 01167eeb? /data/app/com.sinyee.babybus.shadow-1/oat/arm/base.odex (offset 0xa1e000)
```
乍一看,啊,是unity原生層報錯,這他媽怎么搞,難道去反編譯unity的.so來看,不僅麻煩還不一定看的懂。
我的解決方法:
將unity項目打成eclipse工程,就是打包的時候?qū)oogle Android project勾起來如圖001,

然后,將工程用eclipse或者Android studio打開,我們這邊已經(jīng)有用Android studio寫好模板 只要把資源復(fù)制過來就可以了。然后我這邊在app下創(chuàng)建一個UnityMain.java來作為啟動activity。只要在這里面做下判斷如果游戲activity存在就不再重新啟動了,腳本如下:
```
public class UnityMain extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
? ? super.onCreate(savedInstanceState);
? ? ?if (App.get().mainActivity != null) { //這里是判斷應(yīng)用的activity是否存在,存在的話直接結(jié)束這里,否則啟動應(yīng)用
? ? finish();
? ?} else {
? ?Intent intent = new Intent(this, Main.class); //這里的Mian就是啟動unity的類
? ?startActivity(intent);
? ?finish();
? ? }
? }
}
```
好了,這就是我的解決辦法,如果有更好的方法也可以分享出來。