在做接口優(yōu)化的時候發(fā)現(xiàn)APP 的Application 的onCreate方法被執(zhí)行了好幾次,導(dǎo)致在onCreate里面做了一些初始化的操作被重復(fù)執(zhí)行了多次,打斷點無果,但抓包卻真的存在,這令我十分尷尬。。。事后才發(fā)現(xiàn)有一些第三方組件,它們是單獨開了一個進(jìn)程
解決辦法根據(jù)進(jìn)程名進(jìn)行初始化過濾,Application 的onCreate 里只初始化一次。
解決方法一:
判斷當(dāng)前進(jìn)程是主進(jìn)程才執(zhí)行初始化代碼.
Android避免多進(jìn)程Application onCreate中初始化代碼執(zhí)行多次
if (TextUtils.equals(getCurrentProcessName(this), getPackageName())) {
init();//判斷成功后才執(zhí)行初始化代碼
}
private String getCurrentProcessName(Context context) {
int pid = android.os.Process.myPid();
ActivityManager mActivityManager = (ActivityManager) context
.getSystemService(Context.ACTIVITY_SERVICE);
for (ActivityManager.RunningAppProcessInfo appProcess : mActivityManager
.getRunningAppProcesses()) {
if (appProcess.pid == pid) {
return appProcess.processName;
}
}
return null;
}
解決方法二:
內(nèi)容摘自:Android多進(jìn)程時Application初始化問題,大坑
public class MyApplication extends Application {
private final static String PROCESS_NAME = "com.test";
private static MyApplication myApplication = null;
public static MyApplication getApplication() {
return myApplication;
}
/**
* 判斷是不是UI主進(jìn)程,因為有些東西只能在UI主進(jìn)程初始化
*/
public static boolean isAppMainProcess() {
try {
int pid = android.os.Process.myPid();
String process = getAppNameByPID(MyApplication.getApplication(), pid);
if (TextUtils.isEmpty(process)) {
return true;
} else if (PROCESS_NAME.equalsIgnoreCase(process)) {
return true;
} else {
return false;
}
} catch (Exception e) {
e.printStackTrace();
return true;
}
}
/**
* 根據(jù)Pid得到進(jìn)程名
*/
public static String getAppNameByPID(Context context, int pid) {
ActivityManager manager = (ActivityManager) context.getSystemService(Context.ACTIVITY_SERVICE);
for (android.app.ActivityManager.RunningAppProcessInfo processInfo : manager.getRunningAppProcesses()) {
if (processInfo.pid == pid) {
return processInfo.processName;
}
}
return "";
}
@Override
public void onCreate() {
super.onCreate();
myApplication = this;
if (isAppMainProcess()) {
//do something for init
}
}
}