Application相关之坑

最近在接入腾讯云的维纳斯(长连接,推送)服务的时候,业务需求是,需要用某个接口中间的某个字段来控制服务端是否使用维纳斯服务,如果不使用,就启动我们项目之中原来的心跳,如果使用,就关闭心跳,用维纳斯服务,所以自己做了某个开关控制维纳斯是否可用。但是在实际项目中维纳斯服务总是无缘无故的“服务主动断开”,有时候会主动重连有的时候不会主动重连上,在官网给的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) {

     }
   } 
}

 

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值