探索鸿蒙(HarmonyOS):AbilitySlice间导航和传递参数

官方文档:https://developer.harmonyos.com/cn/docs/documentation/doc-guides/ability-page-switching-0000000000037999

据官方文档记载:

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

具体介绍如下:

一、步骤

1.建立目标AbilitySlice,包括类文件和layout文件。

2.在config.json文件中添加action。

3.在对应的Ability中,使用addActionRounte()方法添加路由。

4.调用present()方法或presentForResult()实现导航。

二、示例说明

工程名:AbilitySliceSample

https://download.csdn.net/download/Tulipsys/20003600

说明:

1.MainAbilitySlice包含两个按钮“Goto Slice 1”和“Goto Slice 2”,点击后分别打开AbilitySliceOne和AbilitySliceTwo。

探索鸿蒙(HarmonyOS):AbilitySlice间导航和传递参数_第1张图片

2.打开AbilitySliceOne只是打开,什么也不做。

探索鸿蒙(HarmonyOS):AbilitySlice间导航和传递参数_第2张图片

3.打开AbilitySliceTwo的时候传递数据,AbilitySliceTwo进行展示并修改。从AbilitySliceTwo返回后,MainAbilitySlice接受修改后的数据并展示。

探索鸿蒙(HarmonyOS):AbilitySlice间导航和传递参数_第3张图片

探索鸿蒙(HarmonyOS):AbilitySlice间导航和传递参数_第4张图片

三、重点部分说明

1. 建立目标AbilitySlice

创建了AbilitySliceOne和AbilitySliceTwo。

2. 在config.json文件中添加action

"actions": [

  "action.system.home",

  "action.slice1",

  "action.slice2"

]

action.slice1、action.slice2分别用于标记指向AbilitySliceOne和AbilitySliceTwo。

3. 使用addActionRounte()方法添加路由

在MainAbility的onStart()中使用使用addActionRounte()方法添加路由:

  1. addActionRoute("action.slice1", AbilitySliceOne.class.getName());
  2. addActionRoute("action.slice2", AbilitySliceTwo.class.getName());

个人理解这一步是把action字符串和AbilitySlice类做关联。

4.实现导航

4.1 不传递参数的导航

点击button1“Goto Slice 1”,打开AbilitySliceOne,不传递参数,一句话就够了:

present(new AbilitySliceOne(), intent);

示例中还加了个Operation,在示例中其实跟上面的一句话效果一样。Operation能干的事挺多的。

Intent intent = new Intent();

Operation operation = new Intent.OperationBuilder()

        .withBundleName(getBundleName())

        .withAbilityName(AbilitySliceOne.class.getName())

        .withAction("action.slice1")

        .build();

intent.setOperation(operation);

present(new AbilitySliceOne(), intent);

4.2 传递参数的导航

点击button2“Goto Slice 2”,打开AbilitySliceTwo,这儿要传递参数。示例中设置了一个Student类,在打开AbilitySliceTwo的时候把Student的Name和Age数据传递给AbilitySliceTwo。

传递参数的原理是把数据放到Intent中,然后把Intent“发送”给目标AbilitySlice。Intent的构成元素包括Operation与Parameters。Intent官方文档:https://developer.harmonyos.com/cn/docs/documentation/doc-guides/ability-intent-0000000000038799

示例中这么写的:

Intent intent = new Intent();

Operation operation = new Intent.OperationBuilder()

        .withBundleName(getBundleName())

        .withAbilityName(AbilitySliceTwo.class.getName())

        .withAction("action.slice2")

        .build();

intent.setOperation(operation);

intent.setParam("name", student.getName());

intent.setParam("age", student.getAge());

presentForResult(new AbilitySliceTwo(), intent, 0);

把数据放到Intent用的就是:

intent.setParam("name", student.getName());

intent.setParam("age", student.getAge());

注意这儿要接收AbilitySliceTwo的返回结果,所以用presentForResult():

presentForResult(new AbilitySliceTwo(), intent, 0);

5.接收返回结果

接收返回结果要做两个事情:

1.目标AbilitySlice要返回结果。示例中,AbilitySliceTwo打开后首先接收数据,然后修改数据并用setResult()返回结果。

返回结果用的还是Intent(Intent是对象之间传递信息的载体):

        Intent resultIntent = new Intent();

        resultIntent.setParam("name", "Will");

        resultIntent.setParam("age", "36");

        setResult(resultIntent);

2.原AbilitySlice接收结果。示例中,MainAbilitySlice导航到AbilitySlice2后等待返回结果,收到后展示到界面。接收数据在onResult()中:

    @Override

    protected void onResult(int requestCode, Intent resultIntent) {

        if (requestCode == 0) {

            student.setName(resultIntent.getStringParam("name"));

            student.setAge(Integer.parseInt(resultIntent.getStringParam("age")));

            nameText.setText("NAME: " + student.getName());

            ageText.setText("AGE: " + String.valueOf(student.getAge()));

        }

    }

你可能感兴趣的:(鸿蒙,移动开发,华为,slice)