当前位置: 首页 > 科技观察

Harmonyos中Abilities之间或进程之间数据传输的对象(Sequenceable序列化)

时间:2023-03-12 09:08:56 科技观察

更多信息请访问:Harmonyos技术社区https://harmonyos.51cto.com,与华为官方共同打造前两天,一个51cto的粉丝朋友问我一个问题。如何使用Sequenceable序列化在Ability之间传输Uri类型数据?网上确实没有demo。为了帮助他解决问题,我写了给他。做了一个demo,发布了博客和源码。serializable是javaapi中的一个类,也可以用来实现序列化,android中也有一个序列化对象的类,是parcelable,HarmonyOS中使用Sequenceable进行序列化。那么它们之间有什么区别呢?serializable:序列化到本地,是持久化操作,效率较慢parcelable:只存在于内存中,程序结束,被序列化的对象不存在。效率更快Sequenceable:相当于Android中parcelable的作用。接下来,我写了两个AbilitySlices相互跳转传输数据。MainAbilitySlice对应的布局文件代码如下:是系统自动生成的helloworld,我没有修改因为我是偷懒了,核心不在这里。使用以下布局代码创建另一个TestSlice:为了在两个Slice之间传递一个序列化的对象数据,需要先创建一个实体类,并实现Sequenceable接口,这里是整个核心代码,如下:2/2610:39*/publicclassStudentimplementsSequenceable{privateintnumber;privateStringname;privateUriuri;publicStudent(){}publicStudent(intnumber,Stringname,Uriuri){this.number=number;this.name=name;this.uri=uri;}publicintgetNumber(){returnnumber;}publicvoidsetNumber(intnumber){this.number=number;}publicStringgetName(){returnname;}publicvoidsetName(Stringname){this.name=name;}publicUrigetUri(){returnuri;}publicvoidsetUri(Uriuri){this.uri=uri;}//上面是传统的实体类构造器和getter,setter//下面是序列化的核心//向包中写入数据,包可以理解为一块内存区域publicbooleanmarshalling(Parcelout){out.writeSequenceable(uri);//注意Uri类型的写法与普通数据类型不同returnout.writeInt(数字)&&输出。writeString(name);}//从包中读取数据publicbooleanunmarshalling(Parcelin){this.number=in.readInt();this.name=in.readString();returnin.readSequenceable(uri);//注意对Uri类型的写法不同于普通数据类型}//序列化对象的内部构造函数必须实现publicstaticfinalSequenceable.ProducerPRODUCER=newSequenceable.Producer(){publicStudentcreateFromParcel(Parcelin){//从中获取数据构造对象package//Initializeaninstancefirst,thendocustomizedunmarshalling.Studentinstance=newStudent();instance.unmarshalling(in);returninstance;}//Producer必须实现};}下面写MainAbilitySlice的代码,给Text控件添加一个点击事件来跳转页面并且传递一个student参数packagecom.xdw.sequencedemo.slice;importcom.xdw.sequencedemo.ResourceTable;importcom.xdw.sequencedemo.Student;importohos.aafwk.ability.AbilitySlice;importohos.aafwk.content.Intent;importohos.agp.components.Component;importohos.agp.components.Text;importohos.agp.window.dialog.ToastDialog;importohos.utils.net.Uri;publicclassMainAbilitySliceextendsAbilitySlice{privateTexttext;@OverridepublicvoidonStart(Intentintent){super.onStart(intent);super.setUIContent(ResourceTable.Layout_ability_main);text=(Text)findComponentById(ResourceTable.Id_text_helloworld);text.setClickedListener(newComponent.ClickedListener(){@OverridepublicvoidonClick(Componentcomponent){Intentintent1=newIntent();Studentstudent=newStudent();student.setNumber(1);student.setName("夏德旺");Uriuri=Uri.parse("http://www.xiadewang.com:8080/login?username=xdw&password=123");Stringscheme=uri.getScheme();//newToastDialog(getContext()).setText("scheme="+scheme).show();student.setUri(uri);intent1.setParam("student",student);present(newTestSlice(),intent1);}});}@OverridepublicvoidonActive(){super.onActive();}@OverridepublicvoidonForeground(Intentintent){super.onForeground(intent);}}编写TestSlice的代码接收传过来的学生参数,并通过toast显示packagecom.xdw.sequencedemo.xwd.com.importsequencedemo.ResourceTable;importcom.xdw.sequencedemo.Student;importohos.aafwk.ability.AbilitySlice;importohos.aafwk.content.Intent;importohos.agp.window.dialog.ToastDialog;importohos.utils.net.Uri;/***Createdby夏德旺on2021/2/2610:39*/publicclassTestSliceextendsAbilitySlice{@OverrideprotectedvoidonStart(Intentintent){super.onStart(intent);super.setUIContent(ResourceTable.Layout_slice_test);if(intent!=null){Studentstudent=intent.getSequenceableParam("student");Stringname=student.getName();Uriuri=student.getUri();//newToastDialog(getContext()).setText("name="+name).show();newToastDialog(getContext()).setText("scheme="+uri.getScheme()).show();}}@OverrideprotectedvoidonActive(){super.onActive();}@OverrideprotectedvoidonForeground(Intentintent){super.onForeground(intent));}}至此,代码就写好了,下面是运行测试图:对了,这也完美解决了51cto上的粉丝朋友问我Sequenceable对象读不到Uri的问题数据。更多信息请访问:与华为官方共建的鸿蒙技术社区https://harmonyos.51cto.com