目录
- 是什么
- Context 的三大类型
- 经典内存泄漏场景与解决方案
- Context 使用黄金法则
- 语言不生效
我们一直在使用,但却说不清楚他是什么的Context,今天我们就来讲一讲。Android Context是什么,以及使用不当会导致内存泄漏,语言不生效等等
一、是什么?
把 Android 系统想象成一个大型游乐园:
-
Context = 你的游乐园通行证 🎫
-
App = 游客(你),你自带通行证。
-
Activity = 具体游乐项目(过山车、旋转木马),通过通行证可以玩这些项目。
通行证的功能:
-
访问设施:凭通行证玩项目(访问资源)
-
获取信息:查看地图、排队时间(获取系统服务)
-
权限验证:证明你是合法游客(权限检查)
-
联系管理:找工作人员帮忙(启动组件)
简单来说,有了context,我们就可以访问系统的一些资源等等。那么有很多的种context,我们应该使用哪一个呢?什么场景使用呢?
二、Context 的三大类型(关键区别)
类型 | 获取方式 | 生命周期 | 使用场景 | 内存泄漏风险 |
---|---|---|---|---|
Application Context | getApplicationContext() |
应用全程存活(从启动到关闭) | 全局单例、长期后台服务、工具类 | ⭐ 极低(不会泄漏 Activity) |
Activity Context | this 或 getContext() |
随 Activity 销毁而结束(屏幕旋转/退出时) | UI 操作、启动 Activity、对话框、主题资源 | ⭐⭐⭐⭐ 极高(易泄漏整个 Activity) |
Service Context | this 或 getBaseContext() |
随 Service 销毁而结束 | 后台任务、绑定服务、通知栏 | ⭐⭐ 中等 |
2.1 经典内存泄漏场景与解决方案
java
// 错误示范!内存泄漏炸弹!
class AppManager {
private static AppManager instance;
private Context context; // 可能持有 Activity
private AppManager(Context context) {
this.context = context; // 危险操作!
}
public static AppManager getInstance(Context context) {
if (instance == null) {
instance = new AppManager(context);
}
return instance;
}
}
// 在 Activity 中使用:
AppManager.getInstance(this); // 埋下泄漏种子
正确姿势,在activity中,是可以直接拿到applicationcontext的
arduino
private AppManager(Context context) {
// 使用 Application Context
this.context = context.getApplicationContext();
}
2.2 Context 使用黄金法则
需求场景 | 首选 Context 类型 |
---|---|
获取资源(字符串/颜色) | Application Context ✅ |
启动 Activity | Activity Context ✅(必须!) |
显示 Toast/Dialog | Activity Context ✅ |
布局填充(LayoutInflater) | Activity Context ✅(保留主题) |
绑定 Service | Activity/Service Context ✅ |
全局工具类 | Application Context ✅ |
长期后台操作 | Application Context ✅ |
java
// 错误:可能传递 Activity Context
void doSomething(Context context) { ... }
// 正确:明确要求 Application Context
void doSomethingSafe(@NonNull Context appContext) {
// 方法内强制校验
if (appContext instanceof Application) {
throw new IllegalArgumentException("必须使用Application Context!");
}
}
2.3 设置语言不生效
如果遇到设置语言,有部分文字生效,而部分不生效,那么可以使用activity的context,为什么呢?
Application Context :加载的是初始语言资源,生命周期内不会自动更新语言配置,保持旧配置
Activity Context :会实时反映当前配置(包括语言设置)每次重建都会重新加载资源
记住这个核心原则:UI 相关操作永远使用 Activity Context,特别是涉及语言、主题等配置相关的资源加载时。这样可以确保你的应用能够正确响应动态语言切换,避免出现部分文字不生效的问题。