官方文档:https://developer.harmonyos.com/cn/docs/documentation/doc-guides/ability-page-switching-0000000000037999
据官方文档记载:
具体介绍如下:
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。
2.打开AbilitySliceOne只是打开,什么也不做。
3.打开AbilitySliceTwo的时候传递数据,AbilitySliceTwo进行展示并修改。从AbilitySliceTwo返回后,MainAbilitySlice接受修改后的数据并展示。
创建了AbilitySliceOne和AbilitySliceTwo。
"actions": [
"action.system.home",
"action.slice1",
"action.slice2"
]
action.slice1、action.slice2分别用于标记指向AbilitySliceOne和AbilitySliceTwo。
在MainAbility的onStart()中使用使用addActionRounte()方法添加路由:
个人理解这一步是把action字符串和AbilitySlice类做关联。
点击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);
点击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);
接收返回结果要做两个事情:
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()));
}
}