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

发布于 2022-1-30 10:56
浏览
1收藏

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

前言

     在上期的分享中,我们着重阐述了Page的生命周期。本期,小蓝将围绕AbilitySlice展开相关探讨,了解其作为UI能力基本单元所具备的特点与功能。

【木棉花】知识分享——Page Ability的详解(下)-开源基础软件社区

正文

     作为Page的基本组成单元,AbilitySlice也有其生命周期。实际上,AbilitySlice的生命周期与Page的生命周期很相像,因为AbilitySlicePage有相同的生命周期状态(Initial态,Inactive态,Active态,Background态)和同名的生命周期回调函数[onStart(),onActive(),onInactive(),onBackground(),onForeground(),onStop()]。不过,AbilitySlice的生命周期变化是要比Page的生命周期变化更加精密一些的,毕竟AbilitySlice的粒度要更小,这可以体现在:Page发生生命周期变化时,其中肯定有AbilitySlice的生命周期也跟着发生了变化;AbilitySlice发生生命周期变化时,其所属的Page不一定会发生生命周期变化。比如,当一个应用的Page由于用户操作而进入后台时,此Page进入Background态,而它已经生成的AbilitySlice实例也随之进入后台并切换为Background态;当用户在使用新闻软件时,用户从新闻浏览的AbilitySlice导航至了新闻信息详情的AbilitySlice,此时新闻信息详情的AbilitySlice进入前台与用户交互,处于Active态,而新闻浏览的AbilitySlice则会切换至Inactive态,然而,这两个AbilitySlice同属的Page始终处于Active态

    由于AbilitySlicePage有同名的生命周期回调函数,所以在DevEco Studio中,AbilitySlice可编写的回调函数也是onStart(),onActive(),onInactive(),onBackground(),onForeground()和onStop()这六个。由于AbilitySlice承载了具体的页面,故开发者必须重写AbilitySlice中的onStart()回调,并在此方法中通过setUIContent()的方法实现页面布局与设计。需要注意的是,AbilitySlice实例的创建和管理通常是由应用自己负责的,系统仅在特定情况下会创建AbilitySlice实例(比如用户在点开应用快捷方式图标时,为了实现应用与用户最开始的交互,系统会创建Page Ability中的默认AbilitySlice实例)。在同一个Page中,从一个AbilitySlice导航至另一个AbilitySlice时,目标AbilitySlice是由应用负责实例化的。

    接下来我将具体讨论一下Page的生命周期与AbilitySlice的生命周期之间的关联。第一种情况,当一个AbilitySlice处于前台且具有焦点时,其生命周期状态会随着其所处的Page的生命周期状态的改变而改变,比如:所属的Page进入后台,这个AbilitySlice也会随之进入后台并切换为Background态;当所属Page被销毁时,这个AbilitySlice也随之被联动清除。第二种情况,当一个Page拥有多个AbilitySlice时,不妨假设有两个,分别是AbilitySlice1AbilitySlice2,当AbilitySlice1处于前台且获得焦点,并导航至AbilitySlice2,这个过程中发生的生命周期变化有:AbilitySlice1通过onInactive()回调Active态转变为InActive态,再通过onBackground()回调Inactive态变为Background态AbilitySlice2则被新创建,先通过onStart()回调从Initial态切换为Inactive态,再自动转变为Active态。在第二种情况中,AbilitySlice1AbilitySlice2所属的Page始终处于Active态若此Page被系统销毁,那么它包含的两个AbilitySlice(不管AbilitySlice处在什么状态)都会被联动销毁。

【木棉花】知识分享——Page Ability的详解(下)-开源基础软件社区

    那么,开发者需要如何实现两个AbilitySlice之间的导航呢?

    对于同一个Page中的两个AbilitySlice,如果想从一个AbilitySlice导航至另一个AbilitySlice,开发者一般用present()方法实现,并用可视化元素(如按钮)让用户可以激发此函数,达到页面导航的目的。另外,页面之间数据传递是应用中一个很常见的操作,如果开发者希望在用户从目标AbilitySlice返回至原AbilitySlice时,能够获得其返回结果一类数据),则开发者应该用presentForResult()方法[增强版的present()函数]来实现导航。用户从目标AbilitySlice返回时,系统将回调原AbilitySlice中的onResult()来接收和处理返回结果,开发者需要重写此方法。返回结果由目标AbilitySlice在其生命周期内通过setResult()进行设置。

     如果想深入理解同一个Page中的两个AbilitySlice之间的跳转过程,我们则需要了解一个概念——AbilitySlice实例栈。事实上,鸿蒙系统为每个Page都维护了一个用于管理AbilitySlice的堆栈(同样地,鸿蒙系统也为每个应用维护了一个管理Page的堆栈,本文不展开讨论),这个堆栈即AbilitySlice实例栈。在同一个Page中,凡是被创建出来的AbilitySlice都会被压入堆栈。AbilitySlice实例栈的功能是——能使同一个Page中的AbilitySlice之间的跳转变得井然有序。如下图所示,如果用户从AbilitySlice1导航至AbilitySlice2,那么AbilitySlice2将被应用新创建出来并压入堆栈中,此时,处在堆栈顶部的AbilitySlice2能与用户进行交互,而处于堆栈底部的AbilitySlice1则因失去焦点保留在后台。如果用户从AbilitySlice2返回至AbilitySlice1,那么AbilitySlice2将会弹出堆栈并被销毁,其生命周期也随之结束,而AbilitySlice1则会浮上栈顶,切换至前台与用户进行交互。当一个Page含有更多AbilitySlice时,它包含的所有AbilitySlice也同样满足这样的秩序。毋庸置疑,AbilitySlice实例栈能让同一个PageAbilitySlice之间的导航变得有条不紊。

【木棉花】知识分享——Page Ability的详解(下)-开源基础软件社区

    不同Page的AbilitySlice之间的导航则不能依赖AbilitySlice实例栈。由于两个AbilitySlice所属的Page不同,故AbilitySlice之间的导航无法通过present()presentForResult()来实现。不过,AbilitySlice作为Page的组成单元,它以Action的形式对外暴露,因此开发者可以通过配置IntentAction来导航至目标的AbilitySlice。现阶段,Page之间的导航可以利用startAbility()startAbilityForResult()来实现,而获得返回结果的回调则可以用onAbilityResult()。如果需要设置返回结果,则需要在对应的Ability中调用setResult()

结语

小蓝本期的知识分享到这里就结束了qaq。鉴于笔者能力有限,文章如有错误和不足之处,恳请广大读者不吝赐教。本期也是小蓝在农历年的最后一更了,在这里祝大家新年快乐,万事如意

【木棉花】知识分享——Page Ability的详解(下)-开源基础软件社区

 

 

 

   更多资料请关注我们的项目 : Awesome-Harmony_木棉花

©著作权归作者所有,如需转载,请注明出处,否则将追究法律责任
已于2022-1-30 10:56:29修改
1
收藏 1
回复
举报
回复
添加资源
添加资源将有机会获得更多曝光,你也可以直接关联已上传资源 去关联
    相关推荐