请选择 进入手机版 | 继续访问电脑版

Harmony系列之 初探Ability

[复制链接]
钟启航 发表于 2021-1-2 17:52:37 | 显示全部楼层 |阅读模式 打印 上一主题 下一主题
  欲开发鸿蒙应用,须先搞懂 Ability。
Ability是什么

官方界说Ability 是应用所具备本领的抽象,也是应用步调的重要组成部分
它是可见的,承载一个业务可视化界面;亦可为隐藏的,在背后岑寂为你干脏活;又能在多应用间架起数据访问的桥梁,方便数据沟通。
鸿蒙应用是以 Ability 为单元举行摆设,开发者通过继承 Ability 类来实现应用所需本领。
  如果从安卓 API 本领角度上看,鸿蒙OS的 Ability 提供的本领席卷了 Activity、Service、ContentProvider。
Ability 根据是否可交互分别为 FeatureParticle两种范例。
差异范例会根据其支持模板可再细分:

  • Feature 现在仅支持Page模板,用于提供与用户交互的本领,包罗写视图组件等。
  • Particle 支持Service模板Data模板,前者用于提供背景运行任务的本领,后者对外提供数据访问的本领。
怎么使用 Ability

只能直接继承来实现差异模板本领,而差异模板实现的子类需要主动选择覆盖对应方法。
比如可视化的 Page 模板关注的是页面生命周期变革,所以重载的方法主要是生命周期变革的回调方法。
而 Service 模板更关注的是服务的毗连与断开,重载的方法则与 Page 模板不一样。
  说实话这样的设计并欠好,针对模板分类封装 Ability 显然更友好。
我们以可视化 Page 模板作为例子展开。
编写一个闪屏页面
  1. public class SplashScreenAbility extends Ability {    @Override    public void onStart(Intent intent) {        super.onStart(intent);        //视图片,背面会有讲到        super.setMainRoute(SplashScreenAbilitySlice.class.getName());    }}
复制代码
可以看到我们重载的 onStart 方法。
onStart只是系统首次创建 Page 时的回调,对于页面的生命周期的状态转化及对应回调可见下图。

下面针对核心方法做简单论述:


  • onStart,当系统首次创建 Page 实例时触发该回调。对于一个 Page 实例,该回调在其生命周期过程中仅触发一次, 以后进入 INACTIVE 状态。开发者必须重写该方法,并在此设置默认展示的 AbilitySlice
  • onActive,Page 会在进入 INACTIVE 状态厥后到前台,然后系统调用此回调。在此之后进入 ACTIVE 状态,该状态是应用与用户交互的状态。
  • onInactive,Page 失去核心时系统将调用此回调,以后 Page 进入 INACTIVE 状态。
  • onBackground,如果 Page 不再对用户可见,系统将调用此回调通知开发者用户举行相应的资源释放,以后 Page 进入 BACKGROUND 状态。
  • onForeground,处于 BACKGROUND 状态的 Page 仍然驻留在内存中,当重新回到前台时(比如用户重新导航到此 Page ),系统将先调用 onForeground() 回调通知开发者,而后 Page 的生命周期状态回到 INACTIVE 状态。开发者应当在此回调中重新申请在 onBackground() 中释放的资源,最后 Page 的生命周期状态进一步回到 ACTIVE 状态,系统将通过 onActive() 回调通知开发者用户。
  • onStop,系统将要销毁 Page 时,将会触发此回调函数,通知用户举行系统资源的释放。
对比安卓 Activity 生命周期回调(左鸿蒙右安卓)
  1. onStart() --> onCreate()onActive() --> onResume()onInactive() --> onPause()onBackground() --> onStop()onForeground() --> onRestart()onStop() --> onDestroy()
复制代码
生命周期变革规律的回调看起来确实很像 Activity场景,但在视图编写流程上却有些差异。
例子代码中出现的 SplashScreenAbilitySlice 实际上才是真正承载视图逻辑的类。
其继承的是 AbilitySlice 类,通过 supe#setMainRoute 的方法来导航到真正视图界面。
那么 AbilitySlice 是什么呢?
官方界说为AbilitySlice 作为 Page 的组成单元,其生命周期是依托于其所属 Page 生命周期
AbilitySlice 和 Page 具有相同的生命周期状态和同名的回调,当 Page 生命周期发生变革时,它的 AbilitySlice 也会发生相同的生命周期变革。
  1. |---AbilityContext |   |---Ability        |   |---AbilitySlice   //Page组成元素
复制代码
都继承自 AbilityContext,实现的方法大抵相同。
只是 AbilitySlice 比 Page 多了一些生命周期变革,这些变革发生在同一 Page 中的多个 AbilitySlice 之间导航时,但此时 Page 的生命周期状态并不会改变。
  AbilitySlice 跟 Fragment 有点像,只是 Page 必须通过设置 AbilitySlice 展示页面视图。
以下是 SplashScreenAbilitySlice 简单素现。
  1. public class SplashScreenAbilitySlice extends AbilitySlice {    @Override    public void onStart(Intent intent) {        super.onStart(intent);        super.setUIContent(ResourceTable.Layout_splash_screen_layout);    }}
复制代码
上述代码通过调用 setUIContent 设置结构。
Demo 实现一个完整的闪屏逻辑,效果如下,感兴趣可到 Github 查察实现。

对于 Service 模板及 Data 模板,则直接覆盖对应方法即可,这部分暂不外多形貌,细节可到 HarmonyOS Developer 开发文档 中查阅。
既然 Ability 分别多种模板,那么应用如何区分这些模板呢?
区分 Ability 模板

在《Harmony系列之 工程结构与应用设置的明白》一文中我们有讲过在每个模块都会有一个 config.json 设置文件
而这个文件的 module 节点中需要申明应用所需要用到的 Ability。
  1. "abilities": [  {    "orientation": "portrait",    "name": "com.effective.harmony.study.ability.page.SplashScreenAbility",    "type": "page",  },  {    "name": "com.effective.harmony.study.ability.service.ServiceAbility",    "type": "service",  }]
复制代码
如上图,申明白 SplashScreenAbility 为 Page模板,ServiceAbility 为 Service模板。
  这一点和安卓应用中 AndroidManifest.xml 需要申明四大组件逻辑是一致的。
虽然现在官方 SDK 源码并没有开源,但在 Framework 层应该是对应范例举行分类,并在各自模板场景下做方法映射调用。
初探Ability至此,但我更好奇的是 Framework 层的实现。
遗憾的是,现在 SDK 现在还没有开源,API 也没有注释呐。

来源:https://blog.csdn.net/u010794180/article/details/112002772
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则


专注素材教程免费分享
全国免费热线电话

18768367769

周一至周日9:00-23:00

反馈建议

27428564@qq.com 在线QQ咨询

扫描二维码关注我们

Powered by Discuz! X3.4© 2001-2013 Comsenz Inc.( 蜀ICP备2021001884号-1 )