您的位置:首页 > 移动开发 > Android开发

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

2016-01-13 16:45 721 查看
最近在做公司项目的时候,遇到了一个很怪的问题,就是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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: