Page Ability基本概述

2020-10-18  本文已影响0人  裴云飞

Page与AbilitySlice

Page 模板(以下简称“Page”)是 FA 唯一支持的模板,用于提供与用户交互的能力。一个 Page 可以由一个或多个 AbilitySlice 构成,AbilitySlice 是指应用的单个页面及其控制逻辑的总和。
当一个 Page 由多个 AbilitySlice 共同构成时,这些 AbilitySlice 页面提供的业务能力应具有高度相关性。例如,新闻浏览功能可以通过一个 Page 来实现,其中包含了两个 AbilitySlice:一个 AbilitySlice 用于展示新闻列表,另一个 AbilitySlice 用于展示新闻详情。Page 和 AbilitySlice 的关系。Page与AbilitySlice的关系类似于安卓的Activity和Fragment的关系。鸿蒙系统支持不同 Page 之间的跳转,并可以指定跳转到目标 Page 中某个具体的 AbilitySlice。

Page 与 AbilitySlice

AbilitySlice 路由配置

虽然一个 Page 可以包含多个 AbilitySlice,但是 Page 进入前台时界面默认只展示一个 AbilitySlice。默认展示的 AbilitySlice 是通过setMainRoute()方法来指定的。如果需要更改默认展示的 AbilitySlice,可以通过addActionRoute()方法为此 AbilitySlice 配置一条路由规则。此时,当其他 Page 实例期望导航到此 AbilitySlice 时,可以在Intent中指定Action,
setMainRoute() 方法与 addActionRoute() 方法的使用示例如下:

public class MyAbility extends Ability {
    @Override
    public void onStart(Intent intent) {
        super.onStart(intent);
        // set the main route
        setMainRoute(MainSlice.class.getName());
        // set the action route
        addActionRoute("action.news.list", NewsListSlice.class.getName());
        addActionRoute("action.news.detail", NewsDetailSlice.class.getName());
    }
}

addActionRoute() 方法中使用的动作命名,需要在应用配置文件(config.json)中注册:

{
    "module": {
        "abilities": [
            {
                "skills":[
                    {
                        "actions":[
                            "action.news.list",
                            "action.news.detail"
                        ]
                    }
                ]
                ...
            }
        ]
        ...
    }
    ...
}

AbilitySlice间导航

同一Page内导航

当发起导航的 AbilitySlice 和导航目标的 AbilitySlice 处于同一个 Page 时,您可以通过 present() 方法实现导航。如下代码片段展示通过点击按钮导航到其他 AbilitySlice 的方法:

@Override
protected void onStart(Intent intent) {
    ...
    Button button = ...;
    button.setClickedListener(listener -> present(new TargetSlice(), new Intent()));
    ...
}

如果开发者希望在用户从导航目标 AbilitySlice 返回时,能够获得其返回结果,则应当使用 presentForResult() 实现导航。用户从导航目标 AbilitySlice 返回时,系统将回调 onResult() 来接收和处理返回结果,开发者需要重写该方法。返回结果由导航目标 AbilitySlice 在其生命周期内通过 setResult() 进行设置。

@Override
protected void onStart(Intent intent) {
    ...
    Button button = ...;
    button.setClickedListener(listener -> presentForResult(new TargetSlice(), new Intent(), 0));
    ...
}
@Override
protected void onResult(int requestCode, Intent resultIntent) {
    if (requestCode == 0) {
        // Process resultIntent here.
    }
}

系统为每个 Page 维护了一个 AbilitySlice 实例的栈,每个进入前台的 AbilitySlice 实例均会入栈。当开发者在调用 present( )或 presentForResult() 时指定的 AbilitySlice 实例已经在栈中存在时,则栈中位于此实例之上的 AbilitySlice 均会出栈并终止其生命周期(跟安卓的singleTask启动模式类似)。前面的示例代码中,导航时指定的 AbilitySlice 实例均是新建的,即便重复执行此代码(此时作为导航目标的这些实例是同一个类),也不会导致任何 AbilitySlice 出栈。

不同 Page 间导航

使用Intent跳转,后续会详细介绍Intent,鸿蒙系统的Intent跟安卓的Intent是一样的,同样有显示Intent和隐式Intent

Intent intent = new Intent();
Operation operation = new Intent.OperationBuilder()
             .withDeviceId("")
             .withBundleName("com.example.harmonyfirstapp")
             .withAbilityName("com.example.harmonyfirstapp.SecondAbility")
              .build();
 intent.setOperation(operation);
 // 使用intent跳转到第二个页面
 startAbility(intent);
上一篇 下一篇

猜你喜欢

热点阅读