作者:韩茹
公司:程序咖(北京)科技有限公司
鸿蒙巴士专栏作家
一、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 {
@Override
public void onStart(Intent intent) {super.onStart(intent);
// 设置默认显示的 AbilitySlice
super.setMainRoute(MainAbilitySlice.class.getName());
}
}
显示对应的 ability_main.xml 布局:
当初咱们在 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());
}
}
而后运行这个我的项目:
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
默认启动一个 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:
最初,咱们要在 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 文件,超爽的:
更多内容:
1、社区:鸿蒙巴士 https://www.harmonybus.net/
2、公众号:HarmonyBus
3、技术交换 QQ 群:714518656
4、视频课:https://www.chengxuka.com