HarmonyOS 4.0 实况窗上线!支付宝实现医疗场景智能提醒
本文转载自支付宝体验科技,作者是蚂蚁集团客户端工程师博欢,介绍了支付宝如何基于 HarmonyOS 4.0 实况窗实现医疗场景履约智能提醒。
1.话题背景
8 月 4 日,华为在 HDC(华为 2023 开发者大会)上推出了新版本操作系统HarmonyOS 4.0,主打个性化与多元化的的口号。在功能介绍环节,支付宝依托HarmonyOS 4.0 能力提供的一项新功能出现在了大会的介绍PPT上。
这个功能乍一看就像一个系统的通知,实际上也确实是一个通知,只不过与通知有很大的区别。在华为的官方文档里,这个被称之为实时活动或者是实况通知。实时活动是最开始的名称,现在官方文档称之为实况窗。
为什么说它是国产灵动岛呢?因为这个实况窗具备多种形态,其中的胶囊态与iOS的灵动岛在UI展示上几乎就是"如出一辙"。除此之外,实况窗具有更加丰富的展示位置,从熄屏,锁屏,到桌面,通知栏,通知中心,都有其身影。我们首先来看一下官方的效果展示:
依次分别是通知栏卡片,桌面胶囊态,桌面胶囊态展开形态,锁屏卡片,胶囊态。
在上方官方的UI展示效果图上,胶囊态不光展示在桌面上,支持点击扩展为通知卡进行操作,同时出现在熄屏界面。熄屏页面的胶囊态文案不支持点击扩展为实时卡片。点击熄屏胶囊态,会进入锁屏卡片页面查看详情。
实况窗本质上是履约类消息的推送展示。华为的官方定义为:帮助用户聚焦任务,进行快速查看和及时处理的通知形体。实况窗具有实效性,阶段性和变化性的特点。实效性是指,整个通知服务会持续一段时间,在用户不主动关闭的前提下,具备自动展示和结束的能力。实效性是指,通知的消息在一段时间内有效。通知具有变化性,它是支持内容动态刷新。
2.成果展示
在了解了华为实况窗的背景和能力之后,我们回到发布会上所展示的支付宝实时活动通知。目前支付宝在最新10.5.10版本已经具备了华为实况窗能力,目前主要接入应用场景在医疗方面,后续会开放更多的应用场景。那我们先来欣赏一下支付宝上的"国产灵动岛"的真实上机形态。
通知栏状态:
左侧展示正常创建实时活动卡片;
右侧展示支持用户对卡片进行更多操作,包括设置和删除卡片。
桌面胶囊态:
左侧展示手机桌面左上角的胶囊文案;
中间侧展示点击胶囊态可展开通知卡片;
右侧展示在胶囊态展开卡片后支持用户更多操作,包括设置和删除卡片。
锁屏状态:
展示用户按下电源键进入锁屏页面展通知卡片(手机拍摄);
熄屏胶囊态:
手机界面进入息屏界面展示胶囊文案(手机拍摄);
上述所展示的仅为强调文案类模板在支付宝医疗场景下的UI效果,除了强调文案类模板外,华为还提供了多种展示模板应用于不同的场景,比如说针对打车或者外卖场景下的进度可视化类模板,针对体育赛事的赛事比分模板。
实况窗可以作为一个强提醒通知渠道,对于重要信息可以多方位展示。如果考虑到对于部分用户出现过度打扰,实时活动同样支持减少胶囊态文案透出,只出现通知栏中。
3.实现细节
展示了这么多状态的实况窗UI,大家会比较好奇怎么实现这样一套实况窗通知呢?
刚才在开头已经介绍了实况窗其实是一个通知,本质上是Android通知功能的扩展。HarmonyOS通过解析通知的扩展参数,创建对应的模板并填充数据。对于接入功能的第三方应用而言,不需要绘制UI,只需要定制接口协议与模版参数,即可实现通知活动卡片的创建与展示。另外我们所看到的胶囊态其实不是一种独立的形态,它是卡片形态的扩展形式,依附于具体的卡片模板,这就是为什么在桌面通过点击胶囊态可以展开卡片。
以支付宝接入医疗场景的实况窗为例,简单介绍一下实现细节。
3.1处理链路
在支付宝端内,实现一个实况窗通知,涉及到三个业务团队的合作,包括客户端团队,消息平台服务端团队以及消息Push团队,这三个团队的分工如下:
客户端团队:接收消息平台下发的sync消息(服务端与客户端之间的双向可靠数据同步服务,包括sync上行和下行),创建实况通知,也就是通知“上岛”,并将卡片信息与token信息发送至消息平台团队和Push团队;
消息平台服务端团队:查询用户在服务场景下创建的履约订单,按照通信协议通过sync下行通知到客户端,接收客户端sync上行的卡片信息;
Push团队:接收客户端Rpc上报的token信息,并且作为下游,接收上游消息平台传递来的卡片通知更新信息。将更新参数发送至厂商云端,由厂商完成通知卡片的更新以及删除操作;
详细的流程通过甬道图表示:
对于三方应用而言,不需要关心UI绘制。对于客户端团队而言,完成通知卡片的创建之后,无感后续的更新操作。由三方应用云端直接对接厂商云端,厂商平台接收更新数据后直接下发到对应的通知卡片,完成状态与数据更新。下图展示的是通知卡片更新状态下的数据流转:
3.2通信协议
实况窗的通信协议主要包括两方面:
三方应用内的通信协议:数据由消息平台下行到客户端,并在客户端创建通知卡片后,将更新消息发送下游Push平台。
三方应用外与厂商平台的通信协议:Push平台接收上游消息平台的更新消息后,将数据流转对接到厂商平台完成更新;
这两个通信协议其实也是通知卡片生命周期流程。三方应用内的通信协议应用于实况窗通知卡片的创建,三方应用与厂商平台的通信协议是应用于实况窗通知卡片的更新。
3.2.1 应用内通信协议
应用内的通信协议并不是独立的,而是继承自iOS灵动岛在支付宝端内的通信协议。为什么说是继承?为什么说是非独立?
继承是因为华为实况窗的协议是iOS灵动岛在支付宝端内通信协议的扩展版本,及在原有的协议基础上,扩展创建华为实时活动卡片的必须字段。整个协议的创建原则是:最大包容原则,即能复用现有字段则复用现有字段,缺少则通过团队协商后进行扩展。
非独立是指,整个通信协议的确定必须具有前瞻性,包括能满足未来支持华为更多种类模板的实时活动,也能满足后续其他国内厂商跟进同类“灵动岛”功能的需求。
这一套协议目前已经支持iOS灵动岛以及华为实况窗,由客户端团队维护.
3.2.2 应用外通信协议
应用外的通信协议主要是用于Push团队对接厂商进行通知卡片更新操作。这个的复杂在于,需要翻译应用内的通信协议。将翻译后的应用内的通信协议字段请求厂商接口,完成实况窗通知卡片的更新。
如何翻译应用内的协议,主要是将消息平台,客户端,Push三个团队的对接字段关联起来,做成一个三元组参数。
应用外的通信协议目前依然由客户端团队维护。
3.3代码接入
代码接入主要是以客户端的角度来描述。
3.3.1 创建卡片
实况窗是在通知的基础上附加了扩展参数,若是在支持实况窗的设备上发送,则系统会根据这些扩展参数,将通知按照实况窗的样式进行显示。
// 创建 bundle 保存通知信息,设置 type 为 4,表示强调文本模板类型
Bundle liveNotificationData = new Bundle();
liveNotificationData.putInt("XXXX", 0);
liveNotificationData.putString("XXXX, "Other");
liveNotificationData.putInt("XXXX", 4);
// 创建 bundle 保存强调文本模板类型的通知所需的扩展参数
Bundle feature = new Bundle();
feature.putString("XXXX", "取餐码");
feature.putString("XXXX", "750");
// 将 feature 的 bundle 设置到通知参数 liveNotificationData 中
liveNotificationData.putBundle("XXXX", feature);
// 创建通知,调用 addExtras 添加通知信息
Notification notification = new Notification.Builder(context, channelId)
3.3.2 扩展胶囊
前文讲过胶囊态是卡片的扩展形态,在开发上,设计好胶囊的参数,然后添加至实况窗卡片的扩展参数上。
// 创建 bundle 保存胶囊所需的参数
Bundle capsule = new Bundle();
capsule.putInt("XXXX", 1);
capsule.putInt("XXXX", 1);
capsule.putParcelable("XXXX", Icon.createWithResource(context, R.drawa
ble.xxx));
capsule.putInt("XXXX", Color.parseColor("# FFFF0000"));
capsule.putString("XXXX", "胶囊标题");
capsule.putString("XXXX", "胶囊扩展内容");
// 将胶囊参数设置到通知参数中
liveNotificationData.putBundle("XXXX, capsule);
4.持续优化
目前而言,华为实况窗功能在支付宝端内的的实现方案并非绝对完美,出现的问题主要是包含两个方面:
厂商推送更新能力并非百分之百:目前有数据表明华为在接收三方应用的Push更新的过程中,达到率是92%,也就是说会有8%的数据会丢失在厂商更新用户设备链路的通道上;
用户设备信息存在多业务团队的同时获取:华为实况窗卡片的更新依赖用户设备的PushToken信息,在支付宝端内目前至少存在两个团队需要获取PushToken。但是华为对PushToken的获取频次有限制,有概率会造成某个业务Token信息的获取失败;
4.1 端侧更新
对于第一个问题,厂商推送更新能力存在缺陷时,更新机制需要具有兜底措施,目前在支付宝内部保留了端内更新的能力,该能力与厂商更新有所区别,体现在更新时机以及更新字段协议。
厂商的更新时机主要是在接收到三方应用发起更新接口请求时,端内的的更新时机则是在指定时机内主动请求消息平台数据,对于更新数据采用覆盖更新,即将获取到字段按照协议更新到对应模板参数中。
4.2 PushToken复用
对于第二个问题,是支付宝端内复杂的业务场景导致,毕竟一个团队在需要PushToken时,没办法知晓哪些团队同样需要PushToken,在多个业务同时请求设备PushToken信息时,会存在失败的可能。由于时间节奏比较紧,目前的方案由Push团队收拢,在实时活动未上报PushToken的情况下,获取其他业务上传的PushToken。(在这里需要说明,华为的PushToken信息基本不变,所以区别于iOS灵动岛的Token信息上报)。
在后期的解决方案中,团队打算采用缓存方案,缓存PushToken,做到端内的业务推广,维护一套数据。
5.场景覆盖
整个实况窗的功能已经上线,只不过受限于华为鸿蒙4.0版本正式版本节奏,无法放开线上体验。目前也只接入了医疗场景。我们的业务后续会接入更多的场景。目前医疗场景覆盖的内容包括以下:
通知卡片可以透出:预约医院,预约时间,当前进度等内容。
6.未来可期
目前我们整体功能以及链路流程都是已经存在的,可以支持快速接入业务完成上线。我们支持的能力包括不限于:
- 针对音频播放类,传输进度类等业务场景的基础类型模板:
- 对于打车,外卖等业务场景的进度可视化模板:
- 针对高铁,航班等业务场景的左右文本模板:
- 针对体育赛事等业务场景的赛事分数模板(尤其是支付宝接入了NBA赛事,这个可以有):
了解更多详情>>
访问华为推送服务联盟官网
获取华为推送服务开发指导文档
访问HMS Core 联盟官网
获取HMS Core 开发指导文档
关注我们,第一时间了解 HMS Core 最新技术资讯~
相关文章:

HarmonyOS 4.0 实况窗上线!支付宝实现医疗场景智能提醒
本文转载自支付宝体验科技,作者是蚂蚁集团客户端工程师博欢,介绍了支付宝如何基于 HarmonyOS 4.0 实况窗实现医疗场景履约智能提醒。 1.话题背景 8 月 4 日,华为在 HDC(华为 2023 开发者大会)上推出了新版本操作系统…...

【响应式布局】
响应式布局 1 什么是响应式布局2 响应式布局的5种实现方案2.1 百分比布局2.2 媒体查询布局2.3 rem响应式布局2.4 vw / vh响应式布局2.5 flex弹性布局 1 什么是响应式布局 响应式布局就是一个网站能够兼容多个终端——而不是为每个终端做一个特定的版本。这个概念是为解决移动互…...

Spring面试题23:Spring支持哪些事务管理类型?Spring框架的事务管理有哪些优点?你更倾向用哪种事务管理类型?
该文章专注于面试,面试只要回答关键点即可,不需要对框架有非常深入的回答,如果你想应付面试,是足够了,抓住关键点 面试官:Spring支持哪些事务管理类型? Spring 支持以下几种事务管理类型: 编程式事务管理:通过在代码中显式地使用事务管理 API(如 TransactionTempla…...

Leetcode—— LCR 122. 路径加密
LCR 122. 路径加密 假定一段路径记作字符串 path,其中以 "." 作为分隔符。现需将路径加密,加密方法为将 path 中的分隔符替换为空格 " ",请返回加密后的字符串。 示例 1: 输入:path "a.ae…...

缓冲区溢出漏洞分析
一、实验目的 熟悉软件安全需求分析方法,掌握软件安全分析技术。 二、实验软硬件要求 1、操作系统:windows 7/8/10等 2、开发环境:VS 6.0(C)、OllyDbg 三、实验预习 《软件安全技术》教材第3章 四、实验内容&#…...

【高阶数据结构】红黑树(C++实现)
⭐博客主页:️CS semi主页 ⭐欢迎关注:点赞收藏留言 ⭐系列专栏:C进阶 ⭐代码仓库:C进阶 家人们更新不易,你们的点赞和关注对我而言十分重要,友友们麻烦多多点赞+关注,你们的支持是我…...

算力百川汇蓝海,商海荡漾绘宏图
算力百川汇蓝海 01 新兴技术呼唤算力 崭新时代逐浪前,科技浪潮涌向天。 人工智能、数字孪生、元宇宙等新兴技术的迅速发展,引爆全球算力需求的规模式增长。尤其,以ChatGPT为代表的人工智能技术发展,引发了全球算力需求的进一步增长…...

ORACLE 内存结构之系统全局区(SGA)
每个 Oracle 数据库实例都会在内存中分配一个很大的内存结构, 称为系统全局区(System Global Area), 这是一个大型的共享内存结构,每个Oracle进程都会访问它。 在Linux/Unix操作系统上,SGA是一个物理实体,使用操作系统命令能“看到它”。 它被操作系…...

主要文档分享网站一览
136****0621的全部文档-第1页-原创力文档 目前能提供上传文档并付费的网站: 1、得利文库 www.deliwenku.com 先说我自已的吧!见笑了 2、百度文库 wenku.baidu.com 这个算头部了、有流量倾斜、但资源多、用户现在上传的大部份为重复的,…...

CPU访问一个虚拟地址的整体流程
一、虚拟地址转换成物理地址 涉及到的部件: MMU:虚拟地址—MMU—>物理地址。MMU会控制整个流程(查快表、查慢表等等)TLB快表:组号(若为组相联TLB)、TLB标记、有效位、页框号页表(…...

UE5 虚幻引擎 如何使用构造脚本(Construction Script)? 构造脚本的奥秘!
目录 1 构造脚本(Construction Script)1.1 介绍1.2 案例1:利用样条组件程序化生成树木1.2 案例2:利用样条组件和样条网格体组件程序化生成道路 1 构造脚本(Construction Script) 1.1 介绍 问题:…...

Mysql高级——数据库设计规范(2)
8. ER模型 ER 模型中有三个要素,分别是实体、属性和关系。 实体,可以看做是数据对象,往往对应于现实生活中的真实存在的个体。在 ER 模型中,用矩形来表示。实体分为两类,分别是强实体和弱实体。强实体是指不依赖于其…...

c++-string
文章目录 前言一、STL库介绍二、标准库中的string类1、string类介绍2、string类使用3.1 string类的构造函数3.2 string类对象的容量操作3.3 string类对象的遍历操作3.4 string类对象的访问操作3.5 string类对象的修改操作3.6 string类对象的字符串操作 三、模拟实现string类四、…...

KNN-K近邻算法(K-Nearest Neighbors)
k近邻算法的特点 思想极度简单应用数学知识少(近乎为零)效果好(缺点?)可以解释机器学习算法使用过程中的很多细节问题更完整的刻画机器学习应用的流程 k近邻算法 k近邻算法整体是这样的一个算法,我们已经知道的这些数据点其实是…...

ChatGPT:理解HTTP请求数据格式:JSON、x-www-form-urlencoded和form-data
ChatGPT:理解HTTP请求数据格式:JSON、x-www-form-urlencoded和form-data 使用postman发送一个post请求,在body里面加上了form-data数据,namexxx,age23,为什么输出request.body()得到的是这样的结果 -------…...

字符集、IO流(一)
字符集、IO流(一) 各位同学,前面我们已经学习了File类,通过File类的对象可以对文件进行操作,但是不能操作文件中的内容。要想操作文件中的内容,我们还得学习IO流。但是在正式学习IO流之前,我们还需要学习一个前置知识叫做字符集,只有我们把字符集搞明白了,再学习IO流…...

相乘(蓝桥杯)
相乘 本题为填空题,只需要算出结果后,在代码中使用输出语句将所填结果输出即可。 小蓝发现,他将 1 至 1000000007 之间的不同的数与 2021 相乘后再求除以 1000000007 的余数,会得到不同的数。 小蓝想知道,能不能在 1 …...

[AFCTF 2018]你能看出这是什么加密么
最开始是我对rsa的小小的理解 rsa也就是非对称加密算法,拥有公开的加密密钥和解密密钥,这也是我们写脚本的基础 选取素数p和q,计算乘积npq,以及(n)(p-1)(q-1)。(欧拉函数) 选择一个e值作为密钥…...

基于springboot+vue的重庆旅游网(前后端分离)
博主主页:猫头鹰源码 博主简介:Java领域优质创作者、CSDN博客专家、公司架构师、全网粉丝5万、专注Java技术领域和毕业设计项目实战 主要内容:毕业设计(Javaweb项目|小程序等)、简历模板、学习资料、面试题库、技术咨询 文末联系获取 项目介绍…...

pymysql执行delete删除操作
视频版教程 Python操作Mysql数据库之pymysql模块技术 执行delete操作,雷同前面的update操作 from pymysql import Connectioncon Nonetry:# 创建数据库连接con Connection(host"localhost", # 主机名port3306, # 端口user"root", # 账户…...

25862-2010 制冷与空调用同轴套管式换热器
声明 本文是学习GB-T 25862-2010 制冷与空调用同轴套管式换热器. 而整理的学习笔记,分享出来希望更多人受益,如果存在侵权请及时联系我们 1 范围 本标准规定了制冷与空调用同轴套管式换热器(以下简称"换热器")的术语和定义、基本参数、要 求、试验、检验规则、标…...

JetBrains 产品安装插件(plugins)的两种方式
安装分为在线、离线两种方式: 在线方式: File > Settings > Plugins 搜索插件 Install 即可 离线方式: 官网:https://plugins.jetbrains.com/ 搜索到插件后,点击 "Get",选择自己安装的…...

SOLIDWORKS二次开发
SOLIDWORKS是一套三维设计软件, 采用特征建模、变量化驱动可方便地实现三维建模、装配和生成工程图。SOLIDWORKS软件本身所具有的交互方式,可以使用户对已生成模型的尺寸、几何轮廓和相互约束关系随时进行修改, 而不需要编程。SOLIDWORKS软件本身的方程式可以实现简…...

Linux下压缩和解压缩
在Linux下,您可以使用多种命令来进行文件和目录的压缩和解压缩操作。以下是一些常见的压缩和解压缩命令: tar:tar命令可用于创建和提取tar压缩文件。例如,要创建一个名为archive.tar的.tar文件,可以使用以下命令&#…...

爬虫入门基础-HTTP协议过程
在进行网络爬虫开发之前,了解HTTP协议的基本过程是非常重要的。HTTP协议是Web通信的基础,也是爬取网页数据的核心。本文将为您详细介绍HTTP协议的过程,帮助您理解爬虫背后的网络通信机制。让我们一起来探索吧! 一、什么是HTTP协议…...

数据结构 第一章作业 绪论 西安石油大学
绪论第1章 1.简述下列概念:数据、数据元素、数据项、数据对象、数据结构、逻辑结构、存储结构、抽象数据类型。 答案: 数据:是客观事物的符号表示,指所有能输入到计算机中并被计算机程序处理的符号的总称。如数学计…...

HTML5福利篇--使用Canvas画图
目录 一.Canvas元素 1.Canvas元素定义 2.使用JavaScript获取页面中的Canvas对象 二.绘制图形 1.绘制直线 2.绘制矩形 (1)rect() (2)strokeRect() (3)fillRect()和clearRect()函数 3.绘制圆弧 4.…...

基于Matlab实现图像目标边界描述
图像目标边界描述是图像处理中的一个重要问题。边界描述可以用于目标检测和识别、图像分割等应用。Matlab提供了强大的图像处理工具箱,可以方便地实现图像目标边界描述。本文介绍一种基于边缘检测的图像目标边界描述方法,并提供一个简单的案例源码。 文章…...

汽车电子——产品标准规范汇总和梳理(自动驾驶)
文章目录 前言 一、分级 二、定位 三、地图 四、座舱 五、远程 六、信息数据 七、场景 八、智慧城市 九、方法论 总结 前言 见《汽车电子——产品标准规范汇总和梳理》 一、分级 《GB/T 40429-2021 汽车驾驶自动化分级》 《QC/T XXXXX—XXXX 智能网联汽车 自动驾…...

redis部署与管理
目录 一、关系数据库与非关系型数据库: 1. 关系型数据库: 2.非关系型数据库: 二、关系型数据库和非关系型数据库区别: (1)数据存储方式不同: (2)扩展方式不同…...