我有使用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时才启动子进程。对我有用。
再次,不确定我是否完全理解您的问题。希望这有帮助。