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

时间:2013-12-25 00:22:15

标签: java android application-lifecycle application-singleton

在我的Android应用程序中,我重写了如下所示的Application类。

public class MyApplication extends Application {

    private static MyApplication instance = null;

    @Override
    public void onCreate() {
        super.onCreate();
        instance = this;
    }

    public static MyApplication getInstance(){
        return instance;
    }
}

我这样做是为了让我的applicationcontext与配置更改之间的stuf(就像我使用applicationcontext创建并在整个应用程序上使用的数据库连接一样)和访问应用程序实例而不需要活动对象(Activity.getApplication())。

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

Android上是否有任何方法可以多次启动Application实例(不会删除旧实例)?如果存在,我的静态instance变量在第二个实例声明后会指向什么?我猜,因为它们将是不同的过程,每个都指向它自己的应用程序,但我不能确定。

PS:我不是要求覆盖Application类,我已经知道Dianne Hackborn(Android框架工程师)说没有必要覆盖Application类,使用Singletons应该没问题。问题更多的是关于应用程序生命周期和保持静态变量。

2 个答案:

答案 0 :(得分:1)

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

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

内存泄漏方面的其他类型的安全性也很好,因为您在整个应用程序中使用此静态。唯一要记住的是,只要应用程序进程正在运行,静态就会在内存中。

答案 1 :(得分:1)

it is safe, as long as your application never runs in multiple processes. there's a strict one to one ratio of application per process. So, 2x processes means 2x application instances.