由于极光推送对8.0的支持问题,升级到了最新版本的极光推送。但是最新版本的极光推送,默认将推送服务设置到了新的进程里面,由此引发
Android 极光推送多进程造成的application运行两次
和其他的在主线程运行的APP发生启动失败的错误。Application的onCreate,在多进程的状态下,会调用多次的,但是,远程进程里面没有那个类,所以,报错。
报错信息如下
要解决此问题,有两个方式
1.设置极光推送服务到主线程
2.在application个中判断是不是当前应用进程,只有在主进程的时候才允许绑定在主进程中进行的操作,如绑定IM服务
示例代码如下:
1. 去掉多创建的进程
<!-- Required SDK 核心功能--> <!-- 可配置android:process参数将PushService放在其他进程中 --> <service android:name="cn.jpush.android.service.PushService" android:process="" android:exported="false" tools:node="replace"> <intent-filter> <action android:name="cn.jpush.android.intent.REGISTER" /> <action android:name="cn.jpush.android.intent.REPORT" /> <action android:name="cn.jpush.android.intent.PushService" /> <action android:name="cn.jpush.android.intent.PUSH_TIME" /> </intent-filter> </service>
2.在application个中判断是不是当前应用进程
//获取进程名字 private String getCurrentProcessName() { String currentProcName = ""; int pid = android.os.Process.myPid(); ActivityManager manager = (ActivityManager) this.getSystemService(Context.ACTIVITY_SERVICE); for (ActivityManager.RunningAppProcessInfo processInfo : manager.getRunningAppProcesses()) { if (processInfo.pid == pid) { currentProcName = processInfo.processName; break; } } return currentProcName; } String currentProcessName = getCurrentProcessName(); if (getPackageName().equals(currentProcessName)) { onAppCreate(); }
在修改applicationId后,前面提到的IDE自动生成的类(譬如R、BuildConfig),包名不会被更新,仍然是AndroidManifest.xml中定义的包名,使用他们的类中的import语句也不需要更改,但在修改applicationId之后,查看运行时进程名,会变成新的applicationId。在程序内运行时调用Context.getPackageName(),得到的仍然是新的applicationId,所以可以根据获取的报名来判断是不是应用当前的进程
参考文档:https://droidyue.com/blog/2017/01/15/android-multiple-processes-summary/
关于 Android 应用多进程的整理