在鸿蒙中,Page Ability中可能含有多个Slice页面,其中有一个Slice是主页面(通过super.setMainRoute(TargetPageSlice.class.getName())设置)。Page Ability相当于一个画板,而Slice相当于粘贴到画板上的各幅图画,除了之前所写的同一Page Ability内各个Slice页面之间的导航,开发中还会用到各个Page Ability之间的导航,并涉及到导航到目标Page Ability中的不同Slice页面。根据导航到不同的Slice页面和是否带参数、是否有返回值,经组合可形成8种方式。但只要掌握带参数、有返回值的方法,其它就很简单了。
假设起始Page Ability类为MainAbility,起始页面为MainAbilitySlice,目的Page Ability类为TargetPage,其中含有2个页面,主页面为TargetPageSlice,另一个页面为TargetPageSlice2,先做准备工作,在TargetPage中添加另一个Slice页面:
在新建TargetPage类时,系统已自动在config.json中添加了一个ability,手动在其中添加actions内容:"skills": [ { "actions": [ "action.intent.p2s2" ] } ],在TargetPage类中添加页面action
addActionRoute("action.intent.p2s2",TargetPageSlice.class.getName());
一、导航到目标Page Ability主页面(有参数有返回值)
在MainAbilitySlice的onStart中为按钮添加回调函数代码:Intent it = new Intent();Operation op = new Intent.OperationBuilder() .withDeviceId("") //导航到本机 .withBundleName("com.example.pagenav") //导航到该应用 //导航到目的Page Ability .withAbilityName("com.example.pagenav.TargetPage") .build(); //将上述参数放在operation中it.setOperation(op); //把operation放到intent中it.setParam("p1s","from p1s");//设置导航的参数startAbilityForResult(it,rqcode);//预先定义一个请求码rqcode在TargetPageSlice中获取到参数
String prm = Intent.getStringParam("p1s")在TargetPageSlice中设置返回值,并退出当前ability
Intent it = new Intent();it.setParam("result","p2s1 data");getAbility().setResult(rscode,it);//预先定义类似请求码的rscode,即resultCodeterminateAbility();//退出当前ability,或terminate()退出当前slice;在MainAbilitySlice中重写onAbilityResult方法获取到返回值
@Overrideprotected void onAbilityResult(int requestCode, int resultCode, Intent resultData) { super.onAbilityResult(requestCode, resultCode, resultData); if(resultCode != rscode || resultData == null ) return; String result = resultData.getStringParam("result");}
如果是无参数,则用startAbility(it)替换startAbilityForResult(it,rqcode);
如果是无返回值,则在TargetPageSlice中处理完相关逻辑后直接terminateAbility()或terminate()退出返回。
二、导航到目标Page Ability其它页面
用withAction方法可以导航到事先定义好action(在config.json中定义)的页面上
Intent it = new Intent();Operation op = new Intent.OperationBuilder() .withAction(TargetPage.action) .build();it.setOperation(op);startAbility(it);
withAction也可以导航到系统定义的页面上,如IntentConstants.ACTION_DIAL是拨号页面等。
App的业务逻辑上都会涉及各页面之间的导航,所以掌握各Page Ability以及各Ability Slice之间带参数、有返回值的导航方法就非常重要了。
花粉社群VIP加油站
猜你喜欢