HarmonyOS技术社区 · 2021年03月10日

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

<span class="colour" style="color: rgb(52, 73, 94);">本节概述</span>

<span class="colour" style="color: rgb(52, 73, 94);">什么是Ability</span>

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

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

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

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

<span class="colour" style="color: rgb(186, 55, 42);">面向对象编程中一切皆对象,在HarmonyOS中一切皆能力。</span>

<span class="colour" style="color: rgb(52, 73, 94);">Ability分类</span>

一个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提供插入、删除、更新、查询及打开文件的能力。

<span class="colour" style="color: rgb(52, 73, 94);">Ability生命周期</span>

能力有四种生命周期状态:INITIAL(初始态)、INACTIVE(未激活)、ACTIVE(激活)、BACKGROUND(后台)
INITIAL: 初始状态。将即将启动的能力加载到内存中,但不运行。
INACTIVE:未激活状态。前台和后台中间的状态,该状态下UI可见,但不可操作。
ACTIVE:激活状态。当前置于前台页面完整呈现,可交互状态。
BACKGROUND: 不可见状态。也称置于后台,比如A页面跳转到B页面,则B页面呈现,A页面隐藏。这种状态的页面在内存不足情况下会被销毁。

<span class="colour" style="color: rgb(22, 145, 121);">整个完整的生命周期图如下所示(来自官方):</span>
<span class="colour" style="color: rgb(22, 145, 121);">鸿蒙应用程序Ability(能力)看这一篇就够</span>
<span class="colour" style="color: rgb(22, 145, 121);"><span class="colour" style="color: rgb(230, 126, 35);"><span class="colour" style="color: rgb(186, 55, 42);">注(翻译错误)</span>:图中由于内存不足或用户跳转到该能力之后能力被系统销毁改为系统内存不足等原因导致终止能力,用户重新导航到该能力。</span></span>

<span class="colour" style="color: rgb(0, 0, 0);">所有页面能力都必须从重写onStart()方法开始,该能力的所有生命周期回调方法如下:</span>

    @Override
    public void onStart(Intent intent) {
        super.onStart(intent);
        super.setMainRoute(HomeAbilitySlice.class.getName());
    }

    @Override
    protected void onActive() {
        super.onActive();
    }

    @Override
    protected void onInactive() {
        super.onInactive();
    }

    @Override
    protected void onBackground() {
        super.onBackground();
    }

    @Override
    protected void onForeground(Intent intent) {
        super.onForeground(intent);
    }

    @Override
    protected void onStop() {
        super.onStop();
    }

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

Ability_Lifecycle: MainAbility onInitialized()方法...
Ability_Lifecycle: MainAbility onStart()方法...
Ability_Lifecycle: MainAbility onActive()方法...
Ability_Lifecycle: MainAbility onInactive()方法...
Ability_Lifecycle: HomeAbility onInitialized()方法...
Ability_Lifecycle: HomeAbility onStart()方法...
Ability_Lifecycle: HomeAbility onActive()方法...
Ability_Lifecycle: MainAbility onBackground()方法...
Ability_Lifecycle: HomeAbility onInactive()方法...
Ability_Lifecycle: MainAbility onForeground()方法...
Ability_Lifecycle: MainAbility onActive()方法...
Ability_Lifecycle: HomeAbility onBackground()方法...
Ability_Lifecycle: HomeAbility onStop()方法...

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

<span class="colour" style="color: rgb(52, 73, 94);">Ability之间跳转</span>

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

    Button button = (Button) findComponentById(ResourceTable.Id_btn);
    button.setClickedListener(l -> {
        Operation operation = new Intent.OperationBuilder()
                .withDeviceId("")
                .withBundleName("com.itming.walking.photokit")
                .withAbilityName("com.itming.walking.photokit.HomeAbility")
                .build();
        intent.setOperation(operation);
        startAbility(intent);
    });

<span class="colour" style="color: rgb(22, 145, 121);">本节主要阐述了能力(Ability)是什么、分类、生命周期及如何使用,后续将对Ability中方法进行详解,敬请期待...</span>

<span class="colour" style="color: rgb(186, 55, 42);">注:文中若有理解偏差,欢迎一起讨论!</span>

作者:云昌白晓明

想了解更多内容,请访问51CTO和华为合作共建的鸿蒙社区:https://harmonyos.51cto.com/

本文作者文章合集地址

21_9.jpg

推荐阅读
关注数
3019
内容数
446
华为鸿蒙相关技术,活动及资讯,欢迎关注及加入创作
目录
极术微信服务号
关注极术微信号
实时接收点赞提醒和评论通知
安谋科技学堂公众号
关注安谋科技学堂
实时获取安谋科技及 Arm 教学资源
安谋科技招聘公众号
关注安谋科技招聘
实时获取安谋科技中国职位信息