将应用程序上下文保存到Android中的静态变量是否安全?

and*_*per 45 static android process android-context

我知道在Android上使用静态变量是非常危险的,特别是如果你将它们引用到活动中.但是,如果我有一个扩展Application的类(让我们称这个类为"App"),引用这个类的实例是否安全?

如果是这样,任何其他类是否也可以安全地对应用程序上下文进行任何类型的引用?我的意思是,如果我在任何类中引用应用程序上下文,是否会出现内存泄漏?

目的是无论我在哪个范围内,我总能得到对应用程序上下文的引用.我认为这是安全的,因为如果系统关闭了应用程序,静态变量也会消失,直到下次应用程序再次启动时,这将再次初始化静态变量.

此外,并不重要,但如果我使用多个进程,我会在每个进程上获得完全不同的App类引用吗?

作为代码的一个例子,这是我在想的:

public class App extends Application
{
    private static Context _appContext;

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

    public static Context getAppContext()
    {
        return _appContext;
    }
}
Run Code Online (Sandbox Code Playgroud)

Com*_*are 28

将应用程序上下文保存到静态变量是否安全?

目前,是的,它似乎是安全的,虽然我不会有getAppContext()回报Context,而是返回AppApplication.

话虽如此,核心Android团队首先没有以这种方式设置它的事实表明,可能存在我们不知道的隐藏问题,或者将来这种方法可能会引入问题.

正如这句话的首字母缩写词,YMMV.:-)


编辑

如果是这样,任何其他类对应用程序上下文有任何引用也是安全的吗?

我不明白你这里的"安全"是什么意思.

但如果我使用多个进程,我会在每个进程上获得完全不同的App类引用,对吧?

如果你使用多个过程,你应该被鳟鱼打耳光.但是,是的,你应该App为每个进程获得不同的实例.


Dhe*_*.S. 7

它应该是安全的.此外,API文档中的以下注释可能与您相关:

通常不需要子类Application.在大多数情况下,静态单例可以以更模块化的方式提供相同的功能.如果你的单例需要一个全局上下文(例如注册广播接收器),那么检索它的函数可以给出一个Context.getApplicationContext()在首次构造单例时内部使用的Context .

  • @androiddeveloper,如果您认为CommonsWare已经说过,请给我一个具体的链接.他对这个问题的回答并不等同于你之前的陈述.另外,你甚至尝试过我建议的测试吗?对不起,我不在乎任何一个用户有多少声誉.测试是一项测试.运行测试,亲眼看看. (2认同)

Kev*_*ede 5

这样做是安全的,Application#onCreate()因为Application是在任何活动之前创建的。如果您的应用程序在后台被杀死,Application则将重新创建实例,并在任何活动运行之前设置您的全局变量。

请务必注意,您不应从活动中设置全局变量。如果这样做,您的应用程序可能会以下列方式失败:

  1. 在活动 A 中设置全局
  2. 导航到活动 B
  3. 应用程序进入后台
  4. 框架杀死应用程序和进程
  5. 应用已恢复
  6. 框架创建活动 B。 在返回堆栈中的活动直到您导航回它们时才会创建,因此未设置全局!
  7. Activity B 尝试使用 global 和 boom... NullPointerException