覆盖应用程序类并通过静态变量访问它是不是安全?

Posted

技术标签:

【中文标题】覆盖应用程序类并通过静态变量访问它是不是安全?【英文标题】:Is overriding Application class and access it through static variable safe?覆盖应用程序类并通过静态变量访问它是否安全? 【发布时间】:2013-12-25 00:22:14 【问题描述】:

在我的 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.getApplication())。

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

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

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

【问题讨论】:

考虑到您要保留的“东西”与上下文无关,它根本不必与Application 类绑定。我会用静态方法制作一种ClassWiring 类,它将单例实例返回给你的“东西”。 (将此添加为评论,因为它没有回答您的实际问题)。 抱歉刚刚意识到,我也保留(应用程序)上下文相关的东西。编辑了问题。 【参考方案1】:

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

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

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

【讨论】:

【参考方案2】:

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

【讨论】:

感谢您的回答,但您是否注意到这个问题已经很老了? :)

以上是关于覆盖应用程序类并通过静态变量访问它是不是安全?的主要内容,如果未能解决你的问题,请参考以下文章

WebApp 中的静态 ThreadLocal 变量 - 是不是存在任何安全/性能问题?

在函数中创建类并访问在包含函数范围内定义的函数

sonarqube 社区版是不是提供任何类型的静态应用程序安全测试

JDK源码(二十):ThreadLocal

同时覆盖具有相同值的变量是不是安全?

如何从应用程序域中所有加载的程序集中获取所有静态类并使用反射调用静态方法