刚刚过去的2020年底,华为发布了HarmonyOS 2.0手机应用开发者Beta版。对外界,HarmonyOS提出了为万物互联而生,让体验天生跨端,并且开发跨端应用就像单端一样简单。其中,“分布式应用框架”是了解HarmonyOS服务跨端开发最基础的概念之一。
对于传统生态——典型如Android,要实现APP在不同设备间的互通,开发者要做的工作很多:是从底层到上层,从通信、数据管理、文件服务到UI的各部分适配和修改。而HarmonyOS将UI以下的基础服务做了封装,开发者也因此轻松了不少。
HarmonyOS在理念上,就是让原本孤立的设备,通过“分布式软总线”串联起来,并藉由“分布式数据管理”“分布式任务调度”等能力,将所有设备抽象为一个整体,构成虚拟的“超级终端”。数据在超级终端内自由流转,用户不需要在意文件或数据究竟在手机、PC还是大屏电视或其他硬件上。各种任务负载,也能由最适合的物理硬件去完成,甚至协同完成。
简单地说,是用一个HarmonyOS系统来解决IoT所有的问题。与此同时,还能降低跨端开发的难度。HarmonyOS本身隐藏了更多分布式技术的实现细节,包括分布式软总线、分布式数据管理等技术,都在系统服务层面做了抽象封装。最终,面向APP开发者的分布式应用框架引入了Ability,Ability就成为理解多端开发的关键。
据华为消费者业务软件部总裁王成录博士介绍:“Ability相当于鸿蒙应用里建筑材料的最小单元,可以单独运行在设备上,又可以根据能力的不同,在不同的设备上运行——这个能力,使我们能够做到一次业务代码的书写,就让应用跑在不同设备上的重要基础。”
究竟什么是Ability?
针对不同设备场景的应用开发,HarmonyOS在面向APP开发者时的应用框架层,包括UI编程框架、用户程序框架、Ability框架,都用于解决包括不同设备的形态差异、能力差异等问题。这三个框架所在的位置如下图所示:
本文着重谈的是其中的Ability框架。从HarmonyOS的开发者文档来看,Ability是应用所具备能力的抽象。一个应用可以包含多个Ability,且HarmonyOS支持应用以Ability为单位进行部署。Ability也是应用跨端部署的“最小迁移单元”,它可彼此间联合或单独部署。
Ability可分为FA(Feature Ability)和PA(Particle Ability)两种类型。不同类型为开发者提供不同的模板,实现不同的业务功能。不同的FA/PA,完成单一功能用户程序,基于这样的用户程序可在多设备间调度、流转、可分可合。
FA和PA是由系统统一调度的,可以被第三方程序调用集成。Ability的这种存在方式,就HarmonyOS生态构建来看,实现了功能结构的规范化与调用能力的傻瓜化。从这点来看,华为对于Ability的全局规划,可能还有更长远的生态构建目标。
也因此,Ability作为系统统一调度的单位,能够实现无需安装就使用,且自动更新;而应用开发的跨设备,则体现在,Ability本身是跨设备流转的,能够在不同的设备间接续,以及让不同设备协同提供服务,也就是分布式技术的基础。
FA(Feature Ability)的生命周期与逻辑
接下来就来看看FA和PA这两种Ability更具体的内容。FA(Feature Ability)支持Page Ability,而PA(元服务)则有Service Ability和Data Ability两种。在config.json注册文件中注册Ability时,可通过配置Ability元素中的“type”属性来指定Ability模板类型。(类似Activity在AndroidManifest.xml中注册)
首先聊聊FA(Feature Ability):FA当前主要就是Page Ability,提供与用户交互的能力。一个Page可由一个或多个AbilitySlice构成;AbilitySlice则是指应用的单个页面及其控制逻辑的总和。这比较类似于Android的Activity及其Fragment组件。
实际上,HarmonyOS中的每个页面都可以用一个FA来表示。任何一个子页面都可以用AbilitySlice来表示。尝试在DevEco Studio创建一个HarmonyOS项目,自动生成的项目会包含一个MainAbility和一个MainAbilitySlice。
MainAbility作用为设置路由,子页面MainAbilitySlice才真正负责页面中有哪些组件,每个组件的UI等。AbilitySlice常见使用场景比如页面有多种布局,需对页面进行动态布局,每种布局对应一个AbilitySlice;页面有多个tab,则每个tab对应一个AbilitySlice。比如新闻类APP,可能需要展示新闻列表的一个AbilitySlice,还需要一个展示新闻详情的AbilitySlice。
上面这张图是Page Ability的生命周期,其中的生命周期回调有onStart()、onActive()、onInactive()、onBackground()、onForeground()、onStop()。它与Activity对应的某些调用看起来类似,虽然可能并非一一对应的关系。
比如说onStart()在创建Page实例时触发,且对该实例在其生命周期内仅触发一次;Page在调用onStart()后进入INACTIVE状态。这对应到Android开发Activity的onCreat()以及onStart()。交互、失去焦点、不对用户可见、重回前台、销毁等状态,分别对应了不同的回调。这里不再详述这几种不同回调及对应状态的具体细节,开发者可以查看HarmonyOS开发者文档来具体了解。
相应的,AbilitySlice与其所属Page,有着相同的生命周期状态和同名回调。不过在同一Page中的AbilitySlice之间发生切换时,AbilitySlice本身表现为独立于Page的生命周期变化,而Page自身的生命周期状态不变。
在DevEco Studio建立的MainAbility中也能看到,页面启动自动调用onStart(),方法体中再调用setMainRoute(),路由到MainAbilitySlice。在MainAbilitySlice中,除了子页面启动时,同样自动调用onStart(),内部方法体中的setUIContent()是用于设置子页面UI内容的。UI内容则通过布局文件ability_main.xml来指定。
值得一提的是,Page是可以在同一用户的不同设备间迁移的,最终做到分布式技术中跨端设备无缝切换的特性。这一点还将在下文详述。
PA(Particle Ability)又是怎么回事?
说完FA,接下来就是PA了。PA有两个能力,即Service Ability和Data Ability,也就是服务、数据。Service Ability提供后台运行任务的能力(如音乐播放等);Data Ability用于对外部提供统一的数据访问抽象。这两者是不提供UI的。
Service Ability可由其他应用或Ability启动,即使用户切换到其他应用,Service Ability仍将在后台继续运行。整体上和Android的Service有些类似。其生命周期具体如下:
形如前文提到的Page Ability,这里不再赘述。值得一提的是,在创建一个Empty Service Ability时,更早版本的DevEco Studio向导配置会出现“visible”复选框。这个选项用于开发者选择,该创建的Service是否对其他应用程序可见。最新版本似乎已经去掉了这一选项,不过visible属性仍可以在config.json注册文件中自行添加,默认为false,如下图:
用startAbility()方法可启动另外一个Ability。另外开发者可也以通过将Intent传递给该方法来启动Service(Intent是对象间传递信息的载体,包括这里的一个Ability启动另一个Ability,或者前文Page Ability部分提到的AbilitySlice导航到另一个AbilitySlice,Intent指定启动目标并携带相关数据)。不仅是启动本地Service,也支持启动远程Service。
设置目标Service信息,通过DeviceId(设备Id)、BundleName(包名称)以及AbilityName(待启动的Ability名称)的Operation对象进行。远程Service的启动,就要求前面提到的visible属性为true。启动远程Service代码示例:
除此之外,如果Service要与其他Service Ability,或者Page Ability交互,需要创建用于连接的Connection,通过connectAbility()就能连接了。具体内容可参加HarmonyOS的开发者文档。
最后再来谈谈Data Ability。这个能力用来进行应用管理自身,以及其他应用存储数据的访问,并且提供和其他应用共享数据的方法。具体来说,Data既能用于同设备不同应用的数据共享,也支持跨设备不同应用的数据共享。看起来这应该就是HarmonyOS分布式数据管理的重要组成部分了。
具体的数据可以是数据库也可以是储存的文件。Data提供对数据的增、删、改、查、打开文件等接口。这些数据的标识是通过URI地址进行的,格式如下:
创建Data Ability时,和Service一样也有visible属性可设置,用于明确是否允许其他应用访问该Data。从注册文件config.json中自动生成的代码里可以看到提供给外部访问的URI,以及访问该Data Ability时需要申请的访问权限——这个权限应该是可以自定义的:
文件存储和数据库存储的过程和方法,这里不再多做介绍。而除了Data的创建,在Data的访问上,通过DataAbilityHelper类即可访问共享数据,可以是当前应用的,也可以是其他应用提供的。其中针对数据库的Data创建和访问,涉及到一系列的方法,具体的操作参见HarmonyOS开发者文档,基本也是一看就明白的。
Ability怎么做跨端开发?
上面这些内容基本就把Ability的基本逻辑梳理清楚了,对逻辑有个大致概念后,具体开发就比较简单的。不过更多人关心的,应该是用Ability如何做分布式跨端开发。
前文有关FA、PA的介绍中,多多少少也都谈到了远程或者跨端Ability切换或访问。以Page Ability为例,前文就提到了跨设备迁移的问题,即将Page在同一用户的不同设备间迁移。
王成录博士在谈京东直播购物跨端功能开发时,提到的实际上就是Page的迁移。当时王成录博士说:“基于编程框架,一个人一天就能做这样一个很好的应用体验。对开发者而言,四条语句,调几个函数,就能完成这样的功能了。”
上面这张PPT包含的几个步骤主要是,从设备A上的Page请求迁移;HarmonyOS处理迁移任务,并回调设备A上Page的保存数据方法,用于保存迁移必须的数据;最终HarmonyOS在设备B上启动同一个Page,并回调其恢复数据方法。
这种形式的迁移,本质上属于HarmonyOS中的“分布式任务调度平台”。这个平台可对多设备构成的超级终端提供统一的组件管理能力,为应用定义统一的能力基线、接口形式、数据结构、服务描述语言,以屏蔽应差异;支持远程启动、远程调用、业务无缝迁移等分布式任务。
这套操作实现的,就是Ability跨设备的启动/关闭、连接/断开连接,以及迁移能力。不仅是Page,各种Ability的跨设备操作还另外有其设定。总结分布式开发的本质,对开发者而言也就是Ability自由调度、流转、可分可合的逻辑。
在HarmonyOS 2.0手机应用开发者Beta发布活动上,华为还以畅连通话功能为例,提到了FA/PA设计案例。这项功能按特性总共拆分为5个FA、6个PA。PA的拆分原则为可复用/替换,基于设备间能力存在差异的考虑,以及可以跨设备调用。
经过上面的分析,这张列出FA与PA设计的架构图应该就相当易于理解了。而Ability的存在,一方面显得直观,另一方面我们认为其核心还是在于针对分布式、跨端开发的简单和友好:跨端开发过程,就和本地开发差不多,而且不需要涉及到往下(包括通讯)的层级。所以Ability才是HarmonyOS分布式技术存在的基础,而华为在Ability的具体实现上应该是投入了海量精力的。
本文从HarmonyOS整体框架切入,对HarmonyOS中的“Ability”定义及工作原理进行了诠释,旨在帮忙广大开发者们进一步理解HarmonyOS核心特性的原理所在,可以说Ability是HarmonyOS入口多样性以及生态开放性的基因所在,笔者相信自带这样基因的HarmonyOS在万物互联的时代,定会为应开发者们带来更为广阔的跨端交互创新空间。也正是这一系列分布式技术,为应用带来了更多入口、更好体验。
责编:Yvonne Geng