我们什么时候应该一劳永逸地调用 getContext 和 getActivity?
When should we call getContext and getActivity once and for all?
我在 Whosebug 和 Google 上搜索了很多关于在 Android 环境中使用上下文的解释,但我只找到了零散的解释片段。
我们什么时候应该使用 getContext
而不是 getActivity
? 问题具体如下
- 在
DialogFragment
和其他 Fragment
中:创建 Toast
,构建 AlertDialog
,实例化 Intent
...需要上下文。我们应该使用 getActivity
还是 getContext
?
- 如果这些操作写在
Activity
而不是片段中?
顺便说一下,通过调用 getContext
和 getActivity
可能会发生 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()
链接来传递适当的上下文参数。这意味着您可以使用它来创建 Toasts
、AlertDialogs
、Intents
、Fragments
和其他需要上下文的视图操作。
- 切勿将上下文分配给静态 (class) 变量,这会造成内存泄漏!
- 如果您使用
getApplicationContext()
注册广播,您必须执行适当的 clean-up 以防止内存泄漏。 see here
注意,这些是我个人的做法,有待指正:)。
我在 Whosebug 和 Google 上搜索了很多关于在 Android 环境中使用上下文的解释,但我只找到了零散的解释片段。
我们什么时候应该使用 getContext
而不是 getActivity
? 问题具体如下
- 在
DialogFragment
和其他Fragment
中:创建Toast
,构建AlertDialog
,实例化Intent
...需要上下文。我们应该使用getActivity
还是getContext
? - 如果这些操作写在
Activity
而不是片段中?
顺便说一下,通过调用 getContext
和 getActivity
可能会发生 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()
链接来传递适当的上下文参数。这意味着您可以使用它来创建Toasts
、AlertDialogs
、Intents
、Fragments
和其他需要上下文的视图操作。- 切勿将上下文分配给静态 (class) 变量,这会造成内存泄漏!
- 如果您使用
getApplicationContext()
注册广播,您必须执行适当的 clean-up 以防止内存泄漏。 see here
注意,这些是我个人的做法,有待指正:)。