我找不到令人满意的答案,所以我们开始:Activity/Service.getApplication()
和Context.getApplicationContext()
有什么关系?
在我们的应用程序中,两个都返回相同的对象。但是,在ActivityTestCase
中,对应用程序进行模拟将使getApplication()
与模拟一起返回,但是getApplicationContext
仍将返回不同的上下文实例(由Android注入(inject))。那是个错误吗?是故意的吗?
首先,我什至不了解其中的区别。测试套件之外是否存在两个调用可能返回不同对象的情况?什么时候,为什么?此外,为什么在getApplication
和Activity
上定义Service
,而不在Context
上定义?是否不应该在任何地方都可以使用有效的应用程序实例?
最佳答案
非常有趣的问题。我认为这主要是语义上的意思,也可能是由于历史原因。
尽管在当前的Android Activity和Service实现中,getApplication()
和getApplicationContext()
返回相同的对象,但不能保证总是如此(例如,在特定的供应商实现中)。
因此,如果您想在 list 中注册Application类,则应该而不是调用getApplicationContext()
并将其强制转换为您的应用程序,因为它可能不是应用程序实例(显然是您在测试框架中经历过的)。
为什么getApplicationContext()
首先存在?getApplication()
仅在Activity类和Service类中可用,而getApplicationContext()
在Context类中声明。
这实际上意味着一件事:当在广播接收器中编写代码(这不是上下文,而是在其onReceive方法中为其提供上下文)时,只能调用getApplicationContext()
。这也意味着您不能保证可以在BroadcastReceiver中访问您的应用程序。
查看Android代码时,您会看到,将其附加后, Activity 将接收基本上下文和应用程序,而这些是不同的参数。 getApplicationContext()
将它的调用委托(delegate)给baseContext.getApplicationContext()
。
还有一件事:文档说,在大多数情况下,您无需将Application子类化:
我知道这不是一个精确的答案,但是仍然可以回答您的问题吗?