Android Application中的OnCreate方法執行兩次
在Application中開啟了一個子執行緒,但是每次子執行緒都會執行兩次,非常鬱悶。
這時候看它執行兩次的時候就去驗證他的大方法是否執行了兩次,然後發現執行緒建立了兩次;
再看他的大方法執行了幾次,它的大方法就是OnCreate方法,雖然我覺得它不會執行兩次,但是我們一定要進行排除,否則任何一種情況都會出現。
所以打了個Log發現OnCreate方法也執行了兩次。
這就找到根由了,所以在網上找了Application的OnCreate方法為什麼會執行兩次,就解決了。
因為這次卡殼了一天,所以就寫下來記錄一下,這裡有兩點需要注意,
第一就是找錯的方法,一定要逐個排查,把它們的值打出來,在你找到錯誤地方之前任何一個地方都是有可能出錯的,不要覺得某個地方一定不會出錯;
第二個就是這個知識點,下邊記錄一下。
以下為轉載內容,附上原地址:http://blog.csdn.net/chy555chy/article/details/51374603
在做"個推"時發現官方文件中有這麼一個註釋:
該方法必須在Activity或Service類內呼叫,一般情況下,可以在Activity的onCreate()方法中呼叫。由於應用每啟動一個新的程序,就會呼叫一次Application的onCreate()方法,而個推SDK是一個獨立的程序,因此如果在Application的onCreate()中呼叫intialize介面,會導致SDK初始化在一個應用中多次呼叫,所以不建議在Application繼承類中呼叫個推SDK初始化介面。
解釋一下,每個Android應用都要執行在一個虛擬機器上,”個推“採用Service和後臺伺服器通訊進行通訊,於是和原本的Activity就形成了多程序。一個前臺的應用程序,一個service後臺程序,每個程序對應一個application物件,所以當應用配置了多個程序的時候,application物件的onCreate方法就會執行多次,所以為了保證只初始化一次,就必須做出區分的處理的(“個推”中提到的在Activity或Service中初始,這種做法個人認為也是存在多次初始化的風險的);
程序名是通過Manifest.xml中的"android:process"屬性設定的,因此可以在application的onCreate方法中通過pid獲取processName,再做進一步的判斷(跟android:process的值進行判斷)使得相關初始化程式碼僅執行一次。
在application中新增如下程式碼:
@Override public void onCreate() { // TODO Auto-generated method stub super.onCreate(); String processName = getProcessName(this, android.os.Process.myPid()); if(processName != null){ boolean defaultProcess = processName.equals("com.qebang.ui"); if(defaultProcess){ //當前應用的初始化 initApp(); } } }
public static String getProcessName(Context cxt, int pid) {
ActivityManager am = (ActivityManager) cxt.getSystemService(Context.ACTIVITY_SERVICE);
List<RunningAppProcessInfo> runningApps = am.getRunningAppProcesses();
if (runningApps == null) {
return null;
}
for (RunningAppProcessInfo procInfo : runningApps) {
if (procInfo.pid == pid) {
return procInfo.processName;
}
}
return null;
}