
回复
哈喽!我是小L,那个在鸿蒙开发里「玩转上下文」的女程序员~ 你知道吗?在鸿蒙应用里,Context
就像一把「万能钥匙」——从访问资源到启动组件,从存储数据到跨组件通信,几乎所有操作都离不开它!今天就来聊聊这个「无处不在」的核心概念,看它如何支撑应用的「全生命周期」~
本质定位:
graph LR
A[Context] --> B[资源访问]
A --> C[组件启动]
A --> D[系统服务获取]
A --> E[数据存储]
A --> F[跨组件通信]
特点:
// 获取全局上下文
const appContext = this.context.applicationContext;
// 访问全局字符串资源
const appName = appContext.getString('string.app_name');
// 获取系统传感器服务
const sensorManager = appContext.getSystemService(Context.SENSOR_SERVICE);
特点:
// 在UIAbility中获取自身Context
const abilityContext = this.context;
// 启动新的AbilitySlice
abilityContext.startAbilitySlice(new Want({
deviceId: '',
bundleName: 'com.example.app',
abilityName: '.DetailAbilitySlice'
}));
// 获取当前窗口的焦点管理器
const focusManager = abilityContext.getFocusManager();
1. 静态资源访问
// 访问字符串资源
const title = context.getString('string.title');
// 访问图片资源
const icon = PixelMap.create(context, 'media:icon');
// 访问布局资源
const layout = LayoutScatter.getInstance(context).parse('layout/main_layout');
2. 动态资源适配
// 根据设备类型加载不同字符串
if (context.getDeviceType() === DeviceType.PHONE) {
context.getString('string.phone_only_text');
} else {
context.getString('string.tablet_text');
}
1. 启动UIAbility
const want = {
bundleName: 'com.example.app',
abilityName: '.MainAbility',
parameters: { userId: '123' } // 传递参数
};
context.startAbility(want);
2. 启动ServiceExtensionAbility
const serviceWant = {
deviceId: '',
bundleName: 'com.example.service',
abilityName: '.DataSyncService'
};
context.startAbility(serviceWant);
服务类型 | 获取方式 | 典型用途 |
---|---|---|
电源管理 | context.getSystemService(Context.POWER_SERVICE) |
监听屏幕状态变化 |
网络管理 | context.getSystemService(Context.NETWORK_SERVICE) |
检测网络连接状态 |
通知服务 | context.getSystemService(Context.NOTIFICATION_SERVICE) |
发送系统通知 |
剪贴板服务 | context.getSystemService(Context.CLIPBOARD_SERVICE) |
读写剪贴板内容 |
示例:获取网络状态
const networkManager = context.getSystemService(Context.NETWORK_SERVICE) as NetworkManager;
networkManager.on(NetworkEvent.NETWORK_CHANGE, (status) => {
if (status.isConnected) {
this.loadData();
}
});
类型 | 作用范围 | 生命周期 | 线程安全 | 典型场景 |
---|---|---|---|---|
AppStorage | 应用全局 | 应用进程存活期间 | 是 | 跨组件共享临时状态 |
LocalStorage | 组件/页面级 | 随组件销毁释放 | 是 | 保存组件私有状态 |
示例:使用AppStorage存储用户登录状态
// 登录成功时存储token
context.getAppStorage().set('userToken', 'abc123');
// 在其他组件中获取token
const token = context.getAppStorage().get('userToken');
if (token) {
this.fetchUserProfile();
}
1. 内部存储(私有目录)
// 获取文件目录(/data/user/0/包名/files/)
const filesDir = context.getFilesDir();
const filePath = filesDir + '/user_data.json';
// 写入文件
const file = context.openFileOutput('log.txt', 0o666);
file.write('Hello, HarmonyOS!');
2. 加密存储(敏感数据)
if (context.isDeviceEncrypted()) {
// 获取加密目录(需设备加密支持)
const encryptedDir = context.getEncryptedFilesDir();
const encryptedFile = encryptedDir + '/secret.dat';
// 使用AES加密写入数据
encryptAndWrite(encryptedFile, sensitiveData);
}
场景:UIAbility与Service之间的状态同步
// 在Service中发布事件
context.getEventHub().publish('data_updated', newData);
// 在UIAbility中订阅事件
context.getEventHub().on('data_updated', (data) => {
this.updateUI(data);
});
场景:主应用与ExtensionAbility通信
// 通过Want传递数据
const want = new Want();
want.setParam('key', 'value');
context.startAbility(want);
// 在ExtensionAbility中接收数据
const value = this.context.getWant().getParam('key');
场景 | 错误示例 | 正确做法 |
---|---|---|
长生命周期持有短Context | static Context ctx = abilityContext; |
使用ApplicationContext |
匿名内部类持有Context | new Thread() { run() { ctx.doSomething(); } } |
弱引用包装Context |
未释放的系统服务监听 | networkManager.on(..., callback); |
在onDestroy中调用off()取消监听 |
export default class MainAbility extends UIAbility {
private context: Context;
private networkManager: NetworkManager;
onCreate() {
this.context = this.getContext(); // 保存弱引用
this.networkManager = this.context.getSystemService(Context.NETWORK_SERVICE);
}
onDestroy() {
// 移除监听
this.networkManager.off(NetworkEvent.NETWORK_CHANGE);
super.onDestroy();
}
}
支持跨设备访问上下文环境,例如:
// 获取远程设备的Context(需权限)
const remoteContext = Context.createRemoteContext('device_id', 'bundle_name');
remoteContext.startAbility(new Want());
结合AI实现自动环境适配,例如:
针对原子化服务推出轻量级上下文,减少内存占用:
// 原子化服务专用Context
const lightContext = Context.createLightContext('atomic_service');
lightContext.getAppStorage().set('temp_data', 'xxx');
应用健壮性 =(Context类型匹配度 × 资源释放及时性)÷ 内存泄漏风险
ApplicationContext
,组件状态用AbilityContext
Context
引用onDestroy
中取消