【木棉花】知识分享——Page Ability的详解(上) 原创 精华

木棉花_小蓝
发布于 2022-1-27 15:27
浏览
3收藏

春节不停更,此文正在参加「星光计划-春节更帖活动」

前言

    在鸿蒙开发实践中,UI界面的布局和设计主要与Page Ability的应用挂钩。要成为一名合格的鸿蒙应用开发者,掌握Page Ability的相关理论知识是必不可少的。在本栏目的知识分享中,小蓝围绕Page Ability总结了许多知识干货,希望能为读者带来一定的收获与启发。

【木棉花】知识分享——Page Ability的详解(上)-鸿蒙开发者社区

正文

     我们知道,Ability是应用所具备能力的抽象,它作为一种核心元素参与鸿蒙应用的业务开发。其中,Feature Ability的模板所支持的Page Ability主要用于提供与用户交互的能力,所以,页面布局与可视化元素的设计的任务主要由Page Ability来承担。接下来笔者将围绕Page Ability这一对象展开相关知识阐述。

     Page Ability所应用的模板是Page模板(以下简称Page),这个模板提供了与用户交互的能力。一个Page通常由多个AbilitySlice组成,通俗地讲,如果Page是一只大蛋糕,那么AbilitySlice便是一份份被切下来的蛋糕块。而AbilitySlice的概念是:应用的单个页面及其控制逻辑的总和。在某种意义上,AbilitySlicePage Ability的一个最基本的单元。

【木棉花】知识分享——Page Ability的详解(上)-鸿蒙开发者社区

     值得一提的是,如果一个Page由多个AbilitySlice构成,那么这些AbilitySlice提供的业务能力一般具有高度的相关性。举一个例子:一个购物软件的商品浏览功能可以由同一个Page实现,而这个Page由AbilitySlice1和AbilitySlice2组成,其中,AbilitySlice1用于展示商品列表,AbiliySlice2用于展示商品的信息和参数详情。点击AbilitySlice1中的某个可视化按钮,用户便能实现从AbilitySlice1跳转至AbilitySlice2。

【木棉花】知识分享——Page Ability的详解(上)-鸿蒙开发者社区

    Page Ability有具体的应用场景。我们在现实中不难发现,在移动场景下,应用之间的交互是很频繁的。比如,一款不带拍摄功能的应用,如果要在应用内实现拍摄的业务,那么它就需要调用相机应用并让页面跳转至相机的界面,而这便实现了应用之间的简单交互。显然,应用之间之所以需要频繁交互,是因为一个应用通常专注于某方面的服务能力的开发,如果它需要其他辅助功能,它则选择调用其他应用已具备的能力,以补齐自己的技术短板。与此类似,HarmonyOS能支持不同Page之间的跳转(即从一个应用导航至另一个应用),并可以指定跳转到目标Page中某个具体的AbilitySlice(即跳转至一个具体的页面)。

    在程序开发过程中,开发者对AbilitySlice进行路由配置。虽然一个Page可以包含多个AbilitySlice,但Page进入前台时默认只显示一个AbilitySlice。这是显而易见的,毕竟目前大多数智能手机只支持单屏显示。在DevEco Studio的工程目录中,打开一个Page时默认展示的AbilitySlice是通过setMainRoute()方法来指定的。如果想更改默认显示的AbilitySlice,我们则可以通过addActionRoute()方法来配置另一条路由规则。如果其他Page实例期望导航到这个Page的默认AbilitySlice,我们可以通过在Intent中指定Action来实现。

    接下来我将展开介绍一个非常有意思的概念——生命周期

    这里定义的生命周期有两种,一种是Page的生命周期,另一种是AbilitySlice的生命周期。说起”生命周期“这个词汇,可能许多鸿蒙开发的初学者都无法理解它与PageAbilitySlice的关联。毕竟,“生命周期”这个概念比较抽象,在大多数人的认知里,它一般不与编程的知识放在一块而被提起。不过合理地想想,一个页面集合确实也是可以有它自己的生命周期的:当我们点开一个应用时,页面被创建,于是页面“出生了”;当我们点开其他应用时,原应用的页面进入后台并不被我们所见,于是页面进入“休眠”,但不算正真意义上的消失;当我们通过系统管理工具关闭一个应用的进程时,应用停止运转,页面也随之完全被销毁,于是页面“死亡”。如果把这种规律合理总结起来,我们便可以尝试理解生命周期的含义。

     这里以Page的生命周期为例展开讨论。先介绍关于Page的状态的概念:一个被生成的Page Ability的page有四种状态,分别是Initial态(初始态),Inactive态(不活动态),Active态(活动态),Background态(后台态)有了这些概念,Page的生命周期的含义便可以理解为:从Page被生成起,Page的四个状态在时间上变化的过程(听起来可能仍然会抽象,不过我们只需要理解大概含义即可)。在一个生命周期中,外界会对应用施加一些影响(比如系统管理和用户操作),Page则会通过生命周期回调进行有规律的状态切换。生命周期回调,顾名思义,是Ability类提供的一种回调机制,它能让Page及时感知外界变化,从而通过对应的回调函数做出正确的状态切换和相关操作,为应用的性能和稳定提供保障。

  【木棉花】知识分享——Page Ability的详解(上)-鸿蒙开发者社区
     生命周期的回调主要依靠回调函数回调函数共有有六种,分别是onStop(),onStart(),onActive(),onInactive(),onBackground(),onForeground()

     接下来我们将尝试把Page的状态回调函数通过具体案例串联起来,以理解Page Ability的工作原理。

     前文提到,一个存在的Page Ability的Page四种状态,分别是Initial(初始态),Inactive(不活动态),Active(活动态),Background(后台态)。我先对这四个状态所蕴含的意义进行解释。当Page处于Initial态时,Page是刚刚被生成的,并还处在后台的队列中等待调度,显然,此时的Page正在初始化;Page的Inactive态一种临时态,它起到一种过渡作用,而它的规律也特别有意思(后文会具体阐述);Page的Active态是最重要的状态,在此状态下的Page Ability处于前台,可以实现与用户的交互;当Page处于Background态时,此Page已经进入后台,用户对其不可见,故也无法与其进行交互。

    在一个生命周期中,Page会感知外部的变化,同时利用生命周期回调实现状态的切换。举个例子,我们点击桌面上一款购物应用的快捷方式图标,购物应用的相应的Page便开始生成,进入Initial态, 此时,该Page的默认AbilitySlice便被构造出来与用户交互,比如购物应用被打开后会出现一个附带了广告信息的页面,这个页面即由默认的AbilitySlice所承载。当Page被操作系统构造出来时,即应用进入初始态时,应用会触发onStart()回调,使得Page从Initial态切换成Inactive态,并加载相关可视化元素和缓存。需要特别留意的是,onStart()回调在单个Page的生命周期中只会被触发一次,而不会被触发第二次或更多次。通常情况下,Page是不会停留在Inactive态的,因为Inactive态只是个临时状态,在过了一小段时间后,它无需任何调度便可以直接切换成Active态。不过还是有特殊情况的,比如点击购物应用的快捷方式图标,应用页面正在加载,此时手机突然接到来电,那么这个购物应用的Page因为失去焦点而无法正常进入前台,它的状态也会始终停滞在Inactive态当电话接听结束后,购物应用的Page可通过onActive()回调从Inactive态切换成Active态此时购物应用的界面会进入前台,应用程序保持正常的运行。

    当购物应用中的浏览商品的Page处于Active态时,如果用户想要购买所选择的商品,用户则通过点击页面上的可视化按键启动另一个用于支付的Page,使手机屏幕跳转至对应支付页面。在这两个Page之间的跳转过程中,用于支付的Page被构造出来,开始它独立的生命周期,而原来浏览商品的Page由于失去了焦点,会通过onInactive()回调进入Inactive态,为用于支付的Page腾出前台空间。值得一提的是,处在Inactive态商品浏览的Page并未完全进入后台,假如用户在支付的过程突然改变购买的决定,退出了支付页面,那么应用可通过调用onActive()回调使商品浏览的PageInactive态重新切换至Active态于是购物应用便可以回到商品浏览的界面。

    那什么时候购物应用的Page会完全进入后台呢?当Page对用户完全不可见时,比如用户在浏览完购物应用后点击了手机的home键让应用离开前台,此时应用会触发onBackground()回调使PageInactive态切换成Background态[如果该Page处于Active态, 则应用会先触发onInactive()回调,而后再触发onBackground()回调],于是应用完全进入后台,并通知用户释放多余资源。如果此时用户再次打开购物应用,程序则会触发onForeground()回调,使该PageBackground态重新转变为Inactive态(而后又会进入Active态于是应用进入前台继续保持对用户的服务。

   当用户的交互操作使得购物应用的Page被销毁或应用进程结束时(比如通过任务管理器结束购物应用的进程),应用便会触发onStop()回调,通知用户释放系统资源。此时,Page的生命周期完全结束。

   读者可以将文字叙述与所给的思维导图相结合,这样能更清晰地理解文章的内容。

   以下给出每种回调函数的详解:

   onStart()当系统首次创建Page实例时会触发,随后PageInitial态切换为Inactive态。需要强调的是,该回调函数对同一个Page实例只会触发一次。通常情况下,开发者需要重写该方法,并在这里配置默认展示的AbilitySlice

  onActive()Page由于用户交互或系统操作而失去焦点进入Inactive时,如果Page期望再次回到Active态,系统将调用此回调使PageInactive态转变成Active态

  onInactive()当处于Active态Page失去焦点时,系统将调用用此回调函数使PageActive态转变成Inactive态开发者可以在该方法中实现Page在失去焦点时应表现的恰当行为(如释放多余资源)。

  onBackground()如果Page对用户完全不可见,系统则会激发此回调使Page进入Background态并在系统栏目中通知用户释放多余资源。开发者应在该方法中实现应用释放Page不可见时无用的资源,或者让应用执行较为耗时的状态保存操作。

  onForeground()当处于Background态Page由于用户交互或系统操作重新回到前台时,系统将调用此回调,使Page重新进入Inactive态

  onStop () :当系统将要销毁Page(比如用户通过任务管理器关闭应用的进程)时,此回调函数会被触发,通知用户进行系统资源的释放。

 

【木棉花】知识分享——Page Ability的详解(上)-鸿蒙开发者社区 

结语

  小蓝本期的分享就到此为止了qaq,更多精彩内容详见下期!鉴于笔者能力有限,文章如有错误和不足之处,恳请广大读者不吝赐教。另外,码字不易,希望大家能多多支持小蓝哦~

【木棉花】知识分享——Page Ability的详解(上)-鸿蒙开发者社区更多资料请关注我们的项目 : Awesome-Harmony_木棉花

©著作权归作者所有,如需转载,请注明出处,否则将追究法律责任
分类
已于2022-1-27 15:27:50修改
5
收藏 3
回复
举报
1条回复
按时间正序
/
按时间倒序
红叶亦知秋
红叶亦知秋

这标注也太用心了

回复
2022-1-28 09:51:32
回复
    相关推荐