如果 Service 需要与 Page Ability 或其他应用的 Service Ability 进行交互,则应创建用于连接的 Connection。Service 支持其他 Ability 通过 connectAbility()方法与其进行连接。
在使用 connectAbility() 处理回调时,需要传入目标 Service 的 Intent 与 IAbilityConnection 的实例。IAbilityConnection 提供了两个方法供开发者实现: onAbilityConnectDone() 用来处理连接的回调,onAbilityDisconnectDone() 用来处理断开连接的回调。
连接 Service 的代码示例如下:
// 创建连接回调实例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) { }};// 连接ServiceconnectAbility(intent, connection);
同时,Service 侧也需要在 onConnect() 时返回 IRemoteObject,从而定义与 Service 进行通信的接口。onConnect() 需要返回一个 IRemoteObject 对象,HarmonyOS 提供了 IRemoteObject 的默认实现,用户可以通过继承 RemoteObject 来创建自定义的实现类。Service 侧把自身的实例返回给调用侧的代码示例如下:
// 创建自定义IRemoteObject实现类private class MyRemoteObject extends RemoteObject { public MyRemoteObject() { super("MyRemoteObject"); }} // 把IRemoteObject返回给客户端@Overrideprotected IRemoteObject onConnect(Intent intent) { return new MyRemoteObject();}
鸿蒙OS 生命周期
与 Page 类似,Service 也拥有生命周期,如图1所示。根据调用方法的不同,其生命周期有以下两种路径:
启动 Service
该 Service 在其他 Ability 调用 startAbility() 时创建,然后保持运行。其他 Ability 通过调用 stopAbility() 来停止 Service,Service 停止后,系统会将其销毁。
连接 Service
该 Service 在其他 Ability 调用 connectAbility() 时创建,客户端可通过调用 disconnectAbility() 断开连接。多个客户端可以绑定到相同 Service,而且当所有绑定全部取消后,系统即会销毁该 Service。
图1 Service 生命周期