2014-12-09 16 views
0

我有使用RemoteService的AppWidget。我假設這導致我的應用程序onCreate被調用,即使我的應用程序已經運行,因爲它是從另一個進程啓動的。Android應用程序onCreate稱爲兩次AppWidget

的問題是,我的onCreate初始化幾個單身,和他們扔IllegalStateExceptions如果你嘗試重新初始化它們。我可以捕捉到這些,但是單身人士將擁有另一個應用程序的上下文。我應該在這裏做什麼?

+0

OnCreate只會在活動的每個生命週期中被調用一次。你確定它是多次調用嗎?你確定你不是自己打電話嗎? – Caner 2014-12-09 13:48:45

+0

由於AppWidget存在於另一個進程中,它將再次被調用。 – Eliezer 2014-12-09 15:50:46

回答

0

我不知道我是否理解你的問題。既然你現在有兩個進程,每個進程都會保存它自己的類實例,包括單例。但是在這種情況下,你將不能初始化一個單例,並且不應拋出IllegalStateException。

的唯一方法(我的知識範圍之內),您可以初始化一個單兩次是你在Application.onCreate嘗試兩次啓動子()。如果是這樣,解決問題是防止該過程啓動兩次。

由於進程名稱是預定的,我們可以用它們來識別其上處理當前代碼運行。下面的方法可以用來確定,如果我們應用下主進程中運行:

/** 
* check if current process is the application's main process 
*/ 
public boolean isMainProcess(Context context) { 
    String currentProcessName = null; 
    int currentPid = android.os.Process.myPid(); 
    ActivityManager am = (ActivityManager) context.getSystemService(Context.ACTIVITY_SERVICE); 
    List<ActivityManager.RunningAppProcessInfo> runningApps = am.getRunningAppProcesses(); 
    if (runningApps != null) { 
     for (ActivityManager.RunningAppProcessInfo procInfo : runningApps) { 
      if (procInfo.pid == currentPid) { 
       currentProcessName = procInfo.processName; 
      } 
     } 
    } 
    return context.getApplicationInfo().packageName.equals(currentProcessName); 
} 

上面的代碼假定進程名沒有明確在AndroidManifest.xml給出。也就是說,進程名稱是包名稱。

我曾經使用此代碼來檢查我是否應該在Application.onCreate啓動子()方法:只啓動子當isMainProcess()返回true。對我有好處。

同樣,不知道如果我完全理解你的問題。希望這可以幫助。

相關問題