活动上下文和应用上下文之间的区别
这让我难住,我在Android 2.1-r8 SDK中使用了这个:
ProgressDialog.show(getApplicationContext(), ....);
还在
Toast t = Toast.makeText(getApplicationContext(),....);
使用getApplicationContext()
崩溃ProgressDialog
和Toast
….这导致我这个问题:
尽pipe分享了“上下文”这个词汇,活动上下文和应用上下文之间的实际差异是什么?
它们都是Context的实例,但是应用程序实例绑定到应用程序的生命周期,而Activity实例绑定到Activity的生命周期。 因此,他们可以访问有关应用程序环境的不同信息。
如果您阅读getApplicationContext上的文档,则会注意到只有在需要生命周期与当前上下文分离的上下文时才应该使用它。 这不适用于你的任何一个例子。
活动上下文大概有一些关于完成这些调用所需的当前活动的信息。 如果显示确切的错误信息,可能能够指出究竟需要什么。
但是一般来说,除非你有充分的理由不使用活动上下文。
我发现这个表对于决定何时使用不同types的上下文非常有用:
- 一个应用程序可以从这里启动一个Activity,但是它需要创build一个新的任务。 这可能适合特定的用例,但可以在应用程序中创build非标准的后退堆栈行为,通常不被推荐或被认为是良好的做法。
- 这是合法的,但通货膨胀将与您正在运行的系统的默认主题完成,而不是在您的应用程序中定义的。
- 如果在Android 4.2及更高版本上,接收器为空(用于获取粘性广播的当前值),则允许。
原文在这里 。
这显然是APIdevise的缺陷。 首先,活动上下文和应用上下文是完全不同的对象,所以使用上下文的方法参数应该直接使用ApplicationContext
或者Activity
,而不是使用父类Context。 其次,文档应该指定使用哪个上下文或者不明确使用哪个上下文。
我认为的原因是ProgressDialog
附加到支撑ProgressDialog
的活动,因为在活动被破坏之后对话框不能保留,所以需要传递this
(ActivityContext),它也被活动销毁,而ApplicationContext甚至在活动被破坏。
我认为,当一切都需要一个屏幕来显示(button,对话框,布局…),我们必须使用上下文活动,并且一切都不需要一个屏幕来显示或处理(烤面包,服务电话,联系…)可以使用应用程序上下文
您不能通过不是活动的上下文显示应用程序窗口/对话框。 尝试传递有效的活动参考
使用getApplicationContext(),如果你需要的东西绑定到一个本身将具有全局范围的上下文。
如果使用Activity,那么新的Activity实例将有一个引用,它对旧的Activity有一个隐含的引用,旧的Activity不能被垃圾收集。