Android应用程序中的上下文

Android应用程序中的上下文


什么是上下文?


顾名思义,这是应用程序或对象当前状态的上下文。 这使新创建的对象可以了解发生了什么。 通常,他们打电话给他以获得有关程序另一部分的信息。


此外, Context是系统的指南,它可以提供资源,访问数据库,首选项等。 Android应用程序也具有Activity 。 就像探索您的应用程序在其中运行的环境一样。 Activity对象继承了Context对象。 它允许您访问特定的资源和有关应用程序环境的信息。


Context几乎在Android应用程序中的任何地方Context存在,并且是Context最重要的部分,因此您需要了解如何正确使用它。


Context使用不当很容易导致Android应用程序中的内存泄漏。


有许多不同类型的上下文,因此让我们弄清楚它们分别是什么,如何以及何时正确使用它们。


应用环境


这是一个单例实例(整个应用程序中仅有一个实例),可以通过getApplicationContext()函数对其进行访问。 此上下文与应用程序生命周期相关。 当您需要一个生命周期与当前上下文无关的上下文时,或者需要在Activity之外传递上下文时,可以使用应用程序上下文。


例如,如果您需要为应用程序创建一个单例对象,并且该对象需要一些上下文,请始终使用应用程序上下文。


如果在这种情况下传递Activity上下文,则会导致内存泄漏,因为单例对象将保留对Activity的引用,并且在必要时不会被垃圾收集器破坏。


如果您需要在Activity初始化库,请始终传递应用程序上下文,而不是Activity上下文。


因此,当知道您需要一个可以比其他任何上下文生存更长的时间的上下文时,应使用getApplicationContext()


活动背景


该上下文可在“ Activity访问,并附加到其生命周期。 在Activity中传递上下文时,应使用Activity上下文Activity或者需要一个生命周期与当前上下文相关联的上下文。


ContentProvider中的getContext()


该上下文是应用程序上下文,可以与应用程序上下文类似地使用。 可以通过getContext()方法进行访问。


什么时候不能使用getApplicationContext()?


  • 这不是支持Activity可以执行的所有操作的完整上下文。 您尝试使用此上下文执行的某些操作将失败,主要与GUI有关。
  • 如果getApplicationContext()的上下文保留在稍后不清除的某个对象上,则可能会发生内存泄漏。 如果将Activity上下文保存在某个位置,则只要垃圾回收器将Activity销毁,其他所有内容也将销毁。 Application对象在整个过程中一直存在。

经验法则


在大多数情况下,请使用可直接从您当前正在使用的组件访问的上下文。 如果链接没有超出此组件的生命周期,则可以安全地存储该链接。 一旦需要将指向上下文的链接保存在Activity或其他组件之外的对象中(即使是暂时的),请使用指向应用程序上下文的链接。

Source: https://habr.com/ru/post/zh-CN421115/


All Articles