我有一个使用RemoteService的AppWidget。我假设这会导致我的应用程序onCreate被调用,即使我的应用程序已经在运行,因为它是从另一个进程启动的。
问题是,我在onCreate中初始化了一些单例,如果你再次尝试初始化它们,它们会抛出IllegalStateExceptions。我可以抓住那些,但单身人士将拥有其他应用程序的上下文。我该怎么办?
答案 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时才启动子进程。对我有用。
再次,不确定我是否完全理解你的问题。希望这会有所帮助。