首页 文章

getApplication()与getApplicationContext()

提问于
浏览
392

我无法 Activity/Service.getApplication()Context.getApplicationContext() 的交易?

在我们的应用程序中,都返回相同的对象 . 但是,在_2615293中,模拟应用程序会使 getApplication() 返回模拟,但是 getApplicationContext 仍然会返回一个不同的上下文实例(一个由Android注入) . 那是一个错误吗?这是故意的吗?

我甚至不了解首先的区别 . 测试套件外是否存在两个呼叫可能带有不同对象的情况?何时以及为何?此外,为什么 getApplicationActivityService 上定义,但不在 Context 上?不应该随处可用的有效应用程序实例吗?

4 回答

  • 348

    非常有趣的问题 . 我认为它主要是语义,也可能是由于历史原因 .

    虽然在当前的Android Activity和Service实现中, getApplication()getApplicationContext() 返回相同的对象,但无法保证始终如此(例如,在特定的供应商实现中) .

    因此,如果您需要在Manifest中注册的Application类,则应该 never 调用 getApplicationContext() 并将其强制转换为您的应用程序,因为它可能不是应用程序实例(您显然在测试框架中遇到过) .

    为什么 getApplicationContext() 首先存在?

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

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

    在查看Android代码时,您会看到在附加时,活动会收到基本上下文和应用程序,这些是不同的参数 . getApplicationContext() 代表它致电 baseContext.getApplicationContext() .

    还有一件事:文档说大多数情况下,你不应该需要子类Application:

    通常不需要子类Application . 在大多数情况下,静态单例可以以更模块化的方式提供相同的功能 . 如果你的单例需要一个全局上下文(例如注册广播接收器),那么检索它的函数可以给一个Context,它在第一次构造单例时在内部使用Context.getApplicationContext() .

    我知道这不是一个确切而准确的答案,但是,这仍然可以回答你的问题吗?

  • 30

    比较getApplication()getApplicationContext() .

    getApplication 返回一个Application对象,它允许您管理全局应用程序状态并响应某些设备情况,例如onLowMemory()onConfigurationChanged() .

    getApplicationContext 返回全局应用程序上下文 - 与其他上下文的区别在于,例如,当您的活动结束时,Android可能会销毁(或以其他方式使其不可用)活动上下文 . 应用程序上下文在您的Application对象存在时仍然可用(它与特定的 Activity 无关),因此您可以将此用于Notifications之类的内容,这些内容需要一个可用于较长时间且独立于瞬态UI对象的上下文 .

    我想这取决于你的代码在做什么,无论这些可能是也可能不一样 - 尽管在正常使用中,我希望它们是不同的 .

  • -13

    它似乎与上下文包装有关 . 从Context派生的大多数类实际上是ContextWrapper,它基本上委托给另一个上下文,可能由包装器进行更改 .

    上下文是支持模拟和代理的一般抽象 . 由于许多上下文都绑定到有限生命周期的对象,例如Activity,因此需要有一种方法来获取更长寿的上下文,例如注册将来的通知 . 这是通过Context.getApplicationContext()实现的 . 逻辑实现是返回全局Application对象,但没有什么能阻止上下文实现返回具有合适生命周期的包装器或代理 .

    活动和服务更具体地与Application对象相关联 . 我相信,这有用的是你可以在清单中创建并注册一个派生自 Application 的自定义类,并确保Activity.getApplication()Service.getApplication()将返回该特定类型的特定对象,您可以将其强制转换为派生类 Application 类和用于任何自定义目的 .

    换句话说, getApplication() 保证返回 Application 对象,而 getApplicationContext() 可以自由返回代理 .

  • 29

    要回答这个问题,getApplication()返回一个Application对象,getApplicationContext()返回一个Context对象 . 基于您自己的观察,我假设两者的上下文是相同的(即幕后,Application类调用后一个函数来填充基类的Context部分或发生一些等效的操作) . 如果你只需要一个Context,那么你调用哪个函数真的不重要 .

相关问题