作者:韩茹

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

鸿蒙巴士专栏作家

一、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