天天看點

關于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;
}           

繼續閱讀