我找不到令人满意的答案,所以我们开始:这是怎么回事Activity/Service.getApplication()
and Context.getApplicationContext()
?
在我们的应用程序中,两者都返回相同的对象。在一个ActivityTestCase
然而,嘲笑该应用程序将使getApplication()
带着模拟回来,但是getApplicationContext
仍然会返回一个不同的上下文实例(由 Android 注入的实例)。这是一个错误吗?是故意的吗?
我什至一开始就不明白其中的区别。在测试套件之外是否存在两个调用可能返回不同对象的情况?什么时候以及为什么?此外,为什么是getApplication
定义于Activity
and Service
,但不是在Context
?不应该总是有一个有效的应用程序实例可用吗anywhere?
非常有趣的问题。我觉得主要是语义上的,也可能是历史原因造成的。
尽管在当前的 Android Activity 和 Service 实现中,getApplication()
and getApplicationContext()
返回相同的对象,不能保证情况总是如此(例如,在特定供应商实现中)。
所以如果你想要你在Manifest中注册的Application类,你应该never call getApplicationContext()
并将其投射到您的应用程序,因为它可能不是应用程序实例(您显然在测试框架中经历过)。
为什么getApplicationContext()
首先存在吗?
getApplication()
仅在 Activity 类和 Service 类中可用,而getApplicationContext()
在 Context 类中声明。
这实际上意味着一件事:在广播接收器中编写代码时,它不是上下文,但在其 onReceive 方法中给出了上下文,您只能调用getApplicationContext()
。这也意味着不能保证您能够访问 BroadcastReceiver 中的应用程序。
查看 Android 代码时,您会发现附加时,活动会接收基本上下文和应用程序,而这些是不同的参数。getApplicationContext()
代表它的电话baseContext.getApplicationContext()
.
另一件事:文档说,在大多数情况下,您不需要子类化应用程序:
通常不需要子类化Application
。在大多数情况下,
静态单例可以以更加模块化的方式提供相同的功能
方式。如果您的单例需要全局上下文(例如注册
广播接收器),检索它的函数可以给出Context
其内部使用Context.getApplicationContext()
什么时候
首先构建单例。
我知道这不是一个准确的答案,但这仍然可以回答您的问题吗?
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)