HarmonyOS 应用开发
HarmonyOS应用开发
第五章 Ability基础知识
Ability概述
一个HarmonyOS应用可以具备多少种能力,就会包含多少个Ability
FA
- Page模板是FA唯一支持的模板
- 一个Page实例可以包含一组相关页面,每个页面用一个AbilitySlice实例表示
- FA就是承担前端与用户交互的
PA
- Service模板:用于提供后台运行任务的能力
- Data模板:用于对外部提供统一的数据访问抽象
Ability的配置
- 通过配置Ability元素中的type属性来指定Ability模板类型
Ability的三层架构
- Page Ability:代表表示层
- Service Ability:代表业务层
- Data Ability:代表数据访问层
Page Ability
Page间的导航可以使用startAbility()或startAbilityForResult()方法,获得返回结果的回调为onAbilityResult()
Page Ability的基本概念
- 一个Page可以由一个或多个AbilitySlice构成,AbilitySlice是指应用的单个页面及其控制逻辑的总和
多个AbilitySlice构成一个Page
- 当一个Page由多个AbilitySlice共同构成时,这些AbilitySlice页面提供的业务能力应具有高度相关性
AbilitySlice路由配置
- 虽然一个Page可以包含多个AbilitySlice,但是Page进入前台时界面默认只能展示一个AbilitySlice。默认展示的AbilitySlice是通过setMainRoute()方法来指定的
- 如果需要更改默认展示的AbilitySlice,可以通过addActionRoute()方法为此AbilitySlice配置一条路由规则
不同Page间的导航
- 不同Page中的AbilitySlice相互不可见,因此无法通过present()或presentForResult()方法直接导航到其他Page的AbilitySlice
- AbilitySlice作为Page的内部单元,以Action的形式对外暴露,因此可以通过配置Intent的Action导航到目标AbilitySlice
Page与AbilitySlice的生命周期
Page的生命周期
Page的生命周期的不同状态转换及其对应的回调
onStart()
- 当系统首次创建Page实例时,触发该回调
- 对于一个Page实例,该回调在其生命周期过程中仅触发一次,Page在该逻辑后将进入INACTIVE状态
- 开发者必须重写该方法,并在此配置默认展示的AbilitySlice
onActive()
- Page会在进入INACTIVE状态后来到前台,然后系统调用此回调
- Page在此之后进入ACTIVE状态,该状态是应用与用户交互的状态
- Page在此之后进入ACTIVE状态,该状态是应用与用户交互的状态
- 开发者通常需要成对实现onActive()和onInactive(),并在onActive()中获取在onInactive()中被释放的资源
onInactive()
- 当Page失去焦点时,系统将调用此回调,此后Page进入INACTIVE状态
onBackground()
- 如果Page不再对用户可见,系统将调用此回调通知开发者用户进行相应的资源释放,此后Page进入BACKGROUND状态
onForeground()
- 处于BACKGROUND状态的Page仍然驻留在内存中,当重新回到前台时(比如用户重新导航到此Page),系统将先调用onForeground()回调通知开发者,而后Page的生命周期状态回到INACTIVE状态
onStop()
系统将要销毁Page时,将会触发此回调函数,通知用户进行系统资源的释放
销毁Page的可能原因包括以下几个方面:
- 用户通过系统管理能力关闭指定Page,例如使用任务管理器关闭Page
- 用户行为触发Page的terminateAbility()方法调用,例如使用应用的退出功能
- 配置变更导致系统暂时销毁Page并重建
- 系统出于资源管理的目的,自动触发对处于BACKGROUND状态Page的销毁
AbilitySlice的生命周期
- 当Page生命周期发生变化时,它的AbilitySlice也会发生相同的生命周期变化
- 此外,AbilitySlice还具有独立于Page的生命周期变化,这发生在同一Page中的AbilitySlice之间导航时,此时Page的生命周期状态不会改变
Page与AbilitySlice生命周期的关联
- 当AbilitySlice处于前台且具有焦点时,其生命周期状态随着所属Page的生命周期状态的变化而变化
- 当Page被系统销毁时,其所有已实例化的AbilitySlice将联动销毁,而不仅是处于前台的AbilitySlice
Service Ability
基于Service模板的Ability简称为Service,其主要用于后台运行任务,比如执行音乐播放、文件下载等,但不提供用户交互界面
Service是单实例的
在一个设备上,相同的Service只会存在一个实例
如果多个Ability共用这个实例,只有当与Service绑定的所有Ability都退出后,Service才能够退出
由于Service是在主线程里执行的,因此,如果在Service里面的操作时间过长,开发者必须在Service中创建新的线程来处理,防止造成主线程阻塞,应用程序无响应
创建Service
继承Ability
每个Service都是Ability的子类
Ability为Service提供了以下生命周期方法,用户可以重写这些方法来添加自己的处理
onStart()
- 该方法在创建Service的时候调用,用于Service的初始化
- 在Service的整个生命周期只会调用一次,调用时传入的Intent应为空
onCommand()
- 用户可以在该方法中做一些调用统计、初始化类的操作
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
开发者可以通过构造包含DeviceId、BundleName与AbilityName的Operation对象来设置目标Service信息
DeviceId
- 表示设备ID
- 如果是本地设备,则可以直接留空
- 如果是远程设备,则可以通过ohos.distributedschedule.interwork.DeviceManager提供的getDeviceList获取设备列表
BundleName
- 表示包名称
AbilityName
- 表示待启动的Ability名称
如果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需要与Page Ability或其他应用的Service Ability进行交互,则应创建用于连接的Connection
Service支持其他Ability通过connectAbility()方法与其进行连接
需要传入目标Service的Intent与IAbilityConnection的实例
IAbilityConnection提供了两个方法供开发者实现:
- onAbilityConnectDone()用来处理连接的回调
- onAbilityDisconnectDone()用来处理断开连接的回调
Service Ability的生命周期
与Page类似,Service也拥有生命周期
根据调用方法的不同,其生命周期有以下两种路径:
启动Service
- 该Service在其他Ability调用startAbility()时创建,然后保持运行
- 其他Ability通过调用stopAbility()来停止Service,Service停止后,系统会将其销毁
连接Service
- 该Service在其他Ability调用connectAbility()时创建,客户端可通过调用disconnectAbility()断开连接
- 多个客户端可以绑定到相同的Service,而且当所有绑定全部取消后,系统就会销毁该Service
- connectAbility()也可以连接通过startAbility()创建的Service
Data Ability
使用Data模板的Ability也简称Data
主要职责是管理其自身应用和其他应用存储数据的访问,并提供与其他应用共享数据的方法
Data既可用于同一设备不同应用的数据共享,也支持跨设备不同应用的数据共享
数据的存储方式多种多样,可以是传统意义上的数据库系统,也可以是本地磁盘上的文件
Data对外提供对数据的增、删、改、查,以及打开文件等接口,这些接口的具体实现由开发者提供
URI
Data的提供方和使用方都通过URI(Uniform Resource Identifier,统一资源定位符)来标识一个具体的数据
HarmonyOS的URI是基于URI通用标准的,具体格式如图
scheme
- 协议方案名,固定为dataability,代表Data Ability所使用的协议类型
authority
- 设备ID
- 如果为跨设备场景,则为目标设备的ID
- 如果为本地设备场景,则不需要填写
path
- 资源的路径信息,代表特定资源的位置信息
query
- 查询参数
fragment
- 用于指示要访问的子资源
URI示例
跨设备场景
- dataability://device_id/com.waylau.hmos.dataabilityhelperaccessfile.dataability.persondata/person/10
本地设备
dataability:///com.waylau.hmos.dataabilityhelperaccessfile.dataability.persondata/person/10
- 注:本地设备的device_id字段为空,因此在dataability:后面有3个“/”
访问Data
DataAbilityHelper为开发者提供了一系列的接口来访问不同类型的数据,比如文件、数据库等
访问文件
DataAbilityHelper为开发者提供了FileDescriptor openFile(Uri uri, String mode)方法来操作文件
- 其中uri用来确定目标资源路径
- mode用来指定打开文件的方式,可选方式包含r(读)、w(写)、rw(读写)、wt(覆盖写)、wa(追加写)、rwt(覆盖写且可读)
该方法返回一个目标文件的FD(文件描述符),把文件描述符封装成流,开发者就可以对文件流进行自定义处理
访问数据库
- DataAbilityHelper为开发者提供了增、删、改、查以及批量处理等方法来操作数据库
Intent
在HarmonyOS中,Intent是对象之间传递信息的载体
Intent的构成元素包括Operation与Parameters
Operation与Parameters
- Operation由表所示的属性组成
- 除了上述属性之外,开发者也可以通过Parameters传递某些请求所需的额外信息
根据Ability的全称启动应用
- 通过构造包含BundleName与AbilityName的Operation对象可以启动一个Ability,并导航到该Ability
第六章 Ability任务调度
分布式任务调度概述
“超级虚拟终端”的能力互助
- 分布式任务调度平台是支持“超级虚拟终端”的关键技术和能力,提供针对多设备场景下的统一的组件管理能力
跨设备软件访问的系统服务
全场景下的任务调度
分布式任务调度能力简介
全局查询
全局查询可以分为两个维度:针对设备的查询以及针对Ability的查询
- 针对设备的查询是指在相同组网下支持查询这个网络下到底有哪些设备,这些设备是在线的还是离线的,这个设备具备哪些Ability,等等
- 针对Ability的查询是指查询到底哪些设备支持具体的特定功能
启动和关闭
- 分布式任务调度平台提供了管理远程Ability的能力,即支持启动Page模板的Ability,以及启动、关闭Service和Data模板的Ability
连接和断开连接
- 在连接到远程设备之后,就可以对设备进行一些列的操作了。操作完成之后,也可以断开连接
轻量通信
- 轻量通信本质是指从RPC(Remote Procedure Call,远程过程调用)或者以消息的方式实现设备之间的通信
分布式任务调度实现原理
PRC
- PRC主要涉及三方面,即接口定义、序列化和反序列化
- 要实现PRC,必须要实现IRemoteBroker接口
- 同时,需要在本地及对端分别实现对外接口一致的代理
HarmonyOS设备之间的通信
- 无论是调用本地设备还是远程设备的Ability,HarmonyOS都是通过RemoteObject来实现的
- 当初次调用远程设备时,会先通过分布式调度平台获取到远程设备的一个句柄
- 在后续的通信过程中,本地设备就可以不必再依赖分布式调度平台而直接通过句柄去跟远程设备进行通信,从而提升通信效率
HarmonyOS设备与其他OS设备之间的通信
- HarmonyOS设备与其他OS设备之间无法直接通过句柄去调用,因此分布式调度平台充当了HarmonyOS设备与其他OS设备之间的代理
- 所有的通信必须经过分布式调度平台,分布式调度平台会做调用过程中的序列化和反序列化
- 因此,从通信效率而言,HarmonyOS设备与其他OS设备之间的通信效率肯定要低于HarmonyOS设备之间的通信
实现分布式任务调度
如何实现分布式任务调度
在Intent中设置支持分布式的标记
- 例如Intent.FLAG_ABILITYSLICE_MULTI_DEVICE表示该应用支持分布式调度
在config.json中的reqPermissions字段中添加多设备协同访问的权限申请
- 三方应用使用{"name": "ohos.permission.DISTRIBUTED_DATASYNC"}
PA的调用支持连接及断开连接、启动及关闭这4类行为,在进行调度时
- 必须在Intent中指定PA对应的bundleName和abilityName
- 当需要跨设备启动、关闭或连接PA时,需要在Intent中指定对端设备的deviceId
- 可通过如设备管理类DeviceManager提供的getDeviceList获取指定条件下匿名化处理的设备列表,实现对指定设备PA的启动/关闭以及连接管理
FA的调用支持启动和迁移行为,在进行调度时
- 当启动FA时,需要开发者在Intent中指定对端设备的deviceId、bundleName和abilityName
- FA的迁移实现相同bundleName和abilityName的FA跨设备迁移,因此需要指定迁移设备的deviceId
分布式任务调度支持的场景
根据Ability模板及意图的不同,分布式任务调度向开发者提供了6种能力:启动远程FA、启动远程PA、关闭远程PA、连接远程PA、断开连接远程PA和FA跨设备迁移
设备A启动设备B的FA
在设备A上通过本地应用提供的启动按钮启动设备B上对应的FA
- 例如,设备A控制设备B打开相册,只需开发者在启动FA时指定打开相册的意图即可
设备A启动设备B的PA
在设备A上通过本地应用提供的启动按钮启动设备B上指定的PA
- 例如,开发者在启动远程服务时通过意图指定音乐播放服务,即可实现设备A启动设备B音乐播放的能力
设备A关闭设备B的PA
在设备A上通过本地应用提供的关闭按钮关闭设备B上指定的PA
- 类似启动的过程,开发者在关闭远程服务时通过意图指定音乐播放服务,即可实现关闭设备B上该服务的能力
设备A连接设备B的PA
在设备A上通过本地应用提供的连接按钮连接设备B上指定的PA
- 连接后,通过其他功能相关按钮实现控制对端PA的能力
- 通过连接关系,开发者可以实现跨设备的同步服务调度,实现如大型计算任务互助等价值场景
设备A与设备B的PA断开连接
- 在设备A上通过本地应用提供的断开连接的按钮将之前已连接的PA断开连接
设备A的FA迁移至设备B
设备A上通过本地应用提供的迁移按钮将设备A的业务无缝迁移到设备B中
- 通过业务迁移能力打通设备A和设备B间的壁垒,实现如文档跨设备编辑、视频从客厅到房间跨设备接续播放等场景
第七章 Ability公共事件与通知
公共事件与通知概述
在HarmonyOS里面,系统给应用发送提示一般分为两种方式,即公共事件和通知
公共事件和通知
公共事件可分为系统公共事件和自定义公共事件
系统公共事件
- 系统将收集到的事件信息根据系统策略发送给订阅该事件的用户程序
- 例如用户可感知亮灭屏事件、系统关键服务发送的系统事件(例如USB插拔、网络连接、系统升级等)
自定义公共事件
- 应用自定义公共事件来处理业务逻辑
IntentAgent封装了一个指定行为的Intent,可以通过IntentAgent启动Ability和发送公共事件
约束与限制
公共事件的约束与限制
- 目前公共事件仅支持动态订阅
- 部分系统事件需要具有指定的权限
- 目前公共事件订阅不支持多用户
- ThreadMode表示线程模型,目前仅支持HANDLER模式,即在当前UI线程上执行回调函数
- deviceId用来指定订阅本地公共事件还是远端公共事件
- deviceId为null、空字符串或本地设备deviceId时,表示订阅本地公共事件,否则表示订阅远端公共事件
通知的约束与限制
- 通知目前支持6种样式:普通文本、长文本、图片、社交、多行文本和媒体样式
- 创建通知时必须包含其中一种样式
- 通知支持快捷回复
IntentAgent的限制
- 使用IntentAgent启动Ability时,Intent必须指定Ability的包名和类名
公共事件服务
发送公共事件需要借助CommonEventData对象,接收公共事件需要继承CommonEventSubscriber类并实现onReceiveEvent回调函数
接口说明
CommonEventData
CommonEventData封装公共事件相关信息,用于在发布、分发和接收时处理数据
- code为有序公共事件的结果码,data为有序公共事件的结果数据,仅用于有序公共事件场景
- intent不允许为空,否则发布公共事件失败
CommonEventPublishInfo
CommonEventPublishInfo封装公共事件发布相关属性、限制等信息,包括公共事件类型(有序或粘性)、接收者权限等
有序公共事件
- 主要场景是多个订阅者有依赖关系或者对处理顺序有要求
- 高优先级订阅者可修改公共事件内容或处理结果,包括终止公共事件处理
- 低优先级订阅者依赖高优先级的处理结果等
- 有序公共事件的订阅者可以通过CommonEventSubscribeInfo.setPriority()方法指定优先级,默认为0,优先级范围为[-1000, 1000],值越大优先级越高
粘性公共事件
- 指公共事件的订阅动作是在公共事件发布之后进行的,订阅者也能收到的公共事件类型
- 主要场景是由公共事件服务记录某些系统状态,如蓝牙、WLAN、充电等事件和状态
- 不使用粘性公共事件机制时,应用可以通过直接访问系统服务获取该状态
- 发布粘性公共事件可以通过setSticky()方法设置,发布粘性公共事件需要申请ohos.permission.COMMONEVENT_STICKY权限
CommonEventSubscribeInfo
CommonEventSubscribeInfo封装公共事件订阅相关信息,比如优先级、线程模式、事件范围等
线程模式
- HANDLER:在Ability的主线程执行
- POST:在事件分发线程执行
- ASYNC:在一个新创建的异步线程执行
- BACKGROUND:在后台线程执行
- 截至目前只支持HANDLER模式
CommonEventSubscriber
CommonEventSubscriber封装公共事件订阅者及相关参数
- CommonEventSubscriber.AsyncCommonEventResult类处理有序公共事件异步执行
- 目前只能通过调用CommonEventManager的subscribeCommonEvent()进行订阅
CommonEventManager
CommonEventManager是为应用提供订阅、退订和发布公共事件的静态接口类
- 发布公共事件:publishCommonEvent(CommonEventData event)
- 发布公共事件指定发布信息:publishCommonEvent(CommonEventData event, CommonEventPublishInfo publishinfo)
- 发布有序公共事件,指定发布信息和最后一个接收者:publishCommonEvent(CommonEventData event, CommonEventPublishInfo publishinfo, CommonEventSubscriber resultSubscriber)
- 订阅公共事件:subscribeCommonEvent(CommonEventSubscriber subscriber)
- 退订公共事件:unsubscribeCommonEvent(CommonEventSubscriber subscriber)
发布公共事件
发布无序的公共事件
- 发布无序的公共事件时,构造CommonEventData对象,设置Intent,通过构造operation对象把需要发布的公共事件信息传入intent对象
- 然后调用 CommonEventManager.publishCommonEvent (CommonEventData) 接口发布公共事件
发布携带权限的公共事件
- 发布携带权限的公共事件时,构造CommonEventPublishInfo对象,设置订阅者的权限
- 订阅者在config.json中申请所需的权限,各字段含义详见权限定义字段说明
发布有序的公共事件
- 发布有序的公共事件时,构造CommonEventPublishInfo对象,通过setOrdered(true)指定公共事件属性为有序公共事件
- 也可以指定一个最后的公共事件接收者
发布粘性公共事件
- 发布粘性公共事件时,构造CommonEventPublishInfo对象,通过setSticky(true)指定公共事件属性为粘性公共事件
订阅公共事件
- 订阅公共事件时,首先创建CommonEventSubscriber派生类,在onReceiveEvent()回调函数中处理公共事件
- 注意:此处不能执行耗时操作,否则会阻塞UI线程,产生用户点击没有反应等异常
退订公共事件
- 在Ability的onStop()中调用CommonEventManager.unsubscribeCommonEvent()方法来退订公共事件
- 调用后,之前订阅的所有公共事件均被退订
高级通知服务
接口说明
NotificationSlot
NotificationSlot可以对提示音、振动、锁屏显示和重要级别等进行设置
一个应用可以创建一个或多个NotificationSlot,在发送通知时,通过绑定不同的NotificationSlot实现不同的用途
NotificationSlot需要先通过NotificationHelper的addNotificationSlot(NotificationSlot)方法发布后,通知才能绑定使用
所有绑定该NotificationSlot的通知在发布后都具备相应的特性,对象在创建后将无法更改这些设置,对于是否启动相应设置,用户有最终控制权
不指定NotificationSlot时,当前通知会使用默认的NotificationSlot,默认的NotificationSlot优先级为LEVEL_DEFAULT
NotificationSlot的级别目前支持如下几种,由低到高
LEVEL_NONE:表示通知不发布
LEVEL_MIN:表示通知可以发布,但是不显示在通知栏,不自动弹出,无提示音
- 该级别不适用于前台服务的场景
LEVEL_LOW:表示通知可以发布且显示在通知栏,不自动弹出,无提示音
LEVEL_DEFAULT:表示通知发布后可在通知栏显示,不自动弹出,触发提示音
LEVEL_HIGH:表示通知发布后可在通知栏显示,自动弹出,触发提示
NotificationRequest
NotificationRequest用于设置具体的通知对象,包括设置通知的属性,如通知的分发时间、小图标、大图标、自动删除等参数,以及设置具体的通知类型,如普通文本、长文本等
通知分组:对于同一类型的通知,比如电子邮件,可以放在一个群组内展示
小图标、大图标:分别通过NotificationRequest的setLittleIcon(PixelMap)、setBigIcon(PixelMap)设置的小图标、大图标
显示时间戳:通知除了显示时间戳外,还可以显示计时器功能,包含正计时和倒计时
- 通知通过NotificationRequest的setCreateTime(Long)、setShowCreateTime(boolean)设置并显示时间戳。通知通过NotificationRequest的setShowStopwatch(boolean)显示计时器功能
- 通知通过NotificationRequest的setShowStopwatch(boolean)、setCountdownTimer(boolean)显示倒计时功能
进度条:主要用于播放音乐、下载等场景
- 通知通过NotificationRequest的setProgressBar(int, int, boolean)显示进度条
从通知启动Ability:点击通知栏的通知,可以通过启动Ability触发新的事件
- 通知通过NotificationRequest的setIntentAgent(IntentAgent)设置IntentAgent后,点击通知栏上发布的通知,将触发通知中的IntentAgent承载的事件
- IntentAgent的设置请参考IntentAgent开发指导
通知设置ActionButton:通过点击通知按钮,可以触发按钮承载的事件
- 通过NotificationRequest 的addActionButton(NotificationActionButton)附加按钮,点击按钮后可以触发相关的事件,具体事件内容如何设置需要参考NotificationActionButton
通知设置ComponentProvider:通过ComponentProvider设置自定义的布局
- 通过NotificationRequest的setCustomView(ComponentProvider)配置自定义布局,替代系统布局,具体布局信息如何设置需要参考ComponentProvider
目前支持6种通知类型,包括
普通文本(NotificationNormalContent):若为通知的标题,则通过NotificationRequest的setTitle(String)方法设置
- 若为通知的内容,则通过NotificationRequest的setText(String)方法设置
长文本(NotificationLongTextContent):长文本的内容通过setLongText(String) 设置,文本长度最大支持1024个字符
图片(NotificationPictureContent):具有图片的通知
多行(NotificationMultiLineContent):若为折叠状态下的多行通知样式的标题,则通过NotificationMultiLineContent的setTitle(String)方法设置
- 若为折叠状态下的多行通知样式的内容,则通过NotificationMultiLineContent的setText(String)方法设置
- 若为展开状态下的多行通知样式的标题,则通过NotificationMultiLineContent的setExpandedTitle(String)方法设置
- 若为展开状态下的多行通知样式的内容,则通过NotificationMultiLineContent的addSingleLine(String)方法设置
社交(NotificationConversationalContent):若为社交通知样式的标题,则通过NotificationConversationalContent的setConversationTitle(String)方法设置
- 若为社交通知样式中的消息内容,则通过NotificationConversationalContent的addConversationalMessage (ConversationalMessage)方法设置
媒体(NotificationMediaContent):若为媒体通知样式的标题,则通过NotificationMediaContent 的setTitle(String)方法设置
- 若为媒体通知样式中的消息内容,则通过NotificationMediaContent 的setText(String)方法设置
- 若为媒体通知样式对应的多媒体按钮,具备控制音频媒体的用途,则通过NotificationMediaContent的setAVToken(AVToken)、NotificationMediaContent的setShownActions(int[])方法设置
NotificationHelper
- NotificationHelper封装了发布、更新、删除通知等静态方法
- 发布一条通知:publishNotification(NotificationRequest request)
- 发布一条带TAG的通知:publishNotification(String tag, NotificationRequest)
- 取消指定的通知:cancelNotification(int notificationId)
- 取消指定的带TAG的通知:cancelNotification(String tag, int notificationId)
- 取消之前发布的所有通知:cancelAllNotifications()
- 创建一个NotificationSlot:addNotificationSlot(NotificationSlot slot)
- 获取NotificationSlo:getNotificationSlot(String slotId)
- 删除一个NotificationSlot:removeNotificationSlot(String slotId)
- 获取当前应用发布的活跃通知:getActiveNotifications()
- 获取系统中当前应用发布的活跃通知的数量:getActiveNotificationNums()
- 设置通知的角标:setNotificationBadgeNum(int num)
- 设置当前应用中活跃状态通知的数量在角标显示:setNotificationBadgeNum()
创建NotificationSlot
- NotificationSlot可以设置公共通知的震动、锁屏模式、重要级别等,并通过调用NotificationHelper.addNotificationSlot()发布NotificationSlot对象
发布通知
构建NotificationRequest对象
- 应用发布通知前,通过NotificationRequest的setSlotId()方法与NotificationSlot绑定,使该通知在发布后具备该对象的特征
设置通知内容
- 调用setContent()设置通知的内容
发送通知
- 调用publishNotification()发送通知
取消通知
取消通知分为取消指定单条通知和取消所有通知,应用只能取消自己发布的通知
取消指定的单条通知
- 调用cancelNotification()取消指定的单条通知
取消所有通知
- 调用cancelAllNotifications()取消所有通知
第八章 剪切板
剪贴板概述
- 提供系统剪贴板服务的操作接口,支持用户程序从系统剪贴板中读取、写入和查询剪贴板数据,以及添加、移除系统剪贴板数据变化的回调
- 提供剪贴板数据的对象定义,包含内容对象和属性对象
场景介绍
同一设备的应用程序A、B之间可以借助系统剪贴板服务完成简单数据的传递
在使用剪贴板服务时,需要注意以下几点
- 只有在前台获取到焦点的应用才有读取系统剪贴板的权限(系统默认输入法应用除外)
- 写入剪贴板服务中的剪贴板数据不会随应用程序的结束而销毁
- 对同一用户而言,写入剪贴板服务的数据会被下一次写入剪贴板的数据所覆盖
- 在同一设备内,剪贴板单次传递的内容不应超过500KB
接口说明
在HarmonyOS中,SystemPasteboard提供系统剪贴板操作的相关接口,比如复制、粘贴、配置回调等
- PasteData是剪贴板服务操作的数据对象,一个PasteData由若干个内容节点(PasteData.Record)和一个属性集合对象(PasteData.DataProperty)组成
- Record是存放剪贴板数据内容信息的最小单位,每个Record都有其特定的MIME类型,如纯文本、HTML、URI、Intent
- 剪贴板数据的属性信息存放在DataProperty中,包括标签、时间戳等
SystemPasteboard
SystemPasteboard提供系统剪贴板服务的操作接口,比如复制、粘贴、配置回调等
SystemPasteboard的主要接口如下
- 获取系统剪贴板服务的对象实例:getSystemPasteboard(Context context)
- 读取当前系统剪贴板中的数据:getPasteData()
- 判断当前系统剪贴板中是否有内容:hasPasteData()
- 将剪贴板数据写入系统剪贴板:setPasteData(PasteData data)
- 清空系统剪贴板数据:clear()
- 用户程序添加系统剪贴板数据变化的回调:addPasteDataChangedListener (IPasteDataChangedListener listener)
- 用户程序移除系统剪贴板数据变化的回调:removePasteDataChangedListener(IPasteData-ChangedListener listener)
PasteData
PasteData是剪贴板服务操作的数据对象,其中内容节点定义为PasteData.Record,属性集合定义为PasteData.DataProperty
PasteData的主要接口如下
- 构造器:PasteData()
- 构建一个包含纯文本内容节点的数据对象:createPlainTextData(CharSequence text)
- 构建一个包含HTML内容节点的数据对象:creatHtmlData(String htmlText)
- 构建一个包含URI内容节点的数据对象:creatUriData(Uri uri)
- 构建一个包含Intent内容节点的数据对象:creatIntentData(Intent intent)
- 获取数据对象中首个内容节点的MIME类型:getPrimaryMimeType()
- 获取数据对象中首个内容节点的纯文本内容:getPrimaryText()
- 向数据对象中添加一个纯文本内容节点:addTextRecord(CharSequence text)
- 向数据对象中添加一个内容节点:addRecord(Record record)
- 获取数据对象中内容节点的数量:getRecordCount()
- 获取数据对象在指定下标处的内容节点:getRecordAt(int index)
- 移除数据对象在指定下标处的内容节点:removeRecordAt(int index)
- 获取数据对象中所有内容节点的MIME类型列表:getMimeTypes()
- 获取该数据对象的属性集合成员:getProperty()
PasteData.Record
一个PasteData中包含若干个特定MIME类型的PasteData.Record,每个Record是存放剪贴板数据内容信息的最小单位
PasteData.Record的主要接口如下
- 构造一个MIME类型为纯文本的内容节点:createPlainTextRecord(CharSequence text)
- 构造一个MIME类型为HTML的内容节点:createHtmlTextRecord(String htmlText)
- 构造一个MIME类型为URI的内容节点:createUriRecord(Uri uri)
- 构造一个MIME类型为Intent的内容节点:createIntentRecord(Intent intent)
- 获取该内容节点中的文本内容:getPlainText()
- 获取该内容节点中的HTML内容:getHtmlText()
- 获取该内容节点中的URI内容:getUri()
- 获取该内容节点中的Intent内容:getIntent()
- 获取该内容节点的MIME类型:getMimeType()
- 将该内容节点的内容转为文本形式:convertToText(Context context)
PasteData.DataProperty
每个PasteData中都有一个PasteData.DataProperty成员,其中存放着该数据对象的属性集合,例如自定义标签、MIME类型集合列表等
PasteData.DataProperty的主要接口如下
- 获取所属数据对象的MIME类型集合列表:getMimeTypes()
- 判断所属数据对象中是否包含特定MIME类型的内容:hasMimeType(String mimeType)
- 获取所属数据对象被写入系统剪贴板时的时间戳:getTimestamp()
- 设置自定义标签:setTag(CharSequence tag)
- 获取自定义标签:getTag()
- 设置一些附加键值对信息:setAdditions(PacMap extraProps)
- 获取附加键值对信息:getAdditions()
IPasteDataChangedListener
- IPasteDataChangedListener是定义剪贴板数据变化回调的接口类,开发者需要实现此接口来编码触发回调时的处理逻辑
- IPasteDataChangedListener的主要接口是onChanged(),这个是当系统剪贴板数据发生变化时的回调接口