版權聲明:本文為部落客原創文章,未經部落客允許不得轉載。 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;
}