对于 Context,你了解多少?

更多面试题请看这里:https://interview.raoyunsoft.com/

Context(上下文) 是 Android 系统中核心的抽象类,代表应用程序环境的全局信息接口。它提供访问应用资源、启动组件、获取系统服务等能力,贯穿整个 Android 开发流程。以下是关键知识点:


1. Context 的核心作用
  • 访问资源:获取字符串、图片、颜色等应用资源(getResources()
  • 启动组件:启动 Activity、发送广播、绑定 Service
  • 获取系统服务:访问 LocationManager、SensorService 等(getSystemService()
  • 文件与数据库操作:读写应用私有目录

2. Context 的继承关系
Context
ContextImpl
ContextWrapper
Application
Service
ContextThemeWrapper
Activity
  • 具体实现类ContextImpl(实际功能实现)
  • 包装类ContextWrapper(通过 mBase 持有 ContextImpl
  • UI 相关 ContextContextThemeWrapper(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 的获取方式
组件获取方法
ActivitythisbaseContext
FragmentrequireContext()
ServicethisbaseContext
BroadcastReceivercontext(onReceive 参数)
ContentProvidercontext(onCreate 返回值)
ViewgetContext()
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值