一、Page与AbilitySlice

Page

Page模板(以下简称“Page”)是FA唯一支持的模板,用于提供与用户交互的能力。一个Page可以由一个或多个AbilitySlice构成,AbilitySlice是指应用的单个页面及其控制逻辑的总和。

当一个Page由多个AbilitySlice共同构成时,这些AbilitySlice页面提供的业务能力应具有高度相关性。例如,新闻浏览功能可以通过一个Page来实现,其中包含了两个AbilitySlice:一个AbilitySlice用于展示新闻列表,另一个AbilitySlice用于展示新闻详情。Page和AbilitySlice的关系如下图所示。

AbilitySlice

这里的Slice,其实就是切片的意思。一组相关的AbilitySlice放在一个Page里。

AbilitySlice作为使用Page模板到能力的基本单元,提供了一种具有服务逻辑和UI显示载体的能力。

相比于桌面场景,移动场景下应用之间的交互更为频繁。通常,单个应用专注于某个方面的能力开发,当它需要其他能力辅助时,会调用其他应用提供的能力。例如,外卖应用提供了联系商家的业务功能入口,当用户在使用该功能时,会跳转到通话应用的拨号页面。与此类似,HarmonyOS支持不同Page之间的跳转,并可以指定跳转到目标Page中某个具体的AbilitySlice。

一个Ability可以有多个AbilitySlice组成。在Ability中,必须重写onStart(Intent)方法,通过setMainRoute(String)方法来指定默认的AbilitySlice。

而在AbilitySlice中,可以重写onStart(ohos.aafwk.content.Intent)来设置要显示的UI。通常,在AbilitySlice的整个生命周期中,UI只需要设置一次。

可以使用present(ohos.aafwk.ability.AbilitySlice,ohos.aafwk.content.Intent)方法来呈现新的AbilitySlice,或者使用startAbility(ohos.aafwk.content.Intent)方法来启动新的AbilitySlice。

AbilitySlice必须始终托管在Ability中,并且其生命周期随Ability的生命周期而变化。AbilitySlice也有其独立的生命周期更改,这些更改发生在AbilitySlice的切换过程中。

我们可以为一个Ability指定多个action entry和一个默认的主entry。每个entry表示Ability可以提供的能力和UI。当一个Ability被启动时,系统将传递的Intent中的action字段与定义的entry进行匹配。如果找到指定的AbilitySlice,就会启动它,。如果传递的Intent中没有指定action字段,或者Intent中的action字段与定义的entry不匹配,则显示默认的AbilitySlice。

注册action后,其他的Ability也可以通过指定的action来打开AbilitySlice。

二、AbilitySlice路由配置

虽然一个Page可以包含多个AbilitySlice,但是Page进入前台时界面默认只展示一个AbilitySlice。默认展示的AbilitySlice是通过setMainRoute()方法来指定的。如果需要更改默认展示的AbilitySlice,可以通过addActionRoute()方法为此AbilitySlice配置一条路由规则。此时,当其他Page实例期望导航到此AbilitySlice时,可以在Intent中指定Action。addActionRoute() 方法中使用的动作命名,需要在应用配置文件(config.json)中注册。

setMainRoute()方法

setMainRoute()方法,可以调用此方法来设置该Ability的默认路由,即要呈现的AbilitySlice。此方法只能用于Page ability。注意:如果在onStart(ohos.aafwk.content.Intent),中未设置默认路由,则启动将失败。

我们创建一个Harmony项目,默认加载的是MainAbilitySlice,

package com.example.hanrupageability;import com.example.hanrupageability.slice.MainAbilitySlice;
import ohos.aafwk.ability.Ability;
import ohos.aafwk.content.Intent;public class MainAbility extends Ability {@Overridepublic void onStart(Intent intent) {super.onStart(intent);// 设置默认显示的AbilitySlicesuper.setMainRoute(MainAbilitySlice.class.getName());}
}

显示对应的ability_main.xml布局:

现在我们在layout目录下添加一个xml文件:ability_second.xml

<?xml version="1.0" encoding="utf-8"?>
<DirectionalLayoutxmlns:ohos="http://schemas.huawei.com/res/ohos"ohos:height="match_parent"ohos:width="match_parent"ohos:alignment="center"ohos:background_element="#2200ffff"ohos:orientation="vertical"><Textohos:height="match_content"ohos:width="match_content"ohos:text="我是第二个AbilitySlice"ohos:text_size="20fp"/>
</DirectionalLayout>

然后在slice目录下新建一个对应的AbilitySlice:SecondAbilitySlice.java

package com.example.hanrupageability.slice;import com.example.hanrupageability.ResourceTable;
import ohos.aafwk.ability.AbilitySlice;
import ohos.aafwk.content.Intent;public class SecondAbilitySlice extends AbilitySlice{@Overrideprotected void onStart(Intent intent) {super.onStart(intent);super.setUIContent(ResourceTable.Layout_ability_second);}
}

接下来我们可以通过setMainRoute()方法来设置显示SecondAbilitySlice:

package com.example.hanrupageability;import com.example.hanrupageability.slice.MainAbilitySlice;
import com.example.hanrupageability.slice.SecondAbilitySlice;
import ohos.aafwk.ability.Ability;
import ohos.aafwk.content.Intent;public class MainAbility extends Ability {@Overridepublic void onStart(Intent intent) {super.onStart(intent);// 设置默认显示的AbilitySlice
//        super.setMainRoute(MainAbilitySlice.class.getName());super.setMainRoute(SecondAbilitySlice.class.getName());}
}

然后运行这个项目:

addActionRoute()方法

setMainRoute()方法与addActionRoute()方法的使用示例如下:

package com.example.hanrupageability;import com.example.hanrupageability.slice.MainAbilitySlice;
import com.example.hanrupageability.slice.SecondAbilitySlice;
import ohos.aafwk.ability.Ability;
import ohos.aafwk.content.Intent;public class MainAbility extends Ability {@Overridepublic void onStart(Intent intent) {super.onStart(intent);// 设置默认显示的AbilitySlicesuper.setMainRoute(MainAbilitySlice.class.getName());// super.setMainRoute(SecondAbilitySlice.class.getName());// 配置路由规则显示addActionRoute("action.test.second", SecondAbilitySlice.class.getName());}
}

addActionRoute()方法中使用的动作命名,需要在应用配置文件(config.json)中注册:

"skills": [{"entities": ["entity.system.home"],"actions": ["action.system.home","action.test.second"]}],

如图:

三、创建PageAbility

默认启动一个HarmonyOS应用APP,跟根据config.json中的配置,先加载MainAbility。

{"app": {"bundleName": "com.example.hanrupageability","vendor": "example","version": {"code": 1000000,"name": "1.0.0"}},"deviceConfig": {},"module": {"package": "com.example.hanrupageability","name": ".MyApplication","mainAbility": "com.example.hanrupageability.MainAbility","deviceType": ["phone"],"distro": {"deliveryWithInstall": true,"moduleName": "entry","moduleType": "entry","installationFree": false},"abilities": [{"skills": [{"entities": ["entity.system.home"],"actions": ["action.system.home","action.test.second"]}],"orientation": "unspecified","name": "com.example.hanrupageability.MainAbility","icon": "$media:icon","description": "$string:mainability_description","label": "$string:entry_MainAbility","type": "page","launchType": "standard"}]}
}

在MainAbility中,根据设置的主路由,加载MainAbilitySlice:

@Overridepublic void onStart(Intent intent) {super.onStart(intent);super.setMainRoute(MainAbilitySlice.class.getName());}

在MainAbilitySlice中,根据setUIContent()设置要显示的xml布局文件,最终在我们的屏幕上显示ability_main.xml中的内容。

@Overridepublic void onStart(Intent intent) {super.onStart(intent);super.setUIContent(ResourceTable.Layout_ability_main);}

现在如果我们想默认加载自己写的Ability,我们来实现一下。

首先在java中新建一个Ability文件:MyAbility.java。

package com.example.hanrupageability;import com.example.hanrupageability.slice.MyAbilitySlice;
import ohos.aafwk.ability.Ability;
import ohos.aafwk.content.Intent;public class MyAbility extends Ability {@Overrideprotected void onStart(Intent intent) {super.onStart(intent);// 设置主路由super.setMainRoute(MyAbilitySlice.class.getName());}
}

这里我们设置要加载对应MyAbilitySlice,接下来在slice包下,新建一个AbilitySlice文件:MyAbilitySlice.java:

package com.example.hanrupageability.slice;import com.example.hanrupageability.ResourceTable;
import ohos.aafwk.ability.AbilitySlice;
import ohos.aafwk.content.Intent;public class MyAbilitySlice  extends AbilitySlice {@Overrideprotected void onStart(Intent intent) {super.onStart(intent);super.setUIContent(ResourceTable.Layout_my_layout);}
}

然后我们在layout布局下新建一个xml布局文件:my_layout.xml

<?xml version="1.0" encoding="utf-8"?>
<DirectionalLayoutxmlns:ohos="http://schemas.huawei.com/res/ohos"ohos:height="match_parent"ohos:width="match_parent"ohos:background_element="#33AA0000"ohos:orientation="vertical"><Textohos:height="match_parent"ohos:width="match_parent"ohos:text="新的入口"ohos:text_size="30fp"ohos:text_alignment="center"/></DirectionalLayout>

这里我们复制到media里一个小图标t4.png:

最后,我们要在config.json中设置:

{"app": {"bundleName": "com.example.hanrupageability","vendor": "example","version": {"code": 1000000,"name": "1.0.0"}},"deviceConfig": {},"module": {"package": "com.example.hanrupageability","name": ".MyApplication","mainAbility": "com.example.hanrupageability.MainAbility","deviceType": ["phone"],"distro": {"deliveryWithInstall": true,"moduleName": "entry","moduleType": "entry","installationFree": false},"abilities": [{"skills": [{"entities": ["entity.system.home"],"actions": ["action.system.home"]}],"orientation": "unspecified","name": "com.example.hanrupageability.MyAbility","icon": "$media:t4","label": "$string:entry_MainAbility","type": "page","launchType": "standard"},{"orientation": "unspecified","name": "com.example.hanrupageability.MainAbility","icon": "$media:icon","description": "$string:mainability_description","label": "$string:entry_MainAbility","type": "page","launchType": "standard"}]}
}

然后启动项目,这个APP部署:

点进去,就有了新的入口:

我们也可以通过DevEco-Studio直接新建Ability,这样随着Ability的创建,会自动创建该Ability对应的AbilitySlice以及该AbilitSlice要加载的xml布局文件:

然后填入Ability的信息:

还有还有,会自动的配置config.json文件,超爽的:

需要更多教程,微信扫码即可

PageAbility基本概念相关推荐

  1. 鸿蒙神奇组件Ability的奇妙之旅

    /   今日科技快讯   / 近日,小米雷军在北京园区带来了其年度演讲<我的梦想,我的选择>,同时发布了年度旗舰机小米MIX4等新品.雷军为小米首批用户每人赠送1999元红包,总计3.7亿 ...

  2. RPC 笔记(03)— gRPC 概念、安装、编译、客户端和服务端示例

    1. gRPC 概念 gRPC 是 Google 开源的一款高性能的 RPC 框架.GitHub 上介绍如下: gRPC is a modern, open source, high-performa ...

  3. RPC 笔记(01)— RPC概念、调用流程、RPC 与 Restful API 区别

    1. 基本概念 PRC 远程过程调用 Remote Procedure Call,其就是一个节点请求另外一个节点提供的服务.当两个物理分离的子系统需要建立逻辑上的关联时,RPC 是牵线搭桥的常见技术手 ...

  4. 数据结构(01)— 算法复杂度概念及常见的复杂度计算

    1. 大 O 表示法 大 O 表示法指出了算法有多快,让你能够比较操作数,它指出了算法运行时间的增速,而并非以秒为单位的速度.大 O 表示法指出了最糟情况下的运行时间.大 O 表示法在讨论运行时间时, ...

  5. OpenCV 笔记(01)— OpenCV 概念、整体架构、各模块主要功能

    1. OpenCV 概念 图像处理( Image Processing )是用计算机对图像进行分析, 以达到所需结果的技术, 又称影像处理. 图像处理技术一般包括图像压缩, 增强和复原, 匹配.描述和 ...

  6. 用男女朋友关系解释计算机常用概念

    运维方面 很多同学对热备,冷备,云备了解不深,我科普一下 IT 行业各种备份术语.以后别闹笑话了. 假设你是一位女性,你有一位男朋友,于此同时你和另外一位男生暧昧不清,比朋友好,又不是恋人.你随时可以 ...

  7. python中的新式类与旧式类的一些基于descriptor的概念(上)

    python中基于descriptor的一些概念(上) 1. 前言 2. 新式类与经典类 2.1 内置的object对象 2.2 类的方法 2.2.1 静态方法 2.2.2 类方法 2.3 新式类(n ...

  8. 【SpringMVC】基本概念

    SpringMVC的基本概念 三层架构 我们的开发一般都是基于c/s或者b/s架构.在JavaEE开发中,几乎全都是基于B/S架构开发.在B/S架构中,系统标准的三层架构包括:表现层,业务层,持久层. ...

  9. AIFramework基本概念整理

    AIFramework基本概念整理 本文介绍: • 对天元 MegEngine 框架中的 Tensor, Operator, GradManager 等基本概念有一定的了解: • 对深度学习中的前向传 ...

最新文章

  1. python语言函数库_Python 的标准库,从0到1学Python
  2. 斐波那契数列算法(C#)
  3. BugKuCTF 加密 ok
  4. python模块与包
  5. 404错误 iis thinkphp_关于ThinkPHP实现访问不存在的模块跳转到404页面的方法
  6. Python 进阶之递归函数一点都不难!
  7. DSP28335笔记 —— 定时器
  8. Step ‘Publish JUnit test result report’ failed: No test report files were found问题解决
  9. Python编写的疲劳检测系统(实时摄像头检测)
  10. 对话机器学习大神Yoshua Bengio(下)
  11. java开发运行环境的安装步骤_配置java开发运行环境的步骤
  12. android_基础_修改系统背景(状态栏颜色、导航栏颜色、标题栏颜色等等)
  13. S@Kura的PHP进阶之路(三)
  14. Jquery之瀑布流
  15. DSP学习(5)—— Timer的使用
  16. 杏子语录(2020年01月)
  17. linux的的shell记忆
  18. win10主题更换_【小A问答】遇到超好看的Win10主题壁纸如何提取?
  19. 全球与中国切板刀市场深度研究分析报告
  20. java导出dbf文件生僻汉字处理

热门文章

  1. “我在B站有套房”成真:云蹦迪、不停学还健身
  2. 2799元起!小米CC9 Pro正式开售:1亿像素加持DXOMark总分第一
  3. 2019中国手机品牌用户社交洞察报告:低价看配置 高价重颜值
  4. 拼多多开始卖车了!3.49万秒杀五菱宏光...
  5. 英特尔回应安全漏洞问题:已在硬件层面解决
  6. 红米Redmi品牌独立首战告捷:半月多出货超100万
  7. 拳王虚拟项目公社:最新创业好项目有哪些,90后创业好项目,虚拟资源兼职副业好项目
  8. 全志R40 UBOOT 2014.07【原创】
  9. 支付宝web支付,mobileclientgw-
  10. 浏览器缓存机制(优化)