在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
,而是返回App
或Application
。
话虽如此,Android核心团队并没有这样设置这一事实,这或许可能存在一些隐藏的问题,我们并不知道,或者将来这种方法可能会带来问题。
正如俗语的缩写, YMMV 。 🙂
编辑
如果是这样,其他任何类对应用程序上下文有任何引用也是安全的吗?
我不知道你这里的“安全”是什么意思。
但是如果我使用多个进程,我将在每个进程上获得完全不同的App类的引用,对吗?
如果你使用多个进程,你应该打一个鳟鱼。 但是,是的,您应该为每个进程获取不同的App
实例。
它应该是安全的。 此外, API文档中的以下说明可能与您有关:
通常不需要子类
Application
。 在大多数情况下,静态单例可以以更模块化的方式提供相同的function。 如果你的单例需要一个全局上下文(例如注册广播接收者),那么检索它的函数可以被赋予一个Context,它在第一次构造单例时在内部使用Context.getApplicationContext()
。
在Application#onCreate()
这样做是安全的,因为Application
是在任何活动之前创build的。 如果您的应用程序在后台被杀害, Application
实例将被重新创build,您的全局将在任何活动运行之前被设置。
请注意,不应该从活动中设置全局variables。 如果你这样做,你的应用程序可能会失败,如下所示:
- 在活动A中设置全局
- 导航到活动B
- 应用程序进入背景
- 框架杀死应用程序和进程
- 应用程序已恢复
- 框架创build活动B. 堆栈中的活动不会创build,直到你回到他们,所以没有设置全局!
- 活动B尝试使用全局,并繁荣…
NullPointerException
当我收拾讨厌的静态上下文时,从Studiopopup一个有趣的评论:
“这是一个泄漏(也打破了即时运行)”。
所以随着即时运行的推出,我们有Android开发人员不打算保存静态variables的情况。 虽然即时运行还没有在我的议程上,但知道有一个具体的例子,不仅是不好的练习,而且是错误的用例。