更多面试题请看这里:https://interview.raoyunsoft.com/
Context(上下文) 是 Android 系统中核心的抽象类,代表应用程序环境的全局信息接口。它提供访问应用资源、启动组件、获取系统服务等能力,贯穿整个 Android 开发流程。以下是关键知识点:
1. Context 的核心作用
- 访问资源:获取字符串、图片、颜色等应用资源(
getResources()) - 启动组件:启动 Activity、发送广播、绑定 Service
- 获取系统服务:访问 LocationManager、SensorService 等(
getSystemService()) - 文件与数据库操作:读写应用私有目录
2. Context 的继承关系
- 具体实现类:
ContextImpl(实际功能实现) - 包装类:
ContextWrapper(通过mBase持有ContextImpl) - UI 相关 Context:
ContextThemeWrapper(Activity 的父类,含主题信息)
📌 关键机制:Activity/Service/Application 在创建时通过
attachBaseContext()将自身的ContextImpl注入ContextWrapper.mBase。
3. 不同 Context 的使用场景
| Context 类型 | 适用场景 | 限制 |
|---|---|---|
| Activity Context | 启动 Activity、弹 Dialog、UI 操作 | 可能引发内存泄漏(避免长生命周期引用) |
| Application Context | 全局单例、后台服务、资源访问 | 不可直接启动 UI 相关组件 |
| Service Context | 后台任务、绑定服务 | 启动 Activity 需 FLAG_ACTIVITY_NEW_TASK |
启动 Activity 的规则:
// 正确用法(非 Activity Context 需添加 FLAG)
context.startActivity(Intent(context, TargetActivity::class.java).apply {
flags = Intent.FLAG_ACTIVITY_NEW_TASK
})
4. getApplication() vs getApplicationContext()
| 方法 | 返回值 | 使用限制 |
|---|---|---|
getApplication() | Application 实例 | 仅限 Activity/Service 直接调用 |
getApplicationContext() | Application 实例 | 通用性更强,但需注意特殊情况 |
特殊场景:
- BroadcastReceiver:只能通过
getBaseContext().getApplicationContext()获取 Application - ContentProvider:
// 可能返回 null(多 APK 进程时) val appContext = context.applicationContext ?: fallbackSolution()
5. 典型内存泄漏场景
// 错误示例:静态变量持有 Activity Context
class Singleton {
companion object {
var context: Context? = null // 可能泄漏 Activity
}
}
// 正确做法:使用 Application Context
Singleton.context = applicationContext
⚠️ 规避建议:UI 操作(如 Dialog/Toast)优先用 Activity Context,全局对象使用 Application Context。
6. Context 的获取方式
| 组件 | 获取方法 |
|---|---|
| Activity | this 或 baseContext |
| Fragment | requireContext() |
| Service | this 或 baseContext |
| BroadcastReceiver | context(onReceive 参数) |
| ContentProvider | context(onCreate 返回值) |
| View | getContext() |

被折叠的 条评论
为什么被折叠?



