活动上下文与应用上下文的区别

t0m*_*13b 222 android android-context

这让我很难过,我在Android 2.1-r8 SDK中使用它:

ProgressDialog.show(getApplicationContext(), ....);
Run Code Online (Sandbox Code Playgroud)

还有

Toast t = Toast.makeText(getApplicationContext(),....);
Run Code Online (Sandbox Code Playgroud)

使用getApplicationContext()崩溃ProgressDialogToast....导致我这个问题:

尽管分享了"上下文"的措辞,但活动上下文和应用程序上下文之间的实际差异是什么?

Che*_*mon 238

它们都是Context的实例,但应用程序实例与应用程序的生命周期相关联,而Activity实例与Activity的生命周期相关联.因此,他们可以访问有关应用程序环境的不同信息.

如果您阅读getApplicationContext上的文档,它会注意到,如果您需要一个生命周期与当前上下文不同的上下文,则只应使用此文档.这不适用于您的任何一个示例.

活动上下文可能包含有关完成这些调用所必需的当前活动的一些信息.如果您显示确切的错误消息,可能能够指出它究竟需要什么.

但一般来说,除非你有充分的理由不使用活动上下文.

  • 我会说使用应用程序上下文除非你有充分的理由(即对话框或祝酒词).使用不同情况下的活动上下文很容易遇到内存泄漏,所以最好是安全的:) http://android-developers.blogspot.com/2009/01/avoiding-memory-leaks.html (68认同)
  • Dave Smith发布了一篇非常好的博客文章,用于理解上下文的用法,请参见[此处](http://www.doubleencore.com/2013/06/context/).确保您还阅读了评论! (10认同)
  • 当使用“getApplicationContext”时,我得到了“java.lang.reflect.InitationTargetException”,有趣的是,当我更改为“this”时,它没有崩溃并按预期工作......所以如果它们都是 Context 的实例,为什么一个不起作用而另一个起作用?我希望此信息对其他人有帮助...:)感谢您的及时答复... (2认同)
  • 我需要看到完整的异常堆栈跟踪才能说出任何内容.但是,正如我所说,上下文实例有不同的信息.据推测,要在屏幕上显示对话框或Toast,需要有关只有Activity实例具有的Activity的信息. (2认同)

Com*_*ode 163

我发现这个表对于决定何时使用不同类型的上下文非常有用:

在此输入图像描述

  1. 应用程序可以从此处启动活动,但它需要创建新任务.这可能适合特定的用例,但可以在您的应用程序中创建非标准的堆栈行为,通常不建议或认为是良好的做法.
  2. 这是合法的,但通货膨胀将使用您运行的系统的默认主题完成,而不是在您的应用程序中定义的内容.
  3. 在Android 4.2及更高版本上,如果接收方为空,则允许用于获取粘性广播的当前值.

原文在这里.

  • 文章存档 https://web.archive.org/web/20150329210012/https://possiblemobile.com/2013/06/context/ (4认同)

luc*_*cas 32

这显然是API设计的不足之处.首先,活动上下文和应用程序上下文是完全不同的对象,因此使用上下文的方法参数应该使用ApplicationContextActivity直接使用,而不是使用父类Context.第二,doc应指定要使用或不使用的上下文.

  • 完全同意.谷歌放弃了这一点.这是一个完整的混乱. (21认同)

use*_*311 12

我认为原因ProgressDialog是附加到支持ProgressDialog对话的活动,因为对话在活动被销毁后无法保留,因此需要传递this(ActivityContext)也会被活动破坏,而ApplicationContext甚至在活动获得后仍然存在销毁.


归档时间:

查看次数:

114981 次

最近记录:

6 年,3 月 前