这让我难住了,我在Android 2.1-r8 SDK中使用这个:

ProgressDialog.show(getApplicationContext(), ....);

还有在

Toast t = Toast.makeText(getApplicationContext(),....);

使用getApplicationContext()同时崩溃ProgressDialog和Toast ....这让我想到了这个问题:

活动上下文和应用程序上下文之间的实际区别是什么,尽管都使用“上下文”这个词?


当前回答

我认为的原因是,ProgressDialog附加到支持ProgressDialog的活动,因为对话框不能在活动被销毁后保留,所以它需要传递这个(ActivityContext),它也会随着活动被销毁,而ApplicationContext即使在活动被销毁后仍然保留。

其他回答

我认为的原因是,ProgressDialog附加到支持ProgressDialog的活动,因为对话框不能在活动被销毁后保留,所以它需要传递这个(ActivityContext),它也会随着活动被销毁,而ApplicationContext即使在活动被销毁后仍然保留。

这显然是API设计的缺陷。首先,活动上下文和应用程序上下文是完全不同的对象,因此使用上下文的方法参数应该直接使用ApplicationContext或Activity,而不是使用父类Context。 其次,文档应该明确指定使用或不使用哪个上下文。

我认为当所有东西都需要屏幕来显示(按钮、对话框、布局……)时,我们必须使用上下文活动,而所有东西都不需要屏幕来显示或处理(吐司、服务电话、联系人……),我们可以使用应用程序上下文

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

如果你阅读getApplicationContext的文档,它指出,只有当你需要一个生命周期与当前上下文分离的上下文时,你才应该使用这个。这在你的两个例子中都不适用。

Activity上下文大概有一些关于当前活动的信息,这些信息是完成这些调用所必需的。如果您显示准确的错误消息,则可能能够指出它究竟需要什么。

但通常情况下,使用活动上下文,除非您有很好的理由不这样做。

如果需要绑定到具有全局作用域的Context的内容,请使用getApplicationContext()。

如果您使用Activity,那么新的Activity实例将有一个引用,该引用具有对旧Activity的隐式引用,并且旧Activity不能被垃圾收集。