前言
搞清楚Page Ability后,Service Ability的概念和使用也得刻入DNA中
一.Service Ability基本概念
Service是单实例的。在一个设备上,相同的Service只会存在一个实例。如果多个Ability共用这个实例,只有当与Service绑定的所有Ability都退出后,Service才能够退出。
由于Service是在主线程里执行的,因此,如果在Service里面的操作时间过长,开发者必须在Service里创建新的线程来处理,防止造成主线程阻塞,应用程序无响应。所以那种情况要创建子线程呢,举个栗子:
比如说大视频解码,编码,大文件的处理时,处理时间过长的这种服务我们就应该放在子线程中,如果放在主线程的话,容易造成应用程序无响应。
二.创建Service Ability
命令为LocalServiceAbility
然后同样的方式再创建一个,命令为RemoteServiceAbility
1.LocalServiceAbility修改
我们回到LocalServiceAbility,做一些简单的修改
将红色框的erro修改为info,不然的话是红色,不好识别,然后format里面的内容我们加上特殊符号,不一定是+号,反正易于识别就行了。
下面的这行代码也要改
改为下图
tag改为文件名,也是方便在看日志时易于识别,type改为HiLog.LOG_APP,
2.修改RemoteServiceAbility
同上原理一样,修改RemoteServiceAbility,只不过domain改为0xD001200,tag改为本文件名,该加特殊符号的加特殊符号
创建一个utils包
获取远程设备的id的工具DeviceUtils
UI组件工具
代码
package com.harmony.myapplication.utils; import ohos.agp.utils.LayoutAlignment; import ohos.agp.window.dialog.ToastDialog; import ohos.app.Context; public class UIUtils { public static void showTip(Context context,String msg){ ToastDialog toastDialog = new ToastDialog(context); toastDialog.setText(msg); toastDialog.setAlignment(LayoutAlignment.CENTER); toastDialog.show(); } }
三.启动,停止Service
1.启动Service
如何启动Service,Ability为开发者提供了startAbility()方法来启动另外一个Ability,因为Service也是Ability的一种,开发者同样可以通过将Intent传递给该方法来启动Service。不仅支持启动本地Service,还支持启动远程Service。
启动Service主要用于启动一个服务执行后台任务或者远程启动一个功能,不进行通信,比如:用一个设备让另一个播放音乐。Service在其他Ability调用startAbility()时创建,然后保持运行。
(1).onStart()
该方法在创建Service的时候调用,用于Service的初始化。在Service的整个生命周期只会调用一次,调用时传入的Intent应为空。
(2).onCommand()
在Service创建完成之后调用,该方法在客户端每次启动该Service时都会调用,开发者可以在该方法中做一些调用统计、初始化类的操作。
(3).onStop()
在Service销毁时调用。Service应通过实现此方法来清理任何资源,如关闭线程、注册的侦听器等。
2.停止Service
Service一旦创建就会一直保持在后台运行,除非必须回收内存资源,否则系统不会停止或销毁Service。开发者可以在Service中通过terminateAbility()停止本Service或在其他Ability调用stopAbility()来停止Service。
停止Service同样支持停止本地设备Service和停止远程设备Service,使用方法与启动Service一样。一旦调用停止Service的方法,系统便会销毁Service。
三.Service的连接和断开
1.连接Service
如果Service需要与Page Ability或其他应用的Service Ability进行交互,则须创建用于连接的Connection。Service支持其他Ability通过connectAbility()方法与其进行连接。
onConnect()
在Ability和Service连接时调用,该方法返回IRemoteObject对象,开发者可以在该回调函数中生成对应Service的IPC通信通道,以便Ability与Service交互。Ability可以多次连接同一个Service,系统会缓存该Service的IPC通信对象,只有第一个客户端连接Service时,系统才会调用Service的onConnect方法来生成IRemoteObject对象,而后系统会将同一个RemoteObject对象传递至其他连接同一个Service的所有客户端,而无需再次调用onConnect方法。
连接时需要使用connectAbility()方法,需要传入目标Service的Intent与IAbilityConnection的实例,IAbilityConnection提供了两个方法供开发者实现:onAbilityConnectDone()是用来处理连接Service成功的回调,onAbilityDisconnectDone()是用来处理Service异常死亡的回调。
2.断开Service
该Service在其他Ability调用connectAbility()时创建,客户端可通过调用disconnectAbility()断开连接。多个客户端可以绑定到相同Service,而且当所有绑定全部取消后,系统即会销毁该Service。
onDisconnect()
在Ability与绑定的Service断开连接时调用。