本文同步发表于我的微信公众号,微信搜索 程语新视界 即可关注,每个工作日都有文章更新
1. Page Ability开发入门:生命周期与基础用法
① 生命周期详解
// Page Ability生命周期示例
export default class MainPage extends Ability {
onInit() { console.log('初始化资源'); } // 适合初始化变量
onReady() { console.log('UI首次渲染完成'); } // 可操作DOM
onShow() { console.log('页面可见'); } // 恢复动画/数据加载
onHide() { console.log('页面隐藏'); } // 暂停耗时操作
onDestroy() { console.log('释放资源'); } // 清理定时器/监听
}
关键差异:
- 对比Android Activity:
onReady在UI布局完成后触发,精准控制渲染时机 。 - 多实例模式:
Standard(默认):每次启动新实例(如商品详情页)Singleton:全局单例(如音乐播放页)
② 基础页面跳转(显式跳转传参)
发送方(AbilityA) 通过startAbility的parameters字段传递参数:
// 跳转到另一个Page Ability
featureAbility.startAbility({
want: {
bundleName: 'com.example.app',
abilityName: 'TargetAbility',
parameters: {
id: 123,
message: 'Hello from AbilityA'
}
}
});
接收方(TargetAbility) 在目标Ability的onCreate或onNewWant中获取参数:
export default class TargetAbility extends Ability {
onCreate(want: Want) {
const receivedId = want.parameters?.id; // 获取参数
const receivedMsg = want.parameters?.message;
console.log(`收到参数:id=${receivedId}, msg=${receivedMsg}`);
}
}
关键点:
- 参数通过
want.parameters对象获取,需判空处理 。 - 若Ability已存在(非首次创建),需在
onNewWant中处理新参数 。
2. 带返回值的跳转(startAbilityForResult)
发送方(AbilityA) 使用startAbilityForResult并处理返回值:
const context = getContext(this) as common.UIAbilityContext;
context.startAbilityForResult({
bundleName: 'com.example.app',
abilityName: 'TargetAbility',
parameters: { requestCode: 1 }
}).then((result) => {
if (result.want?.parameters?.response) {
console.log(`返回结果:${result.want.parameters.response}`);
}
});
接收方(TargetAbility) 通过terminateSelfWithResult返回数据:
const context = getContext(this) as common.UIAbilityContext;
context.terminateSelfWithResult({
resultCode: 0,
want: {
parameters: { response: 'Processed successfully' }
}
});
适用场景:订单支付、权限申请等需回调的场景
3. 隐式跳转参数获取
隐式跳转通过action和entities匹配目标Ability,参数获取方式与显式相同:
// 发送方
featureAbility.startAbility({
want: {
action: 'ohos.action.view',
entities: ['entity.system.browser'],
parameters: { url: 'https://example.com' }
}
});
// 接收方(需在config.json中声明匹配规则)
export default class BrowserAbility extends Ability {
onCreate(want: Want) {
const url = want.parameters?.url; // 获取URL参数
}
}
注意:需在config.json中声明skills匹配规则
4. Service Ability进阶:后台任务与跨进程通信
① 后台服务开发
// 文件下载服务示例
export default class DownloadService extends Ability {
private tasks: Map<string, DownloadTask> = new Map();
onCommand(want) {
const url = want.parameters.url;
this.tasks.set(url, new DownloadTask(url).start());
return new DownloadStub(); // 返回通信接口
}
}
优化技巧:
- 使用
Worker线程避免主线程阻塞 - 通过
want参数区分任务类型(下载/上传)
② IPC通信实战
// 客户端调用Service
const proxy = await featureAbility.connectAbility({
bundleName: 'com.example',
abilityName: 'DownloadService'
});
proxy.send({ url: 'https://example.com/file.zip' });
3. Ability间通信机制深度解析
通信方式对比:
| 方式 | 适用场景 | 代码示例 | 延迟(1KB数据) |
|---|---|---|---|
| Want | 简单参数传递 | startAbility({ parameters }) | 0.2ms |
| DataShare | 大数据共享 | dataAbilityHelper.insert() | 2ms |
| EventBus | 组件间事件通知 | emit('event', data) | 0.5ms |
备注:
- 敏感数据需声明
ohos.permission.INTERNET权限
461




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



