【问题标题】:When should we call getContext and getActivity once and for all?我们什么时候应该一劳永逸地调用 getContext 和 getActivity?
【发布时间】:2019-05-11 10:46:22
【问题描述】:

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

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

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

顺便说一句,调用getContextgetActivity 可能会发生空异常和/或内存泄漏:什么时候?更准确地说:它是否仅在调用者的生命周期是被调用对象的生命周期的(严格)子集时发生(例如,Dialog 调用 getActivity/getContext 如果它尚未附加到其活动,则返回 null) ?

【问题讨论】:

  • 我实际上没有问题,我只是不明白如何在精确调用两者的正确方法时没有任何确定的资源。它应该非常清楚,我没有找到明确的答案。有人告诉将 getActivity 用于 UI 小部件,但为什么呢?没有任何文件谈论它。顺便说一句,很多 Stackoverflow 答案都建议使用类/对象属性来存储来自 OnAttach 回调的上下文和活动。但是,其他人说这是一个不好的想法,它会引起内存泄漏。 2019年怎么可能有..
  • ... 对getContext和getActivity有很多矛盾?这个问题旨在澄清所有这些奇怪的答案和神话。
  • 其他不确定性例如:getActivity和getContext是同一个词,有人说。但显然这不是真的。这个问题也应该清除这些不确定性。事实上,它可以为所有这些关于 getContext 和 getActivity 的误解带来一个明确而完整的答案。我们在 2019 年,怎么可能对使用 getContext 和 getActivity 如此不精确......我所有的问题都应该在官方文档和/或 Stackoverflow 问题中得到处理......但是没有......在 2019 年...... .
  • 也许我错了,但是这种问题对于很好地理解我们作为开发人员所做的事情非常重要......它并不总是“嘿伙计们帮助帮助,我有一个错误,在这里是我的代码”,还有“我怎样才能以最漂亮的方式做到这一点?” ...这个问题(及其答案)对我很有帮助,非常感谢;)

标签: android android-activity android-context


【解决方案1】:

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

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

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

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

上下文最佳实践:

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

请注意,这些是我个人的做法,我会更正:)。

【讨论】:

  • @Edgar- 我们应该非常小心地使用 getApplicationContext()(在大多数情况下应该避免),例如,如果我们尝试使用 getApplicationContext() 来膨胀布局,而框架不会抱怨并且会返回一个使用应用程序上下文创建的 LayoutInflater 的完美视图层​​次结构,在此过程中不会考虑您应用程序的主题和样式。所以我们应该尽量使用活动/服务上下文
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-03-20
  • 2015-09-25
  • 2016-07-20
  • 2017-06-16
相关资源
最近更新 更多