用户登录
用户注册

分享至

20、鸿蒙OS Service模板的Ability基本概念,怎么创建Service、启动Service

  • 作者: 奔跑的二大爷S
  • 来源: 51数据库
  • 2022-10-14

基于 Service 模板的 Ability(以下简称“Service”)主要用于后台运行任务(如执行音乐播放、文件下载等),但不提供用户交互界面。Service 可由其他应用或 Ability 启动,即使用户切换到其他应用,Service 仍将在后台继续运行。

Service 是单实例的。在一个设备上,相同的 Service 只会存在一个实例。如果多个 Ability 共用这个实例,只有当与 Service 绑定的所有 Ability 都退出后,Service 才能够退出。由于 Service 是在主线程里执行的,因此,如果在 Service 里面的操作时间过长,开发者必须在 Service 里创建新的线程来处理(详见线程间通信),防止造成主线程阻塞,应用程序无响应。

介绍如何创建一个Service。


  1. 创建 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();       }   }


  1. 注册 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。


软件
前端设计
程序设计
Java相关