- mongodb - 在 MongoDB mapreduce 中,如何展平值对象?
- javascript - 对象传播与 Object.assign
- html - 输入类型 ="submit"Vs 按钮标签它们可以互换吗?
- sql - 使用 MongoDB 而不是 MS SQL Server 的优缺点
我找不到令人满意的答案,所以我们开始吧:Activity/Service.getApplication()
和 Context.getApplicationContext()
是怎么回事?
在我们的应用程序中,两者都返回相同的对象。然而,在 ActivityTestCase
中,模拟应用程序将使 getApplication()
与模拟一起返回,但 getApplicationContext
仍将返回不同的上下文实例(一个由Android注入(inject))。那是一个错误吗?是故意的吗?
一开始我什至不明白其中的区别。在测试套件之外是否存在两个调用可能返回不同对象的情况?什么时候,为什么?另外,为什么getApplication
定义在Activity
和Service
上,而不是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 aContext
which internally usesContext.getApplicationContext()
when first constructing the singleton.
我知道这不是一个准确而准确的答案,但是,这能回答你的问题吗?
关于android - getApplication() 与 getApplicationContext(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5018545/
我有一个关于 wicket getApplication 的问题。 getApplication() 和 getSession().getApplication 有什么区别? 部署 wicket 应用
我在我的应用程序中创建了一个 Android 全局变量,当我尝试在我的 Activity 中使用 getApplication 访问它时,我收到错误: Cannot resolve method ge
我正在使用 getHotelName() 和 setHotelName() 在应用程序中存储数据,然后访问它。在我分类为 Launcher 的主要 Activity 中,方法和 getApplicat
我花了一段时间阅读这篇文章,但还没有找到答案。 我在一个应用程序中进行了一些 Activity 。我想在它们之间共享一些不适合 Intent 或序列化数据文件的数据。我知道我可以为此目的使用整个应用程
我想在我的网络应用程序启动时“测试加载”一些复合控件 (xhtml)。但是,当我尝试获取应用程序上下文 (getApplication()) 时,我遇到了这个问题: IllegalStateExcep
我正在尝试按照 Java 中的示例进行操作,但遇到了一些问题。 我已经创建了我自己的应用程序子类,我现在正试图在我的 baseactivity 中获取对所有其他事件将从其继承的引用。 要在 java
我正在尝试限制一系列应用程序,使用相同的 Activity (在所有人共享的图书馆项目中),以便一次只有一个这样的应用程序可以运行。 在我尝试学习如何去做的第一轮尝试中,我了解到: android:l
我找不到令人满意的答案,所以我们开始吧:Activity/Service.getApplication() 和 Context.getApplicationContext() 是怎么回事? 在我们的应
我想在 Recyclerview 的 onClickListener 方法中膨胀 Recyclerview。 为此,我知道我必须从相应的 Activity 中获取上下文才能设置 LinearLayou
我确定我昨晚没有做任何奇怪或错误的事情。昨晚,我仍然能够 Toast.makeText(getApplicationContext(), "Some String", Toast.LENGTH_SHO
大家下午好!我正在 Android Studio 中开发一个搜索系统,但我是 Java 语言的初学者,我的错误可能很愚蠢。我想帮助理解两件事。第一:为什么我不能访问 this.getApplicati
我有类 App,其中包含我的 Application 的上下文。但是当我编译时,我在这一行的其他类中得到了一个错误: App app = (App) getApplication(); 类应用: i
我使用应用程序访问我的数据。当按钮被点击时,我想使用应用程序中的数据。我使用以下代码: b.setOnClickListener(new OnClickListener() { @Override p
我试图让 Dagger 简单示例在 IntelliJ 中运行,但它在 DemoBaseActivity 类中的 getApplication 调用失败: public abstract class D
我在一个 Activity 中运行以下行,它在同一个应用程序中,但在不同的包中: AppObject appObj = (AppObject)this.getApplication(); // FYI
(这里已经很晚了,所以可以监督一些非常简单的事情..) 我有以下类(class): public class GlobalState extends Application { private
有什么区别: getApplicationContext() getBasecontext() getApplication() getParent() 你能用一个简单的例子详细说明吗? 最佳答案 g
本文整理了Java中com.zsmartsystems.zigbee.ZigBeeEndpoint.getApplication()方法的一些代码示例,展示了ZigBeeEndpoint.getApp
我有一个带有自定义应用程序类的 Android 应用程序: 一般工作。在主要 Activity 的onCreate ,我检索应用程序对象: public App App() { return
一切正常,直到两天前我收到此错误: > Task :app:compileDebugJavaWithJavac FAILED Deprecated Gradle features were used
我是一名优秀的程序员,十分优秀!