ActivityContext和ApplicationContext

105 阅读4分钟

Activity和Application Context在Android开发中扮演着不同的角色,它们在继承和实现方式以及用途上存在着明显的异同。

异同点

继承与实现方式

相同点

  • Activity和Application,都继承自Context类或其子类ContextWrapper。
    • Application则直接继承自ContextWrapper(Context的子类)。Service同是ContextWrapper。

    • Activity继承自ContextThemeWrapper(ContextWrapper的子类), 这允许Activity拥有主题(Theme)的支持,从而能够呈现更加丰富的用户界面。

    • ContextThemeWrapper和ContextImpl都继承于Context。后者是Context相关功能具体实现类,在调用attachBaseContext()方法时创建起来的。

不同点

  • 继承层次: Activity由于需要支持UI显示和主题等特性,其继承链相对较长; 而Application的继承链则相对较短。

  • 功能侧重: Activity Context主要用于与UI相关的操作,如加载布局、启动新的Activity、显示对话框等; 而Application Context用于如全局资源访问、文件操作、广播接收器的注册等。

生命周期

Activity Context

  • 主要用于与UI相关的操作,如加载布局、启动新的Activity、显示对话框等。
  • 其生命周期与Activity的生命周期相同,当Activity被销毁时,其Context也随之失效。

Application Context

  • 是整个应用程序的全局Context,在应用程序启动时创建,并在应用程序的生命周期内持续存在。
  • 不依赖于任何Activity或Service的生命周期,因此可以在应用程序的任何地方被访问和使用。
  • 主要用于非UI相关操作,如全局资源访问、文件操作、广播接收器的注册等。

总结

Activity和Application Context在继承和实现方式上虽然都源于Context类或其子类,但它们在继承层次和功能侧重上存在差异。Activity Context更多地关注UI相关的操作,而Application Context则更多地关注全局应用层面的操作。在选择使用时,应根据具体场景和需求来决定使用哪种类型的Context。同时,还需要注意避免内存泄漏等问题,确保应用程序的稳定性和性能。


ContextWrapperContextThemeWrapper体现了装饰者模式(Decorator Pattern)和适配器模式(Adapter Pattern)的某些方面,尽管它们并不完全等同于这些模式的标准实现。

装饰者模式(Decorator Pattern)

装饰者模式是一种结构型设计模式,它允许你通过将一个对象放入包含行为的特殊封装对象中来为对象添加新的行为。就 ContextWrapperContextThemeWrapper 而言,它们通过包装(wrapping)另一个 Context 对象来扩展其功能,这在一定程度上体现了装饰者模式的思想。

  • ContextWrapper:这个类通过包装另一个 Context 对象来提供对 Context 功能的访问。它本身不添加新的功能,而是提供了一种方式来修改或增强被包装 Context 的行为(尽管在 ContextWrapper 的直接实现中可能并不明显,但它是这种思想的基础)。

  • ContextThemeWrapper:这个类扩展了 ContextWrapper,并添加了对主题(theme)的支持。它展示了如何通过包装另一个 Context 并添加额外的功能(在这种情况下是主题支持)来扩展 Context 的能力。这完全符合装饰者模式的核心思想,即在不修改原有对象结构的情况下,动态地给一个对象添加一些额外的职责。

适配器模式(Adapter Pattern)

虽然 ContextWrapperContextThemeWrapper 的主要设计思想更接近于装饰者模式,但它们也间接地体现了适配器模式的一些方面。适配器模式是一种结构型设计模式,它允许将类的接口与另一个不兼容的接口一起工作。在 Android 的上下文中,这通常意味着将一个类的接口转换为客户端所期望的另一个接口。

  • 间接体现:虽然 ContextWrapperContextThemeWrapper 本身并不直接实现接口转换,但它们通过包装和扩展 Context 对象,使得这些对象可以适应不同的使用场景(例如,带有特定主题的 Context)。这可以看作是一种“接口适应”的变体,即不是直接转换接口,而是通过添加或修改行为来使对象适应不同的需求。

总结

ContextWrapperContextThemeWrapper 主要体现了装饰者模式的思想,通过包装和扩展 Context 对象来提供额外的功能或修改现有功能。同时,它们也间接地展示了适配器模式的一些方面,即通过修改和扩展来使对象适应不同的使用场景。这些设计思想和模式的应用,使得 Android 的 Context 系统更加灵活和强大。