1. 程式人生 > >Android Application中的OnCreate方法執行兩次

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