PageAbility基本概念

2023-11-20

作者:韩茹

公司:程序咖(北京)科技有限公司

鸿蒙巴士专栏作家

一、Page与AbilitySlice

Page

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

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

0000000000011111111.20210330203818.85986359791939446675947303912970

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 {
    @Override
    public void onStart(Intent intent) {
        super.onStart(intent);
        // 设置默认显示的AbilitySlice
        super.setMainRoute(MainAbilitySlice.class.getName());

    }
}

显示对应的ability_main.xml布局:

WX20210625-161510@2x

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

<?xml version="1.0" encoding="utf-8"?>
<DirectionalLayout
    xmlns: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">

    <Text
        ohos: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{
    @Override
    protected 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 {
    @Override
    public void onStart(Intent intent) {
        super.onStart(intent);
        // 设置默认显示的AbilitySlice
//        super.setMainRoute(MainAbilitySlice.class.getName());
        super.setMainRoute(SecondAbilitySlice.class.getName());

    }
}

然后运行这个项目:

WX20210625-161428@2x

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 {
    @Override
    public void onStart(Intent intent) {
        super.onStart(intent);
        // 设置默认显示的AbilitySlice
        super.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"
            ]
          }
        ],

如图:

WX20210625-155525@2x

三、创建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:

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

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

		@Override
    public 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 {
    @Override
    protected 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 {
    @Override
    protected 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"?>
<DirectionalLayout
    xmlns:ohos="http://schemas.huawei.com/res/ohos"
    ohos:height="match_parent"
    ohos:width="match_parent"
    ohos:background_element="#33AA0000"
    ohos:orientation="vertical">

    <Text
        ohos:height="match_parent"
        ohos:width="match_parent"
        ohos:text="新的入口"
        ohos:text_size="30fp"
        ohos:text_alignment="center"
        />

</DirectionalLayout>

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

WX20210625-160915@2x

最后,我们要在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部署:

WX20210625-161158@2x

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

WX20210625-161234@2x

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

WX20210625-173906@2x

然后填入Ability的信息:

WX20210625-174115@2x

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

WX20210625-174325@2x

更多内容:

1、社区:鸿蒙巴士https://www.harmonybus.net/

2、公众号:HarmonyBus

3、技术交流QQ群:714518656

4、视频课:https://www.chengxuka.com

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

PageAbility基本概念 的相关文章

  • 背单词(持续更新)

    文章目录 星火雅思周计划 229 复习 考研 352 353 职场俚语 1 2 7分 1 2 3 4 5 6 7 8 haochi fun 1 2 GRE 1 2 托福 249 247 248 245 246 243 244 241 242
  • 3WebGL shader准备工具

    VSCode安装 VSCode 全称 Visual Studio Code 是一款由微软开发且跨平台的免费源代码编辑器 该软件支持语法高亮 代码自动补全 又称 IntelliSense 代码重构 查看定义功能 并且内置了命令行工具和 Git
  • Unity保存图片到相册

    Unity保存图片到Android相册 Java 纯文本查看 复制代码 01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28
  • ESXI 7.0 版本配置N卡显卡直通

    ESXI 7 版本配置N卡显卡直通 前因 ESXI版本太新 网上啥参考资料没有 显卡直通各种问题 虚机一装显卡驱动就直接把宿主机直接整挂了 于是各种查资料 各种尝试 终于搞定直通问题 配置 名称 版本 服务器 DELL R720 ESXI
  • MySQL中的DML、DDL、DCL到底是什么玩意呢?

    个人主页 极客小俊 作者简介 web开发者 设计师 技术分享博主 希望大家多多支持一下 我们一起进步 如果文章对你有帮助的话 欢迎评论 点赞 收藏 加关注 引言 一直以来 很多人分不清这三个东西到底是什么简称 代表什么 至在面试中遇到可能会
  • nginx的location、root、alias指令用法和区别

    亲测可用 若有疑问请私信 nginx指定文件路径有两种方式root和alias 指令的使用方法和作用域 root 语法 root path 默认值 root html 配置段 http server location if alias 语法
  • Arduino动手做(48)---三轴ADXL345模块

    37款传感器与模块的提法 在网络上广泛流传 其实Arduino能够兼容的传感器模块肯定是不止37种的 鉴于本人手头积累了一些传感器和模块 依照实践 动手试试 出真知的理念 以学习和交流为目的 这里准备逐一做做实验 不管能否成功 都会记录下来
  • 第十二届蓝桥杯 2021年省赛真题 (Java 大学C组) 第二场

    蓝桥杯 2021年省赛真题 Java 大学C组 第二场 A 浮点数 B 求余 C 双阶乘 D 格点 E 整数分解 F 3 的倍数 G 特殊年份 H 小平方 I 完全平方数 J 负载均衡 A 浮点数 题目 问题描述 IEEE 754 规定一个
  • 关于HTML基本标签及结构详解

    本文主要介绍了HTML基本标签及结构详解 本文给大家介绍的非常详细 对大家的学习或工作具有一定的参考借鉴价值 需要的朋友可以参考下 1 HTML概述 1 HTML 超文本标记语言 是一种标识性语言 非编程语言 不能使用逻辑运算 通过标签将网
  • 吴恩达 deeplearning.ai课程-卷积神经网络 (2)深度卷积模型-实例探究

    参考来源 https blog csdn net red stone1 article details 78769236 https blog csdn net koala tree article details 78531398 有关C
  • python自动化笔记(九)文件操作

    文件的打开 file open test txt w encoding utf 8 参数 文件名 访问模式 write 默认为read file write hello python 删除原有内容 并写入 ret file read 读取文
  • Flutter使用百度定位经纬度数据正常,详细地址为null

    Flutter使用百度定位经纬度数据正常 详细地址为null 更新至2021 09 07 一 问题 1 使用百度定位 插件返回的数据中经纬度有正常值 其他地址信息都为null 二 分析原因 1 在wifi或移动网络没有 不好的情况下 会出现
  • 自动注册appleid

    1 通过猴油注册脚本 用js填写表单 问题 由于apple官网采用了自己封装的mvvm框架 如果只是赋值的话 还不能把视图上的数据更新到model上 必须触发一下表单元素的input事件或者change事件完成model的更新 CSP网站安
  • 孤儿进程和僵尸进程

    作者 华清远见讲师 前段时间 由于研究经典面试题 把孤儿进程和僵尸进程也总结了一下 我们有这样一个问题 孤儿进程和僵尸进程 怎么产生的 有什么危害 怎么去预防 下面是针对此问题的总结与概括 一 产生的原因 1 一般进程 正常情况下 子进程由
  • vue 表格表头内容居中

    放入
  • elasticsearch的object类型和动态映射

    我们需要讨论的最后一个自然JSON数据类型是对象 object 在其它语言中叫做hash hashmap dictionary 或者 associative array 内部对象 inner objects 经常用于在另一个对象中嵌入一个实
  • node mysql高级用法_nodejs中mysql用法

    1 建立数据库连接 createConnection Object 方法 该方法接受一个对象作为参数 该对象有四个常用的属性host user password database 与php中链接数据库的参数相同 属性列表如下 host 连接
  • Xray使用教程

    简介 Xray是长亭科技开发的一款漏扫工具 支持多种扫描方式和漏洞类型 可自定义POC Proof of Concept 概念验证 即漏洞验证程序 俺是在 乌雲安全 看到了这个工具的使用 作为一个脚本小子初学者 这里做一下笔记 使用 web
  • NVDLA系列之C-model:cvif<99>

    NV NVDLA cvif cpp WriteRequest sdp2cvif void NV NVDLA cvif WriteRequest sdp2cvif uint64 t base addr uint64 t first base

随机推荐

  • 通过递归,实现数组转树

    一 为什么需要数组转树 当我们做后台管理系统时难免会遇到关于公司组织架构这样的模块 一个部门下会有好几个小部门 这时我们就可以运用树形图来更好地进行查看 下面简单举例 将数组 const arr id 1 pid 0 name 生鲜 id
  • linux安装分区详解lvm,Linux下LVM的配置详解

    LVM是Logical Volume Manager 逻辑卷管理器 的简写 它为主机提供了更高层次的磁盘存储管理能力 LVM可以帮助系统管理员为应用与用户方便地分配存储空间 在LVM管理下的逻辑卷可以按需改变大小或添加移除 另外 LVM可以
  • 【正点原子探索者STM32F407开发板例程连载+教学】第30章 SPI通信实验

    第三十章 SPI 实验 mw shl code c true 1 硬件平台 正点原子探索者STM32F407开发板 2 软件平台 MDK5 1 3 固件库版本 V1 4 0 mw shl code 本章我们将向大家介绍STM32F4的SPI
  • upload-labs通关(Pass-06~Pass-10)

    目录 Pass 06 Pass 07 Pass 08 Pass 09 Pass 10 Pass 06 上传sh php失败 burp中将抓到的包send to repeater 修改filename为sh xxx发现可以上传成功 说明是黑名
  • 线上常见问题排查之CPU过高

    目前应用程序基本是Java 所以需要登录docker容器内部执行jstack命令打印堆栈信息再分析 确认目标进程 执行top命令查看CPU占用情况 找出CPU占用高的进程ID PS 输入大写P即可按照CPU占比排序进程 即 Shift p
  • BMP图像读取数据

    我们在使用Windows的画图软件 画一张图 然后保存成24位位图BMP图像后 要对这幅图像进行一系列的格式转换之前 需要先将BMP里的数据提取出来 然后再保存成BGR888的图像 有两处细节要注意 第一 我们直接保存成BMP图片 不知道为
  • [项目管理-25]:高效沟通的利器,结构思考力与树形结构化表达

    作者主页 文火冰糖的硅基工坊 文火冰糖 王文兵 的博客 文火冰糖的硅基工坊 CSDN博客 本文网址 目录 前言 第1章 结构化思考力概述 1 1 非结构化思考力的问题与结构化思路力的好处 1 2 什么是结构化思路力 1 3 三大沟通层次 层
  • vue prop属性使用方法小结

    Prop 一 基本用法 Prop的基本用法很简单 作用是在子组件中接收父组件的值 父组件传值
  • Allegro如何调整丝印字号

    1 设置颜色管理器 先将所有的都关掉 如果要调节top层丝印 打开top层的焊盘和阻焊层 绿油层 打开板框 丝印和位号 2 选择 设置字号 在Edit中执行Change命令 Find中选择Text 在Options中勾选刚才修改的2号字体
  • JSON首字母大写问题

    一般如果json中的字段和类里的属性相同 则不需要修改 如果不同则可以在类的属性上添加 JsonProperty 或者 JSONField 但是如果JSON数据或者类中属性首字母大写的话 只能使用 JsonProperty 否则注入的值是n
  • Spring学习笔记总结

    第一章 引言 1 EJB存在的问题 2 什么是Spring Spring是一个轻量级的JavaEE解决方案 整合众多优秀的设计模式 轻量级 1 对于运行环境是没有额外要求的 开源 tomcat resion jetty 收费 weblogi
  • 浅谈音视频开发入门基础及进阶资源分享

    导言 音视频开发涉及的知识面比较广 知识点又相对独立琐碎 入门门槛相对较高 想要对音视频开发具有深入全面的了解 需要在行业深耕多年 本文将简单介绍音视频的采集 编解码 传输 渲染四个技术点并对涉及到的知识点和原理进行解释 希望你可以对音视频
  • JAVA并发:线程安全与Synchorinzed

    1 什么是线程安全问题 线程的合理使用能够提升程序的处理性能 主要有两个方面 第一个是能够利用多核 cpu 以及超线程技术来实现线程的并行执行 第二个是线程的异步化执行相比于同步执行来说 异步执行能够很好的优化程序的处理性能提升并发吞吐量
  • 强符号与弱符号

    文章目录 强符号不允许多次定义 强弱可以共存 都是弱符号 简而言之 在 C 语言中 函数和初始化的全局变量 包括显示初始化为 0 是强符号 未初始化的全局变量是弱符号 在链接器进行链接的时候 有下面的规则 强符号不允许多次定义 即不同的目标
  • 多少个X 蓝桥杯模拟

    问题描述 给定一个字母矩阵 一个 X 图形由中心点和由中心点向四个45度斜线方向引出的直线段组成 四条 线段的长度相同 而且四条线段上的字母和中心点的字母相同 一个 X图形可以使用三个整数 r c L 来描述 其中 r c 表示中心点位于第
  • QT 数据库

    sqlite SQLITE功能简约 小型化 追求最大磁盘效率 支持跨平台 不需要服务器 在本地的 数据库操作基本的功能QT里面都有 可视化软件也很小 有支持关系模式的model In memory database IMDB 即内存数据库
  • java动态代理简单实例

    java动态代理简单实例 package hello import java lang reflect InvocationHandler import java lang reflect Method import java lang r
  • 人工智能与信息化

    众所周知 世界上任何事物都能被存储好然后收藏 唯一不能完全被记载的是电子数据 如手机数据 电脑数据 格物斯坦提醒 因为要管理我们每个人的电子化信息 由于数据量大 操作起来极其不方便 很费时费力 但未来一种通过玻璃光 几秒钟内将电子数据全部安
  • 8.全配置自动生成模块前后端

    文章目录 学习资料 配置式开发全新的模块 快速实现 字典管理 代码生成器详细属性设置 全智能模块开发 查询调整 多表连接 药品模块 生产厂家下拉框 学习资料 https www bilibili com video BV13g411Y7GS
  • PageAbility基本概念

    作者 韩茹 公司 程序咖 北京 科技有限公司 鸿蒙巴士专栏作家 一 Page与AbilitySlice Page Page模板 以下简称 Page 是FA唯一支持的模板 用于提供与用户交互的能力 一个Page可以由一个或多个AbilityS