十三、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);