我找不到令人满意的答案,所以我们开始:Activity/Service.getApplication()Context.getApplicationContext()有什么关系?

在我们的应用程序中,两个都返回相同的对象。但是,在ActivityTestCase中,对应用程序进行模拟将使getApplication()与模拟一起返回,但是getApplicationContext仍将返回不同的上下文实例(由Android注入(inject))。那是个错误吗?是故意的吗?

首先,我什至不了解其中的区别。测试套件之外是否存在两个调用可能返回不同对象的情况?什么时候,为什么?此外,为什么在getApplicationActivity上定义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子类化:



我知道这不是一个精确的答案,但是仍然可以回答您的问题吗?

07-26 09:33
查看更多