活动(Activity)和上下文(Context)有什么区别?

107

Activity 和 Context 是相同的吗,还是有区别?

何时应该将方法传递给 Activity,何时传递 Context?


@Egor 谢谢,我会注意的。在问问题之前,你能帮我回答一个问题吗?什么是 Android 中所有活动的根源? - Android
请查看下面的讨论以澄清问题。 - Egor
很遗憾,这些答案都不是非常完整的。这是谷歌搜索中出现的第一项内容。 - SMBiggs
2个回答

135

据我所了解,Context 是基础对象。因此,每个 ActivityApplication 都派生自 Context。这意味着每个 Activity 和每个 Application 都是一个 Context

来自 developer.android.com 的信息, 参见Activity

java.lang.Object
  ↳ android.content.Context
      ↳ android.content.ContextWrapper
          ↳ android.view.ContextThemeWrapper
              ↳ android.app.Activity

并且 Application

java.lang.Object
↳   android.content.Context
   ↳    android.content.ContextWrapper
       ↳    android.app.Application

应用程序上下文(Application context)的生命周期与应用程序一样长,而 Activity 上下文(Activity context)的生命周期仅限于 Activity 存活期间,即在相应 Activity 的 onDestroy() 方法调用后,Activity 上下文将不再有效。

因此,如果您需要在多个 Activity 中使用上下文(例如在 Singleton 中),最好使用 Application 上下文。

通常,在 Android 框架方法中需要提供上下文时,传递哪种上下文都没有区别。但是,如果您保留了长时间存活的上下文引用,请始终注意内存泄漏问题,可以参考避免内存泄露


2
是的,非常抱歉,我已经检查了链接,确实Context是Activity的超类。无论如何,说Activity是一个Context并不完全正确,Activity是一个更复杂的对象,而Context只是一个保存信息并提供访问资源的块。 - Egor
@Rafael T 感谢您给出了正确的答案。 - Android
18
如果我提到面向对象的语言,完全正确:Java中的每个对象都是从Object.class继承而来,因此实际上一切都是对象。更具体地说,Activity是Context的一个特化。如果我有一个抽象类Animal和两个派生自Animal的类(Cat、Dog),这两个类至少是动物。在需要动物的任何地方,你都可以传递猫或狗,就像对于Context而言一样!在您给出反对意见之前,请确认信息是否正确。 - Rafael T
1
“Activity上下文会随着Activity的销毁而消失,而应用程序上下文则在应用程序存活期间一直存在。”这句话似乎有些不对。第一个是应该指“应用程序”上下文而不是“Activity”上下文。 - FirstOne

10
如您所见在Android文档上:

Activity类继承自"ContextThemeWrapper",而它则从"ContextWrapper"继承,再从"Context"继承。

因此,是的,Activity扩展了Context!


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接