非常有趣的问题。我觉得主要是语义,也可能是历史原因。
尽管在当前的 Android Activity 和 Service 实现中,getApplication()
并getApplicationContext()
返回相同的对象,但不能保证总是如此(例如,在特定的供应商实现中)。
所以如果你想要你在 Manifest 中注册的 Application 类,你永远不应该调用getApplicationContext()
它并将其转换为你的应用程序,因为它可能不是应用程序实例(你显然在测试框架中体验过)。
为什么getApplicationContext()
首先存在?
getApplication()
仅在 Activity 类和 Service 类中可用,而getApplicationContext()
在 Context 类中声明。
这实际上意味着一件事:在广播接收器中编写代码时,它不是上下文,而是在其 onReceive 方法中给出了上下文,您只能调用getApplicationContext()
. 这也意味着不能保证您可以在 BroadcastReceiver 中访问您的应用程序。
查看 Android 代码时,您会看到附加时,活动接收基本上下文和应用程序,它们是不同的参数。getApplicationContext()
将它的调用委托给baseContext.getApplicationContext()
.
还有一件事:文档说在大多数情况下,您不需要子类化应用程序:
通常不需要子类化Application
. 在大多数情况下,静态单例可以以更模块化的方式提供相同的功能。如果您的单例需要全局上下文(例如注册广播接收器),则可以为检索它的函数提供一个
在首次构建单例时在Context
内部使用的函数。Context.getApplicationContext()
我知道这不是一个准确而准确的答案,但是,这能回答你的问题吗?