您当前的位置:首页 > 电脑百科 > 程序开发 > 编程百科

PageAbility基本概念

时间:2021-08-04 09:55:04  来源:  作者:RubyHan

作者:韩茹

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

鸿蒙巴士专栏作家

一、Page与AbilitySlice

Page

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

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

PageAbility基本概念

 

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布局:

PageAbility基本概念

 

现在我们在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());

    }
}

然后运行这个项目:

PageAbility基本概念

 

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"
            ]
          }
        ],

如图:

PageAbility基本概念

 

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

PageAbility基本概念

 

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

PageAbility基本概念

 

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

PageAbility基本概念

 

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

PageAbility基本概念

 

然后填入Ability的信息:

PageAbility基本概念

 

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

PageAbility基本概念

 



Tags:PageAbility   点击:()  评论:()
声明:本站部分内容及图片来自互联网,转载是出于传递更多信息之目的,内容观点仅代表作者本人,如有任何标注错误或版权侵犯请与我们联系(Email:2595517585@qq.com),我们将及时更正、删除,谢谢。
▌相关推荐
Page模板(以下简称“Page”)是FA唯一支持的模板,用于提供与用户交互的能力。一个Page可以由一个或多个AbilitySlice构成,AbilitySlice是指应用的单个页面及其控制逻辑的总和。...【详细内容】
2021-08-04  Tags: PageAbility  点击:(92)  评论:(0)  加入收藏
▌简易百科推荐
摘 要 (OF作品展示)OF之前介绍了用python实现数据可视化、数据分析及一些小项目,但基本都是后端的知识。想要做一个好看的可视化大屏,我们还要学一些前端的知识(vue),网上有很多比...【详细内容】
2021-12-27  项目与数据管理    Tags:Vue   点击:(1)  评论:(0)  加入收藏
程序是如何被执行的&emsp;&emsp;程序是如何被执行的?许多开发者可能也没法回答这个问题,大多数人更注重的是如何编写程序,却不会太注意编写好的程序是如何被运行,这并不是一个好...【详细内容】
2021-12-23  IT学习日记    Tags:程序   点击:(9)  评论:(0)  加入收藏
阅读收获✔️1. 了解单点登录实现原理✔️2. 掌握快速使用xxl-sso接入单点登录功能一、早期的多系统登录解决方案 单系统登录解决方案的核心是cookie,cookie携带会话id在浏览器...【详细内容】
2021-12-23  程序yuan    Tags:单点登录(   点击:(8)  评论:(0)  加入收藏
下载Eclipse RCP IDE如果你电脑上还没有安装Eclipse,那么请到这里下载对应版本的软件进行安装。具体的安装步骤就不在这赘述了。创建第一个标准Eclipse RCP应用(总共分为六步)1...【详细内容】
2021-12-22  阿福ChrisYuan    Tags:RCP应用   点击:(7)  评论:(0)  加入收藏
今天想简单聊一聊 Token 的 Value Capture,就是币的价值问题。首先说明啊,这个话题包含的内容非常之光,Token 的经济学设计也可以包含诸多问题,所以几乎不可能把这个问题说的清...【详细内容】
2021-12-21  唐少华TSH    Tags:Token   点击:(9)  评论:(0)  加入收藏
实现效果:假如有10条数据,分组展示,默认在当前页面展示4个,点击换一批,从第5个开始继续展示,到最后一组,再重新返回到第一组 data() { return { qList: [], //处理后...【详细内容】
2021-12-17  Mason程    Tags:VUE   点击:(14)  评论:(0)  加入收藏
什么是性能调优?(what) 为什么需要性能调优?(why) 什么时候需要性能调优?(when) 什么地方需要性能调优?(where) 什么时候来进行性能调优?(who) 怎么样进行性能调优?(How) 硬件配...【详细内容】
2021-12-16  软件测试小p    Tags:性能调优   点击:(19)  评论:(0)  加入收藏
Tasker 是一款适用于 Android 设备的高级自动化应用,它可以通过脚本让重复性的操作自动运行,提高效率。 不知道从哪里听说的抖音 app 会导致 OLED 屏幕烧屏。于是就现学现卖,自...【详细内容】
2021-12-15  ITBang    Tags:抖音防烧屏   点击:(23)  评论:(0)  加入收藏
11 月 23 日,Rust Moderation Team(审核团队)在 GitHub 上发布了辞职公告,即刻生效。根据公告,审核团队集体辞职是为了抗议 Rust 核心团队(Core team)在执行社区行为准则和标准上...【详细内容】
2021-12-15  InfoQ    Tags:Rust   点击:(24)  评论:(0)  加入收藏
一个项目的大部分API,测试用例在参数和参数值等信息会有很多相似的地方。我们可以复制API,复制用例来快速生成,然后做细微调整既可以满足我们的测试需求1.复制API:在菜单发布单...【详细内容】
2021-12-14  AutoMeter    Tags:AutoMeter   点击:(20)  评论:(0)  加入收藏
相关文章
    无相关信息
最新更新
栏目热门
栏目头条