文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

鸿蒙中的Ability之间或者进程间数据传递之对象(Sequenceable序列化)

2024-12-03 09:59

关注

想了解更多内容,请访问:

51CTO和华为官方合作共建的鸿蒙技术社区

https://harmonyos.51cto.com

这两天51cto上的一个粉丝朋友问了我一个问题,Ability之间使用Sequenceable序列化传递数据,如何传递Uri类型数据?网上确实也没有介绍这个使用的demo,为了帮他解决问题,自己帮他写了一个demo,顺手发布一篇博客和源代码。

seralizable是在java api中的类,用它也可以实现序列化,而在android中也有一个类使对象序列化,那就是parcelable,而在HarmonyOS中用Sequenceable来进行序列化。

那么它们之间有什么区别呢?

seralizable:序列化到本地,是一个持久化的操作,效率慢一点

parcelable:只存在于内存,程序结束,序列化后的对象就不存在了。效率快一点

Sequenceable:等同parcelable在Android中的作用。

下面我编写两个AbilitySlice之间互相跳转来传递数据

MainAbilitySlice对应的布局文件代码如下:

  1. "1.0" encoding="utf-8"?> 
  2.     xmlns:ohos="http://schemas.huawei.com/res/ohos" 
  3.     ohos:height="match_parent" 
  4.     ohos:width="match_parent" 
  5.     ohos:orientation="vertical"
  6.  
  7.     
  8.         ohos:id="$+id:text_helloworld" 
  9.         ohos:height="match_content" 
  10.         ohos:width="match_content" 
  11.         ohos:background_element="$graphic:background_ability_main" 
  12.         ohos:layout_alignment="horizontal_center" 
  13.         ohos:text="Hello World" 
  14.         ohos:text_size="50" 
  15.     /> 
  16.  
  17.  

就是系统自动生成的helloworld,我偷懒就没修改了,核心不在这里。

再创建一个TestSlice,布局代码如下:

  1. "1.0" encoding="utf-8"?> 
  2.     xmlns:ohos="http://schemas.huawei.com/res/ohos" 
  3.     ohos:height="match_parent" 
  4.     ohos:width="match_parent" 
  5.     ohos:orientation="vertical"
  6.  
  7.     
  8.         ohos:id="$+id:text_helloworld" 
  9.         ohos:height="match_content" 
  10.         ohos:width="match_content" 
  11.         ohos:background_element="$graphic:background_ability_main" 
  12.         ohos:layout_alignment="horizontal_center" 
  13.         ohos:text="TEST" 
  14.         ohos:text_size="50" 
  15.     /> 
  16.  
  17.  

为了要在两个Slice中间传递一个序列化对象数据,需要先创建一个实体类,并且实现Sequenceable接口,这里才是整个的核心代码,如下:

  1. package com.xdw.sequencedemo; 
  2.  
  3. import ohos.utils.Parcel; 
  4. import ohos.utils.Sequenceable; 
  5. import ohos.utils.net.Uri; 
  6.  
  7.  
  8. public class Student implements Sequenceable { 
  9.     private int number; 
  10.  
  11.     private String name
  12.  
  13.     private Uri uri; 
  14.  
  15.  
  16.     public Student() { 
  17.     } 
  18.  
  19.     public Student(int number, String name, Uri uri) { 
  20.         this.number = number; 
  21.         this.name = name
  22.         this.uri = uri; 
  23.     } 
  24.  
  25.     public int getNumber() { 
  26.         return number; 
  27.     } 
  28.  
  29.     public void setNumber(int number) { 
  30.         this.number = number; 
  31.     } 
  32.  
  33.     public String getName() { 
  34.         return name
  35.     } 
  36.  
  37.     public void setName(String name) { 
  38.         this.name = name
  39.     } 
  40.  
  41.     public Uri getUri() { 
  42.         return uri; 
  43.     } 
  44.  
  45.     public void setUri(Uri uri) { 
  46.         this.uri = uri; 
  47.     } 
  48.  
  49.     //上面是传统的实体类的构造函数和getter、setter 
  50.     //下面是序列化的核心 
  51.     //向包裹中写入数据,包裹可以理解为一块内存区 
  52.     public boolean marshalling(Parcel out) { 
  53.         out.writeSequenceable(uri); //注意Uri类型的写法和普通数据类型有所不同 
  54.         return out.writeInt(number) && out.writeString(name); 
  55.     } 
  56.  
  57.     //从包裹中读取数据 
  58.     public boolean unmarshalling(Parcel in) { 
  59.         this.number = in.readInt(); 
  60.         this.name = in.readString(); 
  61.         return in.readSequenceable(uri);    //注意Uri类型的写法和普通数据类型有所不同 
  62.     } 
  63.  
  64.     //序列化对象的内部构造器,必须实现 
  65.     public static final Sequenceable.Producer 
  66.             PRODUCER = new Sequenceable.Producer 
  67.             () { 
  68.         public Student createFromParcel(Parcel in) {    //从包裹中获取数据构造对象 
  69.             // Initialize an instance firstthen do customized unmarshlling. 
  70.             Student instance = new Student(); 
  71.             instance.unmarshalling(in); 
  72.             return instance; 
  73.         }   //必须实现Producer 
  74.     }; 

下面编写MainAbilitySlice的代码,给Text控件添加一个点击事件来跳转页面并且传递一个student参数

  1. package com.xdw.sequencedemo.slice; 
  2.  
  3. import com.xdw.sequencedemo.ResourceTable; 
  4. import com.xdw.sequencedemo.Student; 
  5. import ohos.aafwk.ability.AbilitySlice; 
  6. import ohos.aafwk.content.Intent; 
  7. import ohos.agp.components.Component; 
  8. import ohos.agp.components.Text; 
  9. import ohos.agp.window.dialog.ToastDialog; 
  10. import ohos.utils.net.Uri; 
  11.  
  12. public class MainAbilitySlice extends AbilitySlice { 
  13.     private Text text; 
  14.     @Override 
  15.     public void onStart(Intent intent) { 
  16.         super.onStart(intent); 
  17.         super.setUIContent(ResourceTable.Layout_ability_main); 
  18.         text = (Text)findComponentById(ResourceTable.Id_text_helloworld); 
  19.         text.setClickedListener(new Component.ClickedListener() { 
  20.             @Override 
  21.             public void onClick(Component component) { 
  22.                 Intent intent1 = new Intent(); 
  23.                 Student student = new Student(); 
  24.                 student.setNumber(1); 
  25.                 student.setName("夏德旺"); 
  26.                 Uri uri = Uri.parse("http://www.xiadewang.com:8080/login?username=xdw&password=123"); 
  27.                 String scheme = uri.getScheme(); 
  28.                 //new ToastDialog(getContext()).setText("scheme="+scheme).show(); 
  29.                 student.setUri(uri); 
  30.                 intent1.setParam("student",student); 
  31.                 present(new TestSlice(),intent1); 
  32.             } 
  33.         }); 
  34.     } 
  35.  
  36.     @Override 
  37.     public void onActive() { 
  38.         super.onActive(); 
  39.     } 
  40.  
  41.     @Override 
  42.     public void onForeground(Intent intent) { 
  43.         super.onForeground(intent); 
  44.     } 

编写TestSlice的代码接收传递过来的student参数,并且通过toast展示

  1. package com.xdw.sequencedemo.slice; 
  2.  
  3. import com.xdw.sequencedemo.ResourceTable; 
  4. import com.xdw.sequencedemo.Student; 
  5. import ohos.aafwk.ability.AbilitySlice; 
  6. import ohos.aafwk.content.Intent; 
  7. import ohos.agp.window.dialog.ToastDialog; 
  8. import ohos.utils.net.Uri; 
  9.  
  10.  
  11. public class TestSlice  extends AbilitySlice { 
  12.     @Override 
  13.     protected void onStart(Intent intent) { 
  14.         super.onStart(intent); 
  15.         super.setUIContent(ResourceTable.Layout_slice_test); 
  16.         if(intent!=null){ 
  17.             Student student = intent.getSequenceableParam("student"); 
  18.             String name = student.getName(); 
  19.             Uri uri = student.getUri(); 
  20.             //new ToastDialog(getContext()).setText("name="+name).show(); 
  21.             new ToastDialog(getContext()).setText("scheme="+uri.getScheme()).show(); 
  22.         } 
  23.     } 
  24.  
  25.     @Override 
  26.     protected void onActive() { 
  27.         super.onActive(); 
  28.     } 
  29.  
  30.     @Override 
  31.     protected void onForeground(Intent intent) { 
  32.         super.onForeground(intent); 
  33.     } 

到此,代码编写完成,下面是运行测试图:

这里也顺便完美解决了之前51cto上的粉丝朋友问我的Sequenceable对象无法读取Uri数据的问题。

想了解更多内容,请访问:

51CTO和华为官方合作共建的鸿蒙技术社区

https://harmonyos.51cto.com

 

来源:鸿蒙社区内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     813人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     354人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     318人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     435人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     224人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-后端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯