簡體   English   中英

Android應用程序onCreate調用了兩次AppWidget

[英]Android Application onCreate Called Twice AppWidget

我有一個使用RemoteService的AppWidget。 我假設這會導致我的應用程序onCreate被調用,即使我的應用程序已經在運行,因為它是從另一個進程啟動的。

問題是,我在onCreate中初始化了幾個單例,如果嘗試再次初始化它們,它們將拋出IllegalStateExceptions。 我可以抓住這些,但是單例將具有其他應用程序的上下文。 我應該在這里做什么?

我不確定是否理解您的問題。 由於您現在有兩個進程,因此每個進程將擁有自己的類實例,包括單例。 但是在這種情況下,您將無法兩次初始化一個單例,並且不應引發IllegalStateExceptions。

(據我所知)可以兩次初始化一個單例的唯一方法是,您嘗試在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時啟動子進程。 對我有用。

同樣,不確定我是否完全理解您的問題。 希望這可以幫助。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM