第7章 多Ability应用开发

233 阅读2分钟

7.1 什么是 Ability?

在鸿蒙应用中,Ability(能力) 是应用的基本单元,相当于 Android 的 Activity + Service

主要分为几类:

  1. FA(Feature Ability)

    • 带界面的能力,负责 UI 展示。
    • 例如:一个页面、一个登录界面。
  2. PA(Particle Ability)

    • 无界面的能力,类似 Android 的后台服务。
    • 可以在后台执行逻辑,如音乐播放、计步、下载任务。
  3. 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 协作(计步器应用)