Android Context 相关问题

面试一句话:Context 是“当前应用上下文”的抽象接口,真正干活的是 ContextImplContextWrapper 代理一层给 Activity/Service/Application 用;Application 的 Context 进程单例、生命周期最长,Activity/Service 各有一个。Context 个数 = 1 个 Application + N 个 Activity + M 个 Service。详见笔记《Android 面试·分章系统复习》相关章节。

阅读建议:先看 面试两问选型,再 是什么 / 整体结构 / 创建时机,最后 注意点


面试两问(结论前置)

1. Application、Activity、Service 的 Context 有什么区别?

类型生命周期典型用途注意
Application进程级单例,与进程同生共死全局配置、单例、getSharedPreferences、getSystemService不要长期持 Activity 引用,易泄漏
Activity随 Activity 创建/销毁启动 Activity、布局 inflate、主题、startActivityForResult带主题,和界面绑定
Service随 Service 创建/销毁后台逻辑、getSystemService、不带 UI 的能力无主题、无 UI

2. App 里有几个 Context?
1 个 Application + 所有 Activity 实例数 + 所有 Service 实例数(每个 Activity/Service 对应一个 Context)。


选型:什么时候用谁?


Context 是什么


Context 的整体结构

类型说明
Context抽象接口,定义 getResources、startActivity、getSystemService 等能力。
ContextWrapper代理类,内部 mBase 指向 ContextImpl,所有调用委托给 mBase;子类可改写行为而不改 Impl。
ContextImpl系统内部实现类(@hide),真正干活的;一个进程里会有多份(Application 一份,每个 Activity/Service 各一份)。

ContextWrapper 官方注释:Proxying implementation of Context that simply delegates all of its calls to another Context. Can be subclassed to modify behavior without changing the original Context.

继承与组合关系(Activity、Service、Application 都通过 ContextWrapper 持有 ContextImpl):

案例:Activity 的“带主题”Context

这样设计的优劣

维度说明
优点职责清晰:ContextImpl 只做通用上下文能力,Activity/Service/Application 各在 Wrapper 子类里扩展自己的行为(主题、生命周期等)。易扩展:新增“改写行为”只需在对应子类重写,不动 ContextImpl。Impl 可复用:同一套 ContextImpl 被 Application、Activity、Service 共用,不重复实现。符合组合优于继承:通过持有 mBase 委托,而非继承一个巨大的 Impl。
劣势多一层调用:每次 Context 调用都要经 Wrapper 再转到 mBase,多一层委托(实际开销很小)。理解成本:新人容易搞不清 Context / ContextWrapper / ContextImpl 三者的关系,需要先建立“接口 → 包装 → 实现”的模型。

Context 的创建时机


常见注意点


参考:语雀原文 Android Context 相关问题