鸿蒙应用程序Ability(能力)看这一篇就够

系统
文章由鸿蒙社区产出,想要了解更多内容请前往:51CTO和华为官方战略合作共建的鸿蒙技术社区https://harmonyos.51cto.com

[[387000]]

想了解更多内容,请访问:

51CTO和华为官方合作共建的鸿蒙技术社区

https://harmonyos.51cto.com

本节概述

  • 什么是Ability
  • Ability分类
  • Ability生命周期
  • Ability之间跳转

什么是Ability

Ability意为能力,是HarmonyOS应用程序提供的抽象功能。在Android应用程序中,Activity是整个应用程序的核心,其意为活动。无论是活动还是能力都是一种表述形式,虽然直译后理解起来比较抽象,但如果我们把它们理解为功能,这样就比较方便了。

就目前单一设备而言,我们可以使用手机打电话,发短信,玩游戏等,这些就是手机具有能力。在生活中,能力的体现无处不在,比如电饭煲具有蒸煮煲汤的能力;电视具有播放视频的能力;音响具有外放音乐的能力。

但HarmonyOS分布式系统所要实现的不仅仅是单一的能力,它所要达到的效果是能力可以单独存在,可以互相关联,可以彼此调用互相迁移。比如可以将手机端播放的视频迁移到智慧屏,通过大屏来观看视频,同时也可以将视频音效分离到外设音响;通过设备A获取设备B的数据;多设备终端数据同步等。

在HarmonyOS分布式系统中,一切皆能力,能力无大小。在HarmonyOS应用程序中,一个页面即一种能力,如登录页面,即具有登录功能的能力;一个服务即一种能力,如后台播放音乐的能力;一个数据操作即一种能力,如获取数据库数据等。同时能力之间也可以互相调用,通过页面能力来管理后台音效播放与暂停。

面向对象编程中一切皆对象,在HarmonyOS中一切皆能力。

Ability分类

一个HarmonyOS应用程序可以包含一个或多个能力。HarmonyOS应用程序可以以能力为单位进行部署。在HarmonyOS应用程序中将能力分为FA(Feature Ability,即元程序)和PA(Particle Ability,即元服务)两种类型,针对两种类型提供了不同的模板可以在日常业务开发中直接使用。

FA支持Page Ability

FA代表有UI界面的能力,被设计用于与用户交互。直白点就是给用户提供可操作的页面,官方根据不同的业务类型提供了不同种类的模板,比如关于页面、列表页面、个人中心页面等,可以根据不同的使用场景来选择不同的模板,也可以在当前模板的基础上进行修改以达到功能的快速实现。同时也可以调用PA支持的能力,来实现复杂的业务逻辑,比如在新闻内容页面通过Service Ability实现后台自动播放音乐。

PA支持Service Ability 和Data Ability

PA代表没有UI界面的能力,用于支持FA。例如提供数据访问能力作为数据存储。Service Ability提供后台运行任务的能力;Data Ability提供插入、删除、更新、查询及打开文件的能力。

Ability生命周期

能力有四种生命周期状态:INITIAL(初始态)、INACTIVE(未激活)、ACTIVE(激活)、BACKGROUND(后台)。

INITIAL: 初始状态。将即将启动的能力加载到内存中,但不运行。

INACTIVE:未激活状态。前台和后台中间的状态,该状态下UI可见,但不可操作。

ACTIVE:激活状态。当前置于前台页面完整呈现,可交互状态。

BACKGROUND: 不可见状态。也称置于后台,比如A页面跳转到B页面,则B页面呈现,A页面隐藏。这种状态的页面在内存不足情况下会被销毁。

整个完整的生命周期图如下所示(来自官方):

注(翻译错误):图中由于内存不足或用户跳转到该能力之后能力被系统销毁改为系统内存不足等原因导致终止能力,用户重新导航到该能力。

所有页面能力都必须从重写onStart()方法开始,该能力的所有生命周期回调方法如下:

  1. @Override 
  2.   public void onStart(Intent intent) { 
  3.       super.onStart(intent); 
  4.       super.setMainRoute(HomeAbilitySlice.class.getName()); 
  5.   } 
  6.  
  7.   @Override 
  8.   protected void onActive() { 
  9.       super.onActive(); 
  10.   } 
  11.  
  12.   @Override 
  13.   protected void onInactive() { 
  14.       super.onInactive(); 
  15.   } 
  16.  
  17.   @Override 
  18.   protected void onBackground() { 
  19.       super.onBackground(); 
  20.   } 
  21.  
  22.   @Override 
  23.   protected void onForeground(Intent intent) { 
  24.       super.onForeground(intent); 
  25.   } 
  26.  
  27.   @Override 
  28.   protected void onStop() { 
  29.       super.onStop(); 
  30.   } 

这里我们专门写一个页面间跳转来观察能力的生命周期,使用HiLog日志的形式来查看。运行应用程序并点击跳转,然后再返回,日志控制台输出如下所示。

  1. Ability_Lifecycle: MainAbility onInitialized()方法... 
  2. Ability_Lifecycle: MainAbility onStart()方法... 
  3. Ability_Lifecycle: MainAbility onActive()方法... 
  4. Ability_Lifecycle: MainAbility onInactive()方法... 
  5. Ability_Lifecycle: HomeAbility onInitialized()方法... 
  6. Ability_Lifecycle: HomeAbility onStart()方法... 
  7. Ability_Lifecycle: HomeAbility onActive()方法... 
  8. Ability_Lifecycle: MainAbility onBackground()方法... 
  9. Ability_Lifecycle: HomeAbility onInactive()方法... 
  10. Ability_Lifecycle: MainAbility onForeground()方法... 
  11. Ability_Lifecycle: MainAbility onActive()方法... 
  12. Ability_Lifecycle: HomeAbility onBackground()方法... 
  13. Ability_Lifecycle: HomeAbility onStop()方法... 

从日志我们观察到先启动MainAbility,当跳转到HomeAbility时,HomeAbility被激活,而MainAbility进入不可见(也就是后台),当点击返回按钮后,MainAbility回到前台并激活,而HomeAbility将不可见并销毁。

Ability之间跳转

Ability之间的跳转是以意图(Intent)为载体来承载需要对象之间传递的信息。通过封装意图相关的参数(Parameters)和操作(Operation),可以启动或跳转到另一个能力。

  1. Button button = (Button) findComponentById(ResourceTable.Id_btn); 
  2.  button.setClickedListener(l -> { 
  3.      Operation operation = new Intent.OperationBuilder() 
  4.              .withDeviceId(""
  5.              .withBundleName("com.itming.walking.photokit"
  6.              .withAbilityName("com.itming.walking.photokit.HomeAbility"
  7.              .build(); 
  8.      intent.setOperation(operation); 
  9.      startAbility(intent); 
  10.  }); 

本节主要阐述了能力(Ability)是什么、分类、生命周期及如何使用,后续将对Ability中方法进行详解,敬请期待...

注:文中若有理解偏差,欢迎一起讨论!

想了解更多内容,请访问:

51CTO和华为官方合作共建的鸿蒙技术社区

https://harmonyos.51cto.com

 

责任编辑:jianghua 来源: 鸿蒙社区
相关推荐

2021-09-29 09:00:19

Linux虚拟机CentOS

2022-07-19 19:39:05

RTK技术定位技术

2022-08-01 11:33:09

用户分析标签策略

2021-04-08 07:37:39

队列数据结构算法

2023-09-11 08:13:03

分布式跟踪工具

2022-04-07 10:39:21

反射Java安全

2017-03-11 22:19:09

深度学习

2023-11-18 09:30:42

模型AI

2020-10-17 08:48:12

搞懂“智能联接”

2020-02-18 16:20:03

Redis ANSI C语言日志型

2022-06-20 09:01:23

Git插件项目

2023-02-10 09:04:27

2020-09-10 06:56:12

SringMVC源码参数

2017-03-13 09:50:46

Python装饰器

2019-12-31 09:56:16

Linux 系统 数据

2019-09-05 08:14:44

Puppet部署结构

2019-04-02 10:51:29

浏览器缓存前端

2020-07-06 08:06:00

Java模块系统

2019-04-10 10:43:15

Redis内存淘汰策略

2018-05-22 08:24:50

PythonPyMongoMongoDB
点赞
收藏

51CTO技术栈公众号