做过unity与安卓原生交互的同学应该都知道,我们在unity里面调用安卓原生的activity,按Home键返回到桌面,之后重新进入unity场景,安卓原生的activity就会被杀掉。
其实这个问题做过安卓的人都知道,这个关乎到安卓对于activity的运行机制问题,这些问题这里不想再多说了,网上有太多关于launchMode的解答例如:
如果对activity 的四种launchMode:1.standard、2.singleTop、3.singleTask、4.singleInstance不了解 可以先去查查资料。
因为unity默认程序打包出来的Androidmanifest配置android:launchMode="singleTask",一看到这里,做安卓开发的同学基本就知道了,哦原来是这里搞的鬼,所以只要将launchMode="singleTask"改成标准的launchMode="singleInstance"就可以了,因为默认就是标准的所以可以直接把这一行直接去掉。
但是你以为这样就可以了么,众所周知,安卓的手机何其之多,所以就会出现各种的定制系统,出现各种奇奇怪怪的问题也是再所难免,对于程序员来说,有bug实在是太正常不过了,我们最不怕的就是bug,只要给出相应的机子,重现出相应的bug,对我们来说就不是bug 了,而是一个丢在臭水沟的西瓜皮,烂掉只是时间的问题而已。
好了说重点,就是在将launchMode改成标准的之后在很多手机会出现这样一种情况安装完应用之后直接点击打开按钮进入游戏之后按HOME键退到桌面,再次点击应用图标进入游戏就会出现重新开始应用(其实这里是是因为重新创建主activity,才会看到重启游戏),在某些安卓发布平台就会因为这个问题而导致审核不通过,然后发给你的日志报错信息只能看到:
```
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工程,就是打包的时候将google Android project勾起来如图001,
图 001
然后,将工程用eclipse或者Android studio打开,我们这边已经有用Android studio写好模板 只要把资源复制过来就可以了。然后我这边在app下创建一个UnityMain.java来作为启动activity。只要在这里面做下判断如果游戏activity存在就不再重新启动了,脚本如下:
```
public class UnityMain extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
if (App.get().mainActivity != null) { //这里是判断应用的activity是否存在,存在的话直接结束这里,否则启动应用
finish();
} else {
Intent intent = new Intent(this, Main.class); //这里的Mian就是启动unity的类
startActivity(intent);
finish();
}
}
}
```
好了,这就是我的解决办法,如果有更好的方法也可以分享出来。