这让我很难过,我在Android 2.1-r8 SDK中使用它:
ProgressDialog.show(getApplicationContext(), ....);
还有
Toast t = Toast.makeText(getApplicationContext(),....);
使用 getApplicationContext()
崩溃了 ProgressDialog
和 Toast
....这引出了我这个问题:
尽管分享了“上下文”的措辞,但活动上下文和应用程序上下文之间的实际差异是什么?
7 回答
它们都是Context的实例,但应用程序实例与应用程序的生命周期相关联,而Activity实例与Activity的生命周期相关联 . 因此,他们可以访问有关应用程序环境的不同信息 .
如果您在getApplicationContext阅读了文档,它会注意到,如果您需要一个生命周期与当前上下文不同的上下文,那么您应该只使用它 . 这不适用于您的任何一个示例 .
活动上下文可能包含有关完成这些调用所必需的当前活动的一些信息 . 如果您显示确切的错误消息,可能能够指出它究竟需要什么 .
但一般来说,除非你有充分的理由不使用活动上下文 .
我发现这个表对于决定何时使用不同类型的上下文非常有用:
应用程序可以从此处启动活动,但需要创建新任务 . 这可能适合特定的用例,但可以在您的应用程序中创建非标准的堆栈行为,通常不建议或认为是良好的做法 .
这是合法的,但通货膨胀将使用您运行的系统的默认主题完成,而不是在您的应用程序中定义的内容 .
如果接收方为空,则允许在Android 4.2及更高版本上用于获取粘性广播的当前值 .
原创文章here .
这显然是API设计的不足之处 . 首先,Activity Context和Application上下文是完全不同的对象,因此使用上下文的方法参数应该直接使用
ApplicationContext
或Activity
,而不是使用父类Context . 第二,doc应指定要使用或未明确使用的上下文 .我认为
ProgressDialog
附加到支持ProgressDialog
的活动,因为在活动被破坏后对话框无法保留,因此需要传递this
(ActivityContext),该活动也会被活动破坏,而ApplicationContext仍然在活动被破坏了 .我想当一切都需要一个屏幕显示(按钮,对话框,布局......)时,我们必须使用上下文活动,并且一切都不需要屏幕来显示或处理(烤面包,服务电话,联系...)我们可以使用应用程序上下文
You cannot display an application window/dialog through a Context that is not an Activity. Try passing a valid activity reference
如果您需要绑定到本身具有全局范围的Context的内容,请使用getApplicationContext() .
如果您使用Activity,那么新的Activity实例将具有一个引用,该引用具有对旧Activity的隐式引用,并且旧的Activity不能被垃圾回收 .