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

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

还有在

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

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

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


当前回答

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

其他回答

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

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

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

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

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

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

An application CAN start an Activity from here, but it requires that a new task be created. This may fit specific use cases, but can create non-standard back stack behaviors in your application and is generally not recommended or considered good practice. This is legal, but inflation will be done with the default theme for the system on which you are running, not what’s defined in your application. Allowed if the receiver is null, which is used for obtaining the current value of a sticky broadcast, on Android 4.2 and above.