关于Android中的onCreate()多次被调用导致bindService被多次调用的问题

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/u010046908/article/details/50511776
                最近在做公司项目的时候,遇到了一个很怪的问题,就是Application的onCreate()方法多次被调用,
   导致bindService被多次调用,以致于程序出现ANR。
   
   问题描述:
            用于某些需要,我在onCreate()方法中bindService,产生ANR。
   说明部分:
           每个android应用都要运行在一个虚拟机上,当应用配置了两个进程时,其实是有两个虚拟机在运行,一个前台的应用进程,一个service后台进程,每个进程对应一个application对象,所以当应用配置了多个进程的时候,application对象的onCreate方法就会执行多次,所以如果在application的onCreate方法中开启轮询或者初始化大量数据时,其实是要做出区分的处理的.
   

   解决方法:

   我们已经知道每个进程对应一个application对象,为了避免浪费资源,我们可以在application中通过进程的名称来区分具体应该

   加载哪些资源,执行哪些具体逻辑。


   

 if (getApplicationInfo().packageName.equals(getCurProcessName(getApplicationContext()))) {
try {
Intent bindIntent = new Intent(this, BJYCBleService.class);
       bindService(bindIntent, mServiceConnection, Context.BIND_AUTO_CREATE);
Log.d("ggggggggggggggg", "消息模板展示");
} catch (Exception e) {
e.printStackTrace();
}
}
}


这样的话,就算onCreate方法多次调用,只会执行该代码块一次。从此 ,bindService就只被调用了一次。
从此消除了ANR。

/*
* 获取正在运行的进程名称
    * @param context
    * @return
    */
public static String getCurProcessName(Context context) {
int pid = android.os.Process.myPid();
ActivityManager activityManager = (ActivityManager) context
.getSystemService(Context.ACTIVITY_SERVICE);
for (ActivityManager.RunningAppProcessInfo appProcess : activityManager
.getRunningAppProcesses()) {
if (appProcess.pid == pid) {
return appProcess.processName;
}
}
return null;
}


上一篇:第二十四章 MySQL导入数据常见报错解决


下一篇:XCTF-WEB新手题day2