getApplication() 与 getApplicationContext()

2024-04-24

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

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

我什至一开始就不明白其中的区别。在测试套件之外是否存在两个调用可能返回不同对象的情况?什么时候以及为什么?此外,为什么是getApplication定义于Activity and Service,但不是在Context?不应该总是有一个有效的应用程序实例可用吗anywhere?


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

尽管在当前的 Android Activity 和 Service 实现中,getApplication() and getApplicationContext()返回相同的对象,不能保证情况总是如此(例如,在特定供应商实现中)。

所以如果你想要你在Manifest中注册的Application类,你应该never call getApplicationContext()并将其投射到您的应用程序,因为它可能不是应用程序实例(您显然在测试框架中经历过)。

为什么getApplicationContext()首先存在吗?

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

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

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

另一件事:文档说,在大多数情况下,您不需要子类化应用程序:

通常不需要子类化Application。在大多数情况下, 静态单例可以以更加模块化的方式提供相同的功能 方式。如果您的单例需要全局上下文(例如注册 广播接收器),检索它的函数可以给出Context其内部使用Context.getApplicationContext()什么时候 首先构建单例。

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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

getApplication() 与 getApplicationContext() 的相关文章

  • 如何在单击片段的按钮时替换该片段?

    我有一个包含多个片段的活动 Activity 最初有片段 其中有两个按钮 单击此按钮后 我必须用新片段替换该片段 每个片段都有各种小部件 并将当前片段替换为各种事件 这是我的问题 我怎样才能实现这个目标 给我建议 您可以用 Fragment
  • 通过使用计时器(或处理程序)更改 ImageView 中的图像来创建动画

    我想通过更改 ImageView 内的帧来创建一个简单的动画 我不想使用 AnimationDrawable 因为我需要在帧更改或动画停止时接收事件 以便能够向后播放 重新启动等等 我的问题是 尽管 setImageDrawable 被调用
  • 如何在GreenDao中实现表继承

    我一直在尝试创建一个数据库 其中所有表都继承某个元素 以便有可能拥有元数据 我在模型生成器的所有表声明中添加了这一行 public Entity addSuperEntity Schema schema Entity superEntity
  • 为 customere xml 按钮着色时遇到问题

    我在为自定义按钮着色时遇到问题 由于某种原因 似乎无论我想应用什么颜色更改 文本或背景 按钮都保持不变 我注意到button xml具有所需的颜色和正确的形状 尽管没有出现按钮background color活动的财产 活动中的按钮
  • 设备锁定时,互联网音乐播放器无法加载歌曲(打瞌睡模式?)

    我正在构建一个音乐播放器 可以播放互联网上的歌曲 我注意到 通常 当一首歌曲结束并且必须加载另一首歌曲时 应用程序不会播放下一首歌曲 我等啊等 终于决定解锁手机以了解发生了什么 令人惊讶的是 设备解锁后立即开始播放以下歌曲 第一次我以为这只
  • “android.enableUnitTestBinaryResources”已弃用[重复]

    这个问题在这里已经有答案了 我刚刚更新了我的 Android Studio 现在当我构建我的项目时 我收到此错误 选项 android enableUnitTestBinaryResources 已弃用 这 当前默认值为 假 已从当前版本中
  • 如何生成带logo的二维码?

    我正在为 Android 设备开发应用程序 我想生成带有徽标的二维码 With ZXing I know how to generate simple QR codes like this one But I want to generat
  • 如何在 ubuntu 14.04 中保持 Android 模拟器始终位于最前面

    如何在 ubuntu 14 04 中保持 Android 模拟器始终位于最前面 我使用的是 Android Studio 2 1 1 和模拟器版本 25 1 6 在将 Android SDK Tools 更新到 25 1 6 之前它可以正常
  • 何时使用支持库

    我对 Android 支持库的用途和何时需要它感到困惑 据我了解 使用支持库的主要优点是 Android 可以在旧版本中自行实现主题和 UI 功能 而无需开发人员显式定义它们 这些关键的 UI 功能之一是操作栏 它是为 Honeycomb
  • 如何设置评分栏的星星颜色?

    如何设置评分栏的星星颜色 我想要黄色星星 最简单的方法 android progressTint color color 光滑有光泽
  • Glide:如何使用 Glide v4 调整 gif 大小并将其另存为文件?

    我想调整 gif 文件的大小并保存它 我尝试使用一些建议的方法 但这些方法给出了错误 后来我知道有些方法在 Glide 中已被弃用v4 byte bytes Glide with context asGif load url toBytes
  • DrawerLayout 第一次打开有点步骤

    我有一个 DrawerLayout 当我第一次滑动它时 它是逐步出现的 比如滞后或类似的东西 但之后它移动得很好 我不知道要发布什么代码 因为正如我所说 它工作正常 只是第一次打开它时 它打开不顺利 这是我的布局
  • 使用 GestureDetector 时出现 NullPointerException

    下面是在发生不同事件时加载两个不同图像的帧动画的代码 第一个事件是在活动开始时 其他的是onTouch 我在哪里利用GestureDetector为了onDown and onScroll 问题是我得到NullPointerExceptio
  • Android从Activity调用Service中的方法

    我想调用一个方法Service对象来自一个Activity对象 但是我发现不可能从MainActivity通常情况下 我希望我的代码能更好地解释我的意思 Service public class Timer extends Service
  • Android 是否可以获取用户和设备所在国家/地区的货币代码?

    是否可以获取用户和设备所在国家 地区的货币代码 我想将用户当前国家 地区的国家 地区代码设置为默认国家 地区 我们在 Android 中有解决方案吗 由于这段代码可能对您有帮助 public class CurrencyTest publi
  • Android 应用安装验证

    我有一个应用程序 其中列出了用户可以安装并赚取积分的一些活动 应用程序列表 现在我主要关心的是安全性 一些用户从模拟器或VPN或其他东西安装应用程序 这样我的客户就无法在Google Play商店中安装应用程序 我见过一些应用程序 如现金海
  • SignalR 与 android(Java) 有问题

    我想在 android 应用程序和 net core 服务器项目之间进行实时通信 我在 stackoverflow 中尝试了一个问题 我跟着这个one https stackoverflow com questions 32573823 h
  • android应用程序在模拟器上运行但在手机上运行

    我有我开发的这个应用程序 它在模拟器上运行得很好 没有任何错误 但当我尝试在手机上运行相同的代码进行测试时 应用程序崩溃并提示 filenotfoundexception 它说文件 res drawable divider horizo n
  • Android - 减少位图绘制的内存使用量

    我的应用程序中有一张地图 显示了 Gowalla 的位置 我使用带有简单默认标记的 ItemizedOverlay 但在绘制项目时 我将默认标记替换为从 Gowalla 下载 9 并缓存在磁盘上 的位置图标 问题是 如果屏幕上有很多位置 例
  • Android 6.0.1 无法以编程方式启用 wifi 热点

    当我尝试通过以下代码启用 wifi 网络共享时 它会抛出异常 com java lang reflect Method invoke Native Method 处的 java lang reflect InitationTargetExc

随机推荐