鸿蒙应用服务开发实战:

构建跨设备后台服务—— 基于HarmonyOS 4.0的Service Ability开发指南


一、鸿蒙服务核心概念

1.1 什么是应用服务?
鸿蒙的Service Ability(服务能力)是可在后台长期运行的应用组件,无UI界面,适用于音乐播放、数据同步、设备连接等场景。与Android服务不同,鸿蒙服务天然支持跨设备调用

1.2 关键特性:

  • 独立进程:默认运行在独立进程(需配置)

  • 跨设备协同:通过分布式能力调用其他设备服务

  • 生命周期精简onStartonCommandonConnectonDisconnect

  • 后台持续运行:需申请ohos.permission.KEEP_BACKGROUND_RUNNING权限


二、服务开发全流程(附代码)
2.1 创建Service Ability

java

// BackgroundService.java
public class BackgroundService extends Ability {
    private static final String TAG = "BackgroundService";
    
    @Override
    public void onStart(Intent intent) {
        super.onStart(intent);
        // 服务初始化
        HiLog.info(TAG, "Service started");
        startTimerTask(); // 启动后台任务
    }

    private void startTimerTask() {
        // 示例:每30分钟执行健康提醒
        BackgroundTaskManager.getInstance()
            .addTask(new IntervalTask(30 * 60 * 1000, () -> {
                showHealthNotification();
                return 0;
            }));
    }

    private void showHealthNotification() {
        NotificationRequest request = new NotificationRequest(NotificationRequest.NORMAL_NOTIFICATION)
            .setContent(new NotificationContent("健康提醒", "起身活动一下吧!", null))
            .setTapAction(new Intent());
        getContext().getAbilityManager().publishNotification(request);
    }

    @Override
    public void onCommand(Intent intent, boolean restart, int startId) {
        // 处理startAbility()发起的命令
    }

    @Override
    public IRemoteObject onConnect(Intent intent) {
        // 返回IRemoteObject供跨进程调用
        return new RemoteObjectStub("health_service") {
            @Override
            public void onRemoteRequest(int code, MessageParcel data, ...) {
                // 处理跨设备请求
            }
        };
    }
}
2.2 配置服务声明

config.json关键配置:

json

{
  "module": {
    "abilities": [
      {
        "name": ".BackgroundService",
        "type": "service",
        "backgroundModes": ["dataTransfer", "location"], // 后台模式
        "visible": true // 允许跨设备发现
      }
    ],
    "reqPermissions": [
      {
        "name": "ohos.permission.KEEP_BACKGROUND_RUNNING"
      }
    ]
  }
}
2.3 启动/停止服务

java

// 启动服务(同一设备)
Intent startIntent = new Intent();
startIntent.setElement(new ElementName("", "com.example.health", "BackgroundService"));
startAbility(startIntent);

// 跨设备调用(需先发现设备)
List<DeviceInfo> devices = DeviceManager.getDeviceList(DeviceInfo.FLAG_GET_ONLINE_DEVICE);
DeviceInfo device = devices.get(0);
Intent remoteIntent = new Intent();
remoteIntent.setElement(new ElementName(device.getDeviceId(), ...));
startAbility(remoteIntent);

三、实战案例:健康助手跨设备提醒服务

场景描述:手机端后台服务定时推送健康提醒,用户可通过手表关闭提醒。

3.1 架构设计

text

手机端Service --(分布式消息)--> 手表端FA
       ↑
   定时触发器
       ↓
   本地通知
3.2 关键代码实现

1. 手机服务端(接收手表指令)

java

public class RemoteObjectStub extends RemoteObject {
    @Override
    public boolean onRemoteRequest(int code, MessageParcel data, ...) {
        if (code == 1001) { // 关闭提醒指令
            cancelCurrentNotification();
            return true;
        }
        return super.onRemoteRequest(code, data, reply, option);
    }
}

2. 手表端(发送关闭命令)

java

// 获取远程服务代理
IRemoteObject remoteObj = AbilityConnectManager.connectRemoteDevice(deviceId, connectParams);
IMessageService service = MessageServiceStub.asInterface(remoteObj);

// 发送关闭指令
MessageParcel request = MessageParcel.obtain();
service.sendRequest(1001, request, null, 0);
3.3 运行效果
  1. 手机每30分钟弹出通知:“起身活动一下吧!”

  2. 手表端显示操作按钮【关闭提醒】

  3. 点击后手机服务停止当前周期任务


四、避坑指南
  1. 后台保活限制

    • 非系统应用单次后台任务≤10分钟

    • 需在backgroundModes声明具体类型(如dataTransfer)

  2. 跨设备调用权限

    xml

    <reqPermissions>
      <name>ohos.permission.DISTRIBUTED_DATASYNC</name>
    </reqPermissions>
  3. 服务解耦建议

    • 耗时操作使用TaskDispatcher异步执行

    • 跨设备通信数据<1MB(鸿蒙3.0+支持大文件传输)


五、扩展能力

结合鸿蒙特有技术增强服务:

  • 原子化服务:将服务封装为免安装卡片

  • DMS分布式任务调度:协调多设备服务执行链

  • HiChain:跨设备服务调用鉴权

结语:鸿蒙的服务开发范式强调设备协同资源可控。通过本文的Service Ability实践,开发者可掌握后台服务、跨设备通信等核心能力,为构建全场景体验打下基础。后续可进一步探索元服务、端云协同等进阶特性。

Logo

讨论HarmonyOS开发技术,专注于API与组件、DevEco Studio、测试、元服务和应用上架分发等。

更多推荐