我在StackOverflow上进行了大量搜索,在Google上进行了更广泛的搜索,以获取有关在Android环境中使用上下文的说明,但我只发现了零星的解释片段。
何时应使用getContext
代替getActivity
? 问题在下面得到了解决。
DialogFragment
和其他Fragment
之内:创建一个Toast
,构建一个AlertDialog
,实例化一个Intent
。 ..需要上下文。我们应该使用getActivity
还是getContext
?Activity
而不是片段编写的?顺便说一句,通过调用getContext
和getActivity
会发生Null异常和/或内存泄漏:何时?更准确地说:仅当调用者的生存期是被调用对象的生存期的(严格)子集时,才会发生(例如,Dialog
调用getActivity/getContext
会返回null(如果尚未附加)活动)?
答案 0 :(得分:1)
在DOCS中,Context对象包含有关应用程序环境的全局信息。它允许访问特定于应用程序的资源和类,以及对应用程序级操作(例如启动活动,广播和接收意图等)的调用。
getContext()
方法返回与当前对象关联的上下文,该对象可以是View,Fragment或Dialog或在其中定义或继承了该方法的任何其他对象。
getActivity()
方法返回对与Fragment对象关联的当前活动的引用。如果没有与片段相关联的活动,它将返回null
。我个人在传递上下文参数时从不使用此方法,我仅使用getContext()
和getApplicationContext()
。
getApplicationContext()
之所以特别有用,是因为它使用了一个生命周期与当前上下文分开的上下文,它与流程的生命周期而不是当前组件息息相关。这意味着它使用应用程序的上下文,而不是部分应用程序的上下文,例如活动。 see here
上下文最佳做法:
getContext()
和getApplicationContext()
足以传递上下文参数。如果无法立即访问它们,则可以使用getActivity().getApplicationContext()
链接来传递适当的上下文参数。这意味着您可以使用它来创建Toasts
,AlertDialogs
,Intents
,Fragments
和其他需要上下文的视图操作。getApplicationContext()
注册广播,则必须执行适当的清理操作以防止内存泄漏。 see here 请注意,这些是我的个人方法,我会得到纠正:)。