鸿蒙 鸿蒙 OS 浅出学习笔记(五)

狂天 · 2021年06月23日 · 1944 次阅读

十三、Service 模版
Service 模版的 Ability,主要用于后台运行的任务,比如音乐播放,文件下载等,没有界面,切换到后台自动运行。

Service 的创建方法:
Service 也是一种 Ability,它的创建方法是:
public class ServiceAbility extends Ability
也是继承 Ability,那怎么区分它是 Ability 还是 Service 呢?
在配置里注册进行区分:
{
"module": {
"abilities": [

{

"name": ".ServiceAbility",
//这里填 service 进行区分
"type": "service",
"visible": true
...
}
]
...
}

如何通过代码启动 Ability?
通过创建一个 intent 的 OperationBuilder 方法传递参数。

Intent 的作用是?
用于对象之间传递信息。
例如一个 Ability 启动另一个 Ability:

OperationBuilder 代码示例:

//创建intent对象
Intent intent = new Intent();
Operation operation = new Intent.OperationBuilder()
        //这里传设备id,本地则可以留空
        .withDeviceId("")
        //包名
        .withBundleName("com.huawei.hiworld.himusic")
      //启动的ability名称   .withAbilityName("com.huawei.hiworld.himusic.entry.ServiceAbility")
        .build();
intent.setOperation(operation);
//启动service
startAbility(intent);

注:Service 一旦创建就会一直在后台运行,开发者可通过调用 stopAbility() 来停止 Service。

连接 Service:
如果 Service 需要与其他应用的 Ability 交互,需要使用 connectAbility 方法。

// 创建连接回调实例
private IAbilityConnection connection = new IAbilityConnection() {
    // 连接到Service的回调
    @Override
    public void onAbilityConnectDone(ElementName elementName, IRemoteObject iRemoteObject, int resultCode) {
        // 在这里开发者可以拿到服务端传过来IRemoteObject对象,从中解析出服务端传过来的信息
    }

    // 断开与连接的回调
    @Override
    public void onAbilityDisconnectDone(ElementName elementName, int resultCode) {
    }
};
// 连接Service
connectAbility(intent, connection);

前台 Service:
一般情况下,Service 都是在后台运行,后台 Service 运行的优先级较低,资源不足时系统就可能回收后台 Service。
如果希望应用可以一直运行,那就需要设置前台 Service。
前台 Service 会一直显示在系统状态栏。
如何设置前台 Service?
调用 keepBackgroundRunning() 将 Service 与通知绑定。
代码为:

// 创建通知,其中1005为notificationId
NotificationRequest request = new NotificationRequest(1005);
NotificationRequest.NotificationNormalContent content = new NotificationRequest.NotificationNormalContent();
content.setTitle("title").setText("text");
NotificationRequest.NotificationContent notificationContent = new NotificationRequest.NotificationContent(content);
request.setContent(notificationContent);
// 绑定通知,1005为创建通知时传入的notificationId
keepBackgroundRunning(1005, request);
暂无回复。
需要 登录 后方可回复, 如果你还没有账号请点击这里 注册