Android应用程序onCreate调用了两次AppWidget

Android应用程序onCreate调用了两次AppWidget,android,singleton,android-service,android-appwidget,Android,Singleton,Android Service,Android Appwidget,我有一个使用RemoteService的AppWidget。我假设这会导致调用我的应用程序onCreate,即使我的应用程序已经在运行,因为它是从另一个进程启动的 问题是,我在onCreate中初始化了一些单例,如果您再次尝试初始化它们,它们会抛出非法状态异常。我可以捕捉到这些,但是单例将拥有另一个应用程序的上下文。我在这里该怎么办?我不知道我是否理解你的问题。由于您现在有两个进程,每个进程都将拥有自己的类实例,包括单实例。但是在这种情况下,您将无法两次初始化一个单例,并且不应该抛出Illega

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


问题是,我在onCreate中初始化了一些单例,如果您再次尝试初始化它们,它们会抛出非法状态异常。我可以捕捉到这些,但是单例将拥有另一个应用程序的上下文。我在这里该怎么办?

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


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

OnCreate在活动的每个生命周期中只调用一次。你确定它被多次调用了吗?您确定您自己没有调用它吗?因为AppWidget存在于另一个进程中,它将再次被调用。