问题:
游戏接入sdk的自定义的Application时,发现Application的onCreate方法被调用了两次,导致设备的激活数据请求了两次,影响激活数据的统计。
原因:
每个android应用都要运行在一个虚拟机上,当应用配置了两个进程时,其实是有两个虚拟机在运行,一个前台的应用进程,一个service后台进程,每个进程对应一个application对象,所以当应用配置了多个进程的时候,application对象的onCreate方法就会执行多次,所以如果在application的onCreate方法中开启轮询或者初始化大量数据时,其实是要做出区分的处理的
解决:
我们已经知道每个进程对应一个application对象,为了避免请求两次激活,我们可以在application中通过进程的名称来判断只执行一次激活接口就行。
/** * 获得当前进程的名字 * * @param context * @return 进程号 */ private static String getCurProcessName(Context context) { int pid = android.os.Process.myPid(); Log.e("tag","===进程id==:"+pid); ActivityManager activityManager = (ActivityManager) context.getSystemService(Context.ACTIVITY_SERVICE); for (ActivityManager.RunningAppProcessInfo appProcess : activityManager .getRunningAppProcesses()) { if (appProcess.pid == pid) { return appProcess.processName; } } return null; }
/** * 判断是否是当前同一线程 * @param context * @return */ public static boolean isCurProcess(Context context){ if(!TextUtils.isEmpty(getCurProcessName(context))) { if (getCurProcessName(context).equals(context.getPackageName())) { Log.e("tag","===进程==:"+getCurProcessName(context)); return true; } }else{ return false; } return false; }
判断调用激活接口
if(ConfigUtil.isCurProcess(context)){ activeGameData(); }