重写Application类并通过静态变量访问它是否安全



在我的android应用程序中,我正在覆盖应用程序类,如下所示。

public class MyApplication extends Application {
private static MyApplication instance = null;
@Override
public void onCreate() {
super.onCreate();
instance = this;
}
public static MyApplication getInstance(){
return instance;
}
}

我这样做是为了在配置更改之间保持与应用程序上下文相关的stuf(比如我用应用程序上下文创建并在整个应用程序上使用的数据库连接),并在不需要活动对象(Activity.getApplication())的情况下访问应用程序实例。

现在的问题是,保持应用程序的静态实例是否有负面影响?我的意思是,根据我的理解,在调用Application.onCreate()之后(应该只发生一次),MyApplication.getInstance()永远不应该返回null。这是真的吗?

此外,在安卓系统上有没有任何方法可以多次启动应用程序实例(而不会杀死旧实例)?若有,在第二个实例声明后,我的静态instance变量将指向什么?我猜,因为它们将是不同的过程,每个过程都指向自己的应用程序,但我不能确定。

附言:我不是在问覆盖应用程序类,我已经知道Dianne Hackborn(一位安卓框架工程师)说没有必要覆盖应用程序,使用Singleton应该没问题。问题更多的是关于应用程序生命周期和保持静态变量。

简短的回答是,是的,它是安全的。

在启动应用程序中的任何其他组件之前,都会加载应用程序类并调用onCreate(),因此在应用程序的每个组件(活动、服务、数据库等)中都保证有一个实例。

内存泄漏方面的另一种安全性也很好,因为你在整个应用程序中都使用这种静态。唯一需要记住的是,只要应用程序进程正在运行,静态就会在内存中。

只要您的应用程序从不在多个进程中运行,它是安全的。每个进程的应用程序有严格的一比一比例。因此,2个进程意味着2个应用程序实例。

最新更新