gpt4 book ai didi

android - getApplication() 与 getApplicationContext()

转载 作者:IT老高 更新时间:2023-10-28 12:49:20 30 4
gpt4 key购买 nike

我找不到令人满意的答案,所以我们开始吧:Activity/Service.getApplication()Context.getApplicationContext() 是怎么回事?

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

一开始我什至不明白其中的区别。在测试套件之外是否存在两个调用可能返回不同对象的情况?什么时候,为什么?另外,为什么getApplication定义在ActivityService上,而不是Context上? 任何地方不应该总是有一个有效的应用程序实例可用吗?

最佳答案

非常有趣的问题。我觉得主要是语义,也可能是历史原因。

虽然在当前的 Android Activity 和 Service 实现中,getApplication()getApplicationContext() 返回相同的对象,但不能保证总是这样(例如,在特定的供应商实现中)。

所以如果你想要你在 Manifest 中注册的 Application 类,你应该从不调用 getApplicationContext() 并将其转换为你的应用程序,因为它可能不是应用程序实例(您显然在测试框架中体验过)。

为什么getApplicationContext()首先存在?

getApplication()只在Activity类和Service类中可用,而getApplicationContext()在Context类中声明。

这实际上意味着一件事:在广播接收器中编写代码时,它不是上下文,而是在其 onReceive 方法中给出了上下文,您只能调用 getApplicationContext()。这也意味着不能保证您可以在 BroadcastReceiver 中访问您的应用程序。

查看 Android 代码时,您会看到附加时,Activity 接收基本上下文和应用程序,它们是不同的参数。 getApplicationContext() 将它的调用委托(delegate)给 baseContext.getApplicationContext()

还有一件事:文档说在大多数情况下,您不需要继承 Application:

There is normally no need to subclass Application. In most situation, static singletons can provide the same functionality in a more modular way. If your singleton needs a global context (for example to register broadcast receivers), the function to retrieve it can be given a Context which internally uses Context.getApplicationContext() when first constructing the singleton.

我知道这不是一个准确而准确的答案,但是,这能回答你的问题吗?

关于android - getApplication() 与 getApplicationContext(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5018545/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com