我们什么时候应该一劳永逸地调用getContext和getActivity?

时间:2019-05-11 10:46:22

标签: android android-activity android-context

我在StackOverflow上进行了大量搜索,在Google上进行了更广泛的搜索,以获取有关在Android环境中使用上下文的说明,但我只发现了零星的解释片段。

何时应使用getContext代替getActivity问题在下面得到了解决。

  • DialogFragment和其他Fragment 之内:创建一个Toast,构建一个AlertDialog,实例化一个Intent。 ..需要上下文。我们应该使用getActivity还是getContext
  • 如果这些操作是用Activity 而不是片段编写的?

顺便说一句,通过调用getContextgetActivity会发生Null异常和/或内存泄漏:何时?更准确地说:仅当调用者的生存期是被调用对象的生存期的(严格)子集时,才会发生(例如,Dialog调用getActivity/getContext会返回null(如果尚未附加)活动)?

1 个答案:

答案 0 :(得分:1)

DOCS中,Context对象包含有关应用程序环境的全局信息。它允许访问特定于应用程序的资源和类,以及对应用程序级操作(例如启动活动,广播和接收意图等)的调用。

getContext()方法返回与当前对象关联的上下文,该对象可以是View,Fragment或Dialog或在其中定义或继承了该方法的任何其他对象。

getActivity()方法返回对与Fragment对象关联的当前活动的引用。如果没有与片段相关联的活动,它将返回null。我个人在传递上下文参数时从不使用此方法,我仅使用getContext()getApplicationContext()

getApplicationContext()之所以特别有用,是因为它使用了一个生命周期与当前上下文分开的上下文,它与流程的生命周期而不是当前组件息息相关。这意味着它使用应用程序的上下文,而不是部分应用程序的上下文,例如活动。 see here

上下文最佳做法:

  • getContext()getApplicationContext()足以传递上下文参数。如果无法立即访问它们,则可以使用getActivity().getApplicationContext()链接来传递适当的上下文参数。这意味着您可以使用它来创建ToastsAlertDialogsIntentsFragments和其他需要上下文的视图操作。
  • 切勿将上下文分配给静态(类)变量,否则会造成内存泄漏!
  • 如果使用getApplicationContext()注册广播,则必须执行适当的清理操作以防止内存泄漏。 see here

请注意,这些是我的个人方法,我会得到纠正:)。