7.1 什么是 Ability?
在鸿蒙应用中,Ability(能力) 是应用的基本单元,相当于 Android 的 Activity + Service。
主要分为几类:
-
FA(Feature Ability)
- 带界面的能力,负责 UI 展示。
- 例如:一个页面、一个登录界面。
-
PA(Particle Ability)
- 无界面的能力,类似 Android 的后台服务。
- 可以在后台执行逻辑,如音乐播放、计步、下载任务。
-
Service Ability
- 特殊的后台能力,可以被其他应用调用,提供服务接口。
- 比如:音乐播放器应用暴露的“播放/暂停”服务。
7.2 多Ability 应用结构
一个完整的应用可能包含多个 Ability,例如:
/entry
├── src/main/ets
│ ├── MainAbility.ets (FA,主界面)
│ ├── StepService.ets (PA,后台计步)
│ ├── MusicService.ets (Service Ability,暴露接口)
├── resources
├── config.json
📌 在 config.json 中,需要注册不同的 Ability 类型。
示例:
{
"module": {
"abilities": [
{
"name": "MainAbility",
"srcEntry": "./ets/MainAbility.ets",
"type": "page"
},
{
"name": "StepService",
"srcEntry": "./ets/StepService.ets",
"type": "service"
}
]
}
}
7.3 Feature Ability(FA)与路由
FA 是最常用的 Ability,负责界面交互。
📌 示例:MainAbility.ets
@Entry
@Component
struct MainPage {
@State steps: number = 0
build() {
Column({ space: 20 }) {
Text(`今日步数:${this.steps}`)
.fontSize(26)
Button("开启后台计步").onClick(() => {
this.startStepService()
})
}
.padding(20)
}
startStepService() {
let want = {
bundleName: "com.example.steps",
abilityName: "StepService"
};
// 启动后台 PA
this.context.startAbility(want);
}
}
7.4 Particle Ability(PA)后台服务
PA 没有界面,用来执行后台任务。比如计步器。
📌 示例:StepService.ets
import common from '@ohos.app.ability.common';
export default class StepService extends common.ServiceAbility {
private steps: number = 0;
private timer: any;
onStart() {
console.log("StepService 启动");
// 模拟计步(每秒 +1)
this.timer = setInterval(() => {
this.steps++;
console.log(`当前步数: ${this.steps}`);
}, 1000);
}
onStop() {
console.log("StepService 停止");
clearInterval(this.timer);
}
}
7.5 Service Ability(跨应用服务)
Service Ability 可以提供接口给其他应用调用。
📌 示例:MusicService.ets
import rpc from '@ohos.rpc';
import common from '@ohos.app.ability.common';
class MusicStub extends rpc.RemoteObject {
constructor(descriptor: string) {
super(descriptor);
}
onRemoteRequest(code: number, data: rpc.MessageParcel, reply: rpc.MessageParcel) {
if (code === 1001) { // 播放
console.log("播放音乐");
reply.writeString("播放成功");
return true;
}
if (code === 1002) { // 暂停
console.log("暂停音乐");
reply.writeString("暂停成功");
return true;
}
return false;
}
}
export default class MusicService extends common.ServiceAbility {
onConnect(want) {
console.log("MusicService 被绑定");
return new MusicStub("MusicService");
}
onDisconnect(want) {
console.log("MusicService 断开");
}
}
📌 客户端调用示例:
import rpc from '@ohos.rpc';
async function connectMusicService() {
let want = {
bundleName: "com.example.music",
abilityName: "MusicService"
};
let connection = await this.context.connectAbility(want);
// 发送播放命令
let data = rpc.MessageParcel.create();
let reply = rpc.MessageParcel.create();
connection.sendRequest(1001, data, reply);
console.log(reply.readString()); // 播放成功
}
7.6 多Ability 交互示例:计步器应用
功能需求
- MainAbility:显示步数
- StepService:后台计步
- 数据交互:前台 UI 定时从后台获取数据
示例:前台读取后台数据
// MainAbility.ets
import rpc from '@ohos.rpc';
async function getStepCount() {
let want = {
bundleName: "com.example.steps",
abilityName: "StepService"
};
let conn = await this.context.connectAbility(want);
let data = rpc.MessageParcel.create();
let reply = rpc.MessageParcel.create();
conn.sendRequest(2001, data, reply);
return reply.readInt();
}
// StepService.ets
class StepStub extends rpc.RemoteObject {
private steps: number = 0;
constructor(descriptor: string) {
super(descriptor);
setInterval(() => { this.steps++ }, 1000);
}
onRemoteRequest(code: number, data: rpc.MessageParcel, reply: rpc.MessageParcel) {
if (code === 2001) { // 查询步数
reply.writeInt(this.steps);
return true;
}
return false;
}
}
7.7 小结
本章学习了:
- Ability 的分类(FA / PA / Service Ability)
- 如何在应用中配置和启动多个 Ability
- PA 的后台任务(计步服务)
- Service Ability 跨应用服务(音乐播放接口)
- 实战:多Ability 协作(计步器应用)