基于 service 模板的 ability(以下简称“service”)主要用于后台运行任务(如执行音乐播放、文件下载等),但不提供用户交互界面。service 可由其他应用或 ability 启动,即使用户切换到其他应用,service 仍将在后台继续运行。
service 是单实例的。在一个设备上,相同的 service 只会存在一个实例。如果多个 ability 共用这个实例,只有当与 service 绑定的所有 ability 都退出后,service 才能够退出。由于 service 是在主线程里执行的,因此,如果在 service 里面的操作时间过长,开发者必须在 service 里创建新的线程来处理(详见线程间通信),防止造成主线程阻塞,应用程序无响应。
介绍如何创建一个service。
创建 ability 的子类,实现 service 相关的生命周期方法。service 也是一种 ability,ability 为 service 提供了以下生命周期方法,用户可以重写这些方法来添加自己的处理。
onstart()
该方法在创建 service 的时候调用,用于 service 的初始化,在 service 的整个生命周期只会调用一次。
oncommand()
在 service 创建完成之后调用,该方法在客户端每次启动该 service 时都会调用,用户可以在该方法中做一些调用统计、初始化类的操作。
onconnect()
在 ability 和 service 连接时调用,该方法返回 iremoteobject 对象,用户可以在该回调函数中生成对应 service 的 ipc 通信通道,以便 ability 与 service 交互。ability 可以多次连接同一个 service,系统会缓存该 service 的 ipc 通信对象,只有第一个客户端连接 service 时,系统才会调用 service 的 onconnect 方法来生成 iremoteobject 对象,而后系统会将同一个 remoteobject 对象传递至其他连接同一个 service 的所有客户端,而无需再次调用 onconnect 方法。
ondisconnect()
在 ability 与绑定的 service 断开连接时调用。
onstop()
在 service 销毁时调用。service 应通过实现此方法来清理任何资源,如关闭线程、注册的侦听器等。
创建 service 的代码示例如下:
public class serviceability extends ability { @override public void onstart(intent intent) { super.onstart(intent); } @override public void oncommand(intent intent, boolean restart, int startid) { super.oncommand(intent, restart, startid); } @override public iremoteobject onconnect(intent intent) { super.onconnect(intent); return null; } @override public void ondisconnect(intent intent) { super.ondisconnect(intent); } @override public void onstop() { super.onstop(); } }
注册 service。
service 也需要在应用配置文件中进行注册,注册类型 type 需要设置为 service。
{ "module": { "abilities": [ { "name": ".serviceability", "type": "service", "visible": true ... } ] ... } ... }xxxxxxxxxx { "module": { "abilities": [ { "name": ".serviceability", "type": "service", "visible": true ... } ] ... } ...}{ "module": { "abilities": [ { "name": ".serviceability", "type": "service", "visible": true ... } ] ... } ...}
介绍通过startability()启动service以及对应的停止方法。
启动service
ability为开发者提供了 startability() 方法来启动另外一个 ability。因为service也是 ability 的一种,开发者同样可以通过将 intent 传递给该方法来启动 service。不仅支持启动本地 service,还支持启动远程 service。
开发者可以通过构造包含 deviceid、bundlename 与 abilityname 的 operation 对象来设置目标 service 信息。这三个参数的含义如下:
deviceid:表示设备 id。如果是本地设备,则可以直接留空;如果是远程设备,可以通过 ohos.distributedschedule.interwork.devicemanager 提供的 getdevicelist 获取设备列表,详见《 api 参考》。
bundlename:表示包名称。
abilityname:表示待启动的 ability 名称。
启动本地设备 service 的代码示例如下:
intent intent = new intent(); operation operation = new intent.operationbuilder() .withdeviceid("") .withbundlename("com.huawei.hiworld.himusic") .withabilityname("com.huawei.hiworld.himusic.entry.serviceability") .build(); intent.setoperation(operation); startability(intent);
启动远程设备 service 的代码示例如下:
operation operation = new intent.operationbuilder() .withdeviceid("deviceid") .withbundlename("com.huawei.hiworld.himusic") .withabilityname("com.huawei.hiworld.himusic.entry.serviceability") .withflags(intent.flag_abilityslice_multi_device) // 设置支持分布式调度系统多设备启动的标识 .build(); intent intent = new intent(); intent.setoperation(operation); startability(intent);
执行上述代码后,ability 将通过 startability() 方法来启动 service。
如果 service 尚未运行,则系统会先调用 onstart()来初始化 service,再回调 service 的 oncommand() 方法来启动 service。
如果 service 正在运行,则系统会直接回调 service 的 oncommand() 方法来启动 service。
停止 service
service 一旦创建就会一直保持在后台运行,除非必须回收内存资源,否则系统不会停止或销毁 service。开发者可以在 service 中通过 terminateability() 停止本 service 或在其他 ability 调用 stopability() 来停止 service。
停止 service 同样支持停止本地设备 service 和停止远程设备 service,使用方法与启动 service 一样。一旦调用停止 service 的方法,系统便会尽快销毁 service。