getApplication()与getApplicationContext()
我无法找到一个令人满意的答案,所以我们来看看: Activity/Service.getApplication()
和Context.getApplicationContext()
怎么处理的?
在我们的应用程序中,两个都返回同一个对象 然而,在ActivityTestCase
中,嘲讽应用程序将使getApplication()
返回模拟,但getApplicationContext
仍将返回不同的上下文实例(由Android注入)。 这是一个错误? 这是故意的吗?
我甚至都不了解其中的差异。 在测试套件之外是否存在两个呼叫可能返回不同对象的情况? 何时和为什么? 此外, getApplication
为什么在Activity
和Service
上定义,而不是在Context
? 不应该总是有从任何地方有效的应用程序实例吗?
非常有趣的问题。 我认为这主要是一种语义,也可能是由于历史原因。
尽管在当前的Android Activity和Service实现中, getApplication()
和getApplicationContext()
返回相同的对象,但不能保证这总是如此(例如,在特定的供应商实现中)。
所以,如果你想你的清单注册的应用程序类,你永远不应该叫getApplicationContext()
并将其投放到您的应用程序,因为它可能不是应用程序实例(你显然与测试框架的经历)。
为什么getApplicationContext()
首先存在?
getApplication()
仅在Activity类和Service类中可用,而getApplicationContext()
在Context类中声明。
这实际上意味着一件事:在广播接收器中编写代码时,它不是一个上下文,而是在其onReceive方法中给出一个上下文,您只能调用getApplicationContext()
。 这也意味着您无法保证在BroadcastReceiver中访问您的应用程序。
在查看Android代码时,您会看到当附加时,一个活动接收到一个基本上下文和一个应用程序,而这些参数是不同的。 getApplicationContext()
将其调用委托给baseContext.getApplicationContext()
。
还有一件事:文档说,大多数情况下,你不需要子类Application:
通常不需要子类化Application
。 在大多数情况下,静态单例可以以更模块化的方式提供相同的功能。 如果你的单例需要一个全局上下文(例如注册广播接收者),那么检索它的函数可以被赋予一个Context
,该Context
在第一次构造单例时在内部使用Context.getApplicationContext()
。
我知道这不是一个确切而确切的答案,但仍然,这是否回答你的问题?
比较getApplication()
和getApplicationContext()
。
getApplication
返回一个Application
对象,它将允许您管理您的全局应用程序状态并响应某些设备情况,如onLowMemory()
和onConfigurationChanged()
。
getApplicationContext
返回全局应用程序上下文 - 与其他上下文的区别在于,例如,活动结束时,Android可能会销毁(或以其他方式使活动上下文不可用)。 应用程序上下文在您的应用程序对象存在期间保持可用(不与特定的Activity
绑定),因此您可以将此用于诸如通知之类的需要上下文的应用程序,该上下文将可用于更长时间并且独立于瞬态UI对象。
我想这取决于你的代码在做什么,不管它们是否可以相同 - 尽管在正常使用中,我希望它们有所不同。
这似乎与上下文包装有关。 从Context
派生出来的大多数类实际上都是一个ContextWrapper
,它基本上委托给另一个上下文,可能由包装器进行更改。
上下文是支持嘲笑和代理的一般抽象。 由于许多上下文都绑定到有限生命周期的对象(如Activity
,因此需要获取更长寿命的上下文,以便用于注册将来的通知等用途。 这是通过Context.getApplicationContext()
来实现的。 一个逻辑实现是返回全局Application
对象,但是没有任何东西阻止上下文实现返回具有合适生命周期的包装器或代理。
活动和服务更具体地与Application
对象相关联。 我相信这一点的用处在于,您可以在清单中创建并注册从Application
派生的自定义类,并确保Activity.getApplication()
或Service.getApplication()
将返回该特定类型的特定对象,您可以将其转换为您的派生Application
类并用于任何自定义目的。
换句话说, getApplication()
保证返回一个Application
对象,而getApplicationContext()
可以自由地返回一个代理。