最近在接入腾讯云的维纳斯(长连接,推送)服务的时候,业务需求是,需要用某个接口中间的某个字段来控制服务端是否使用维纳斯服务,如果不使用,就启动我们项目之中原来的心跳,如果使用,就关闭心跳,用维纳斯服务,所以自己做了某个开关控制维纳斯是否可用。但是在实际项目中维纳斯服务总是无缘无故的“服务主动断开”,有时候会主动重连有的时候不会主动重连上,在官网给的demo里面测试不会出现这种情况,经过多方排查,基本确定是在项目中由于多进程原因引起的。如果android的项目中开启多进程,会造成自定义的Application的onCreate方法走多次。如果需要避免的话,我们就需要将原来在onCreate中初始化的代码做一个主进程的校验(如果多次初始化没影响,也无所谓,最好还是校验一下)。
/**
* 处理进程相关的操作
*/
public class ProcessUtil {
public static boolean isMainProcessOpera(Application context){
return context.getPackageName().equals
(getCurrentProcessName(context));
}
/**
* 当前进程的名称
* @return
*/
private static String getCurrentProcessName(Application context) {
if(context == null){
return "";
}
int pid = android.os.Process.myPid();
String processName = "";
ActivityManager manager = (ActivityManager) context.getSystemService(Context.ACTIVITY_SERVICE);
for (ActivityManager.RunningAppProcessInfo process : manager.getRunningAppProcesses()) {
if (process.pid == pid) {
processName = process.processName;
}
}
return processName;
}
}
上面getCurrentProcessName 是获取当前进程的名称,isMainProcessOpera是校验是否是主进程(和你的包名相同的进程)操作。
我们一般开发app的时候不会是多进程,但是一般我们引入第三放的sdk有的时候就会造成多进程,比如友盟push,上面的维纳斯服务,还有相信大部分人都会用到的LeakCanary(内存泄漏检测)的,都会创建自己的独立的进程,有的时候,在Application里面的初始化操作,也可能在这些进程中进行,耗费资源,严重的时候,可能多次初始化,造成业务逻辑的混乱,查找问题很难定位,所以,多进程开发的时候,特别得注意,以此来记录,避免以后重复踩坑。
附:阿里巴巴android开发手册中一条强制执行的规定
[强制]在Application的业务初始化代码假如进程判断,确保只在自己需要的进程初始化。特别是后台进程减少不必要的业务初始化。
public class MyApplication extends Application {
@Override
public void onCreate() {
//在所有进程中初始化 ....
//仅在主进程中初始化
if (mainProcess) {
}
//仅在后台进程中初始化
if (bgProcess) {
}
}
}