PageAbility基本概念
一、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基本概念相关推荐
- 鸿蒙神奇组件Ability的奇妙之旅
/ 今日科技快讯 / 近日,小米雷军在北京园区带来了其年度演讲<我的梦想,我的选择>,同时发布了年度旗舰机小米MIX4等新品.雷军为小米首批用户每人赠送1999元红包,总计3.7亿 ...
- RPC 笔记(03)— gRPC 概念、安装、编译、客户端和服务端示例
1. gRPC 概念 gRPC 是 Google 开源的一款高性能的 RPC 框架.GitHub 上介绍如下: gRPC is a modern, open source, high-performa ...
- RPC 笔记(01)— RPC概念、调用流程、RPC 与 Restful API 区别
1. 基本概念 PRC 远程过程调用 Remote Procedure Call,其就是一个节点请求另外一个节点提供的服务.当两个物理分离的子系统需要建立逻辑上的关联时,RPC 是牵线搭桥的常见技术手 ...
- 数据结构(01)— 算法复杂度概念及常见的复杂度计算
1. 大 O 表示法 大 O 表示法指出了算法有多快,让你能够比较操作数,它指出了算法运行时间的增速,而并非以秒为单位的速度.大 O 表示法指出了最糟情况下的运行时间.大 O 表示法在讨论运行时间时, ...
- OpenCV 笔记(01)— OpenCV 概念、整体架构、各模块主要功能
1. OpenCV 概念 图像处理( Image Processing )是用计算机对图像进行分析, 以达到所需结果的技术, 又称影像处理. 图像处理技术一般包括图像压缩, 增强和复原, 匹配.描述和 ...
- 用男女朋友关系解释计算机常用概念
运维方面 很多同学对热备,冷备,云备了解不深,我科普一下 IT 行业各种备份术语.以后别闹笑话了. 假设你是一位女性,你有一位男朋友,于此同时你和另外一位男生暧昧不清,比朋友好,又不是恋人.你随时可以 ...
- python中的新式类与旧式类的一些基于descriptor的概念(上)
python中基于descriptor的一些概念(上) 1. 前言 2. 新式类与经典类 2.1 内置的object对象 2.2 类的方法 2.2.1 静态方法 2.2.2 类方法 2.3 新式类(n ...
- 【SpringMVC】基本概念
SpringMVC的基本概念 三层架构 我们的开发一般都是基于c/s或者b/s架构.在JavaEE开发中,几乎全都是基于B/S架构开发.在B/S架构中,系统标准的三层架构包括:表现层,业务层,持久层. ...
- AIFramework基本概念整理
AIFramework基本概念整理 本文介绍: • 对天元 MegEngine 框架中的 Tensor, Operator, GradManager 等基本概念有一定的了解: • 对深度学习中的前向传 ...
最新文章
- python语言函数库_Python 的标准库,从0到1学Python
- 斐波那契数列算法(C#)
- BugKuCTF 加密 ok
- python模块与包
- 404错误 iis thinkphp_关于ThinkPHP实现访问不存在的模块跳转到404页面的方法
- Python 进阶之递归函数一点都不难!
- DSP28335笔记 —— 定时器
- Step ‘Publish JUnit test result report’ failed: No test report files were found问题解决
- Python编写的疲劳检测系统(实时摄像头检测)
- 对话机器学习大神Yoshua Bengio(下)
- java开发运行环境的安装步骤_配置java开发运行环境的步骤
- android_基础_修改系统背景(状态栏颜色、导航栏颜色、标题栏颜色等等)
- S@Kura的PHP进阶之路(三)
- Jquery之瀑布流
- DSP学习(5)—— Timer的使用
- 杏子语录(2020年01月)
- linux的的shell记忆
- win10主题更换_【小A问答】遇到超好看的Win10主题壁纸如何提取?
- 全球与中国切板刀市场深度研究分析报告
- java导出dbf文件生僻汉字处理
热门文章
- “我在B站有套房”成真:云蹦迪、不停学还健身
- 2799元起!小米CC9 Pro正式开售:1亿像素加持DXOMark总分第一
- 2019中国手机品牌用户社交洞察报告:低价看配置 高价重颜值
- 拼多多开始卖车了!3.49万秒杀五菱宏光...
- 英特尔回应安全漏洞问题:已在硬件层面解决
- 红米Redmi品牌独立首战告捷:半月多出货超100万
- 拳王虚拟项目公社:最新创业好项目有哪些,90后创业好项目,虚拟资源兼职副业好项目
- 全志R40 UBOOT 2014.07【原创】
- 支付宝web支付,mobileclientgw-
- 浏览器缓存机制(优化)