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

标签 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 releted stuf(比如我用 applicationcontext 创建并在整个应用程序上使用的数据库连接)和访问应用程序实例而不需要 Activity 对象(Activity.getApplication( )).

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

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

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

最佳答案

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

在应用程序中的任何其他组件启动之前,应用程序类被加载并调用 onCreate(),因此在应用程序的每个组件(Activity、Service、Database 等)中,您都可以得到保证有一个实例。

考虑到您在整个应用程序中都在使用此静态,就内存泄漏而言,另一种安全类型也很好。唯一要记住的是,只要应用程序进程在运行,静态就会在内存中。

关于java - 重写 Application 类并通过静态变量访问它是否安全?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20768058/

相关文章:

android - 如何将像素转换为 DP 以进行 android 布局?

android - 当应用程序进入后台时如何检测以前的 Activity

Android为多个 Activity 存储Socket.io对象

java - 带有 JFreeChart 的 Eclipse RCP

java - 如何列出当前目录中的文件?

android - Firebase电话号码认证,每次验证码都过期

swift - 如何在进入后台或恢复到前台时重定向到主屏幕

java - 为 POS 打印机编写正确的 ESC/POS 命令

java - 第二次运行方法时出现"No such element"错误

android - 在 Android 中使用 BroadcastReceiver 检查网络连接