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

When should we call getContext and getActivity once and for all?

我在 Whosebug 和 Google 上搜索了很多关于在 Android 环境中使用上下文的解释,但我只找到了零散的解释片段。

我们什么时候应该使用 getContext 而不是 getActivity问题具体如下

顺便说一下,通过调用 getContextgetActivity 可能会发生 Null 异常 and/or 内存泄漏:什么时候?更准确地说:它是否仅在调用者的生命周期是被调用对象的生命周期的(严格)子集时发生(例如,a Dialog 调用 getActivity/getContext which returns null if它尚未附加到 activity)?

来自DOCS,Context 对象包含有关应用程序环境的全局信息。它允许访问 application-specific 资源和 classes,以及 up-calls 以进行 application-level 操作,例如启动活动、广播和接收意图等。

getContext() 方法 return 与当前对象关联的上下文,它可以是视图、片段或对话框或任何其他在其中定义或继承此方法的对象它。

getActivity() 方法 return 是对与 Fragment 对象关联的当前 activity 的引用。如果没有 activity 与该片段关联,它将 return null。我个人在传递上下文参数时从不使用这种方法,我只使用 getContext()getApplicationContext().

getApplicationContext() 特别有用,因为它使用了一个生命周期与当前上下文分离的上下文,它与进程的生命周期而不是当前组件相关联。这意味着它使用应用程序的上下文而不是应用程序的一部分,如 activity。 see here

上下文最佳实践:

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

注意,这些是我个人的做法,有待指正:)。