在Android中将应用上下文保存到静态variables是否安全?

我知道在Android上使用静态variables是相当危险的,特别是如果你引用他们的活动。 但是,如果我有一个扩展Application的类(我们称之为“App”),那么引用这个类的实例是否安全?

如果是这样,任何其他类对应用程序上下文有任何引用也是安全的吗? 我的意思是,如果我有任何类的应用程序上下文的引用可以有内存泄漏?

目的是不pipe我在哪个范围内,我都可以获得对应用程序上下文的引用。 我认为这是安全的,因为如果系统closures了应用程序,那么静态variables也会一直到下一次应用程序再次启动,这会再次初始化静态variables。

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

作为代码的一个例子,以下是我正在考虑的内容:

public class App extends Application { private static Context _appContext; @Override public void onCreate() { super.onCreate(); _appContext = this; } public static Context getAppContext() { return _appContext; } } 

将应用程序上下文保存到静态variables是安全的吗?

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

话虽如此,Android核心团队并没有这样设置这一事实,这或许可能存在一些隐藏的问题,我们并不知道,或者将来这种方法可能会带来问题。

正如俗语的缩写, YMMV 。 🙂


编辑

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

我不知道你这里的“安全”是什么意思。

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

如果你使用多个进程,你应该打一个鳟鱼。 但是,是的,您应该为每个进程获取不同的App实例。

它应该是安全的。 此外, API文档中的以下说明可能与您有关:

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

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

请注意,不应该从活动中设置全局variables。 如果你这样做,你的应用程序可能会失败,如下所示:

  1. 在活动A中设置全局
  2. 导航到活动B
  3. 应用程序进入背景
  4. 框架杀死应用程序和进程
  5. 应用程序已恢复
  6. 框架创build活动B. 堆栈中的活动不会创build,直到你回到他们,所以没有设置全局!
  7. 活动B尝试使用全局,并繁荣… NullPointerException

当我收拾讨厌的静态上下文时,从Studiopopup一个有趣的评论:

“这是一个泄漏(也打破了即时运行)”。

所以随着即时运行的推出,我们有Android开发人员不打算保存静态variables的情况。 虽然即时运行还没有在我的议程上,但知道有一个具体的例子,不仅是不好的练习,而且是错误的用例。