• 【鸿蒙应用开发系列】- 打开页面与页面间数据交互


    鸿蒙系统中,有两种方式可以启动一个页面,分别是 startAbility、startAbilityForResult, startAbilityForResult相对于startAbility,增加了页面关闭后返回的结果回传功能,那我们应该怎么使用、

    这两个方法达到一个开启新页面以及参数传递的功能呢,比如A页面,拉起B页面,传递一个字符串数据 “您好,这条消息来自A”,

    1、跳转页面并传参

    具体如下:

    1. public static extends Ability> void launchAbility(Ability context, Class abilityClass,
    2. IntentParams params) {
    3. Intent intent = new Intent();
    4. // 指定待启动FA的bundleName和abilityName
    5. Operation operation = new Intent.OperationBuilder()
    6. .withBundleName(context.getBundleName())
    7. .withAbilityName(abilityClass.getCanonicalName())
    8. .build();
    9. intent.setOperation(operation);
    10. if (params != null) {
    11. intent.setParams(params);
    12. }
    13.   context.startAbility(intent);
    14. }

    我们先定义一个launchAbility的方法,入参 Ability 是A页面的实例,也就是上下文环境,abilityClass是B页面的类,params是要传递的参数对象。

    那我们应该怎么使用呢,参数对象怎么构建呢,接着往下看。

    1. IntentParams intentParams = new IntentParams();
    2. intentParams.setParam("key_msg", "这条消息来自A");
    3. launchAbility(getAbility(), BAbility.class, intentParams);


    那打开了B页面后,怎么获取参数呢,具体方式如下:通过在A页面内调用launchAbility方法,就可以跳转到B页面,IntentParams 对象,是鸿蒙系统用来页面传递参数的对象,这里当做Map对待即可,通过KEY_VALUE的方式传递数据。

    1. @Override
    2. protected void onStart(Intent intent) {
    3. super.onStart(intent);
    4. String msgStr = intent.getStringParam("key_msg");
    5. }

    在B页面的onStart中,通过intent.getStringParam可以获取到这个传递的字符串数据,如果要获取其他类型的数据,intent还提供了如下方法获取数据:

     

    那如果我们从B页面返回到A页面,需要将某些数据回传给A页面,我们应该怎么实现呢? 接着往下看

    2、返回页面并获取回传数据

    如果启动页面B的时候,是使用的startAbility的方式,则无法回传数据给A页面,这个时候需要使用startAbilityForResult方法,

    1. public static extends Ability> void launchAbilityForResult(Ability context, Class abilityClass,
    2. IntentParams params, int requestCode) {
    3. Intent intent = new Intent();
    4. // 指定待启动FA的bundleName和abilityName.
    5. Operation operation = new Intent.OperationBuilder()
    6. .withBundleName(context.getBundleName())
    7. .withAbilityName(abilityClass.getCanonicalName())
    8. .build();
    9. intent.setOperation(operation);
    10. if (params != null) {
    11. intent.setParams(params);
    12. }
    13. context.startAbilityForResult(intent, requestCode);
    14. }


    这里多了一个参数,requestCode,这个参数的作用是当返回页面的时候,A页面区分数据请求来源的依据,当然也可以在B页面中判断拉起B页面的来源依据。

    1. IntentParams intentParams = new IntentParams();
    2. intentParams.setParam("key_msg", "这条消息来自A");
    3. launchAbilityForResult(getAbility(), BAbility.class, intentParams,1001);

    通过上述方法拉起B页面后,在B页面就可以设置回传数据,并关闭页面返回A页面了。

    1. Intent intent = new Intent();
    2. IntentParams params = new IntentParams();
    3. params.setParam("key_data", );
    4. intent.setParams(params);
    5. getAbility().setResult(intent);
    6. this.onBackPressed();


    这个时候,返回到A页面了,A页面怎么接收回传的数据呢?在返回A页面之前,通过调用setResult方法,将数据设置到intent中,这样就达到了回传数据的目的。

    1. @Override
    2. protected void onAbilityResult(int requestCode, int resultCode, Intent resultData) {
    3. if (RESULT_OK != resultCode) {
    4. return;
    5. }
    6. if (1001 == requestCode) {
    7. if (resultData.getParams() == null) return;
    8. IntentParams params = resultData.getParams();
    9. Object msg = params.getParam("key_data");
    10. ...
    11. }
    12. }

    在A页面需要重写onAbilityResult进行页面回传数据的获取处理,这里通过requestCode跟resultCode的配合判断,就可以确认来自B页面回传的数据,然后从resultData中取出数据

    即可。

    到此,鸿蒙应用跳转页面的方式以及数据传递的方式就讲解完毕,谢谢阅读!

  • 相关阅读:
    科技云报道:软件供应链安全治理需打好“团体赛”
    虹科分享 | 终端安全防护 | 网络安全术语列表(上篇)
    Linux设置ssh免密登录
    人体分割模型ACE2P与M2FP,解析人脸人体各部件属性,语义化分析
    leetcode 155. Min Stack最小栈(中等)
    二、体验Linux系统(文件目录、shell)
    python实现将图片数据以TFRecord方式存储
    tp6+vue-elementui-admin实现前后端权限分离框架
    LCR 180.文件组合
    Spring Security(一)- SpringSecurity 框架简介
  • 原文地址:https://blog.csdn.net/q919233914/article/details/126721097