当前位置:主页 > 查看内容

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

发布时间:2021-05-07 00:00| 位朋友查看

简介:想了解更多内容,请访问: 51CTO和华为官方战略合作共建的鸿蒙技术社区 https://harmonyos.51cto.com 这两天51cto上的一个粉丝朋友问了我一个问题,Ability之间使用Sequenceable序列化传递数据,如何传递Uri类型数据?网上确实也没有介绍这个使用的demo,为了……

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

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

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

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

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

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

下面编写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.  * Created by 夏德旺 on 2021/2/26 10:39 
  12.  */ 
  13. public class TestSlice  extends AbilitySlice { 
  14.     @Override 
  15.     protected void onStart(Intent intent) { 
  16.         super.onStart(intent); 
  17.         super.setUIContent(ResourceTable.Layout_slice_test); 
  18.         if(intent!=null){ 
  19.             Student student = intent.getSequenceableParam("student"); 
  20.             String name = student.getName(); 
  21.             Uri uri = student.getUri(); 
  22.             //new ToastDialog(getContext()).setText("name="+name).show(); 
  23.             new ToastDialog(getContext()).setText("scheme="+uri.getScheme()).show(); 
  24.         } 
  25.     } 
  26.  
  27.     @Override 
  28.     protected void onActive() { 
  29.         super.onActive(); 
  30.     } 
  31.  
  32.     @Override 
  33.     protected void onForeground(Intent intent) { 
  34.         super.onForeground(intent); 
  35.     } 

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

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

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

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

https://harmonyos.51cto.com


本文转载自网络,原文链接:https://harmonyos.51cto.com/#zz
本站部分内容转载于网络,版权归原作者所有,转载之目的在于传播更多优秀技术内容,如有侵权请联系QQ/微信:153890879删除,谢谢!

推荐图文

  • 周排行
  • 月排行
  • 总排行

随机推荐