Android应用程序onCreate称为Twice AppWidget

时间:2014-12-09 13:31:41

标签: android singleton android-service android-appwidget

我有一个使用RemoteService的AppWidget。我假设这会导致我的应用程序onCreate被调用,即使我的应用程序已经在运行,因为它是从另一个进程启动的。

问题是,我在onCreate中初始化了一些单例,如果你再次尝试初始化它们,它们会抛出IllegalStateExceptions。我可以抓住那些,但单身人士将拥有其他应用程序的上下文。我该怎么办?

1 个答案:

答案 0 :(得分:0)

我不确定我是否理解你的问题。由于您现在有两个进程,每个进程将拥有自己的类实例,包括单例。但在这种情况下,您将无法初始化单例两次,并且不应抛出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时才启动子进程。对我有用。

再次,不确定我是否完全理解你的问题。希望这会有所帮助。