鸿蒙ability怎么理解,鸿蒙中的Ability之间或者进程间数据传递之对象(Sequenceable序列化)...
这两天51cto上的一个粉丝朋友问了我一个问题,Ability之间使用Sequenceable序列化传递数据,如何传递Uri类型数据?网上确实也没有介绍这个使用的demo,为了帮他解决问题,自己帮他写了一个demo,顺手发布一篇博客和源代码。
seralizable是在java api中的类,用它也可以实现序列化,而在android中也有一个类使对象序列化,那就是parcelable,而在HarmonyOS中用Sequenceable来进行序列化。
那么它们之间有什么区别呢?
seralizable:序列化到本地,是一个持久化的操作,效率慢一点
parcelable:只存在于内存,程序结束,序列化后的对象就不存在了。效率快一点
Sequenceable:等同parcelable在Android中的作用。
下面我编写两个AbilitySlice之间互相跳转来传递数据
MainAbilitySlice对应的布局文件代码如下:
xmlns:ohos="http://schemas.huawei.com/res/ohos"
ohos:height="match_parent"
ohos:width="match_parent"
ohos:orientation="vertical">
ohos:id="$+id:text_helloworld"
ohos:height="match_content"
ohos:width="match_content"
ohos:background_element="$graphic:background_ability_main"
ohos:layout_alignment="horizontal_center"
ohos:text="Hello World"
ohos:text_size="50"
/>
就是系统自动生成的helloworld,我偷懒就没修改了,核心不在这里。
再创建一个TestSlice,布局代码如下:
xmlns:ohos="http://schemas.huawei.com/res/ohos"
ohos:height="match_parent"
ohos:width="match_parent"
ohos:orientation="vertical">
ohos:id="$+id:text_helloworld"
ohos:height="match_content"
ohos:width="match_content"
ohos:background_element="$graphic:background_ability_main"
ohos:layout_alignment="horizontal_center"
ohos:text="TEST"
ohos:text_size="50"
/>
为了要在两个Slice中间传递一个序列化对象数据,需要先创建一个实体类,并且实现Sequenceable接口,这里才是整个的核心代码,如下:
package com.xdw.sequencedemo;
import ohos.utils.Parcel;
import ohos.utils.Sequenceable;
import ohos.utils.net.Uri;
/**
* Created by夏德旺on2021/2/26 10:39
*/
publicclass Student implements Sequenceable {
private intnumber;
private String name;
private Uri uri;
publicStudent() {
}
publicStudent(intnumber, Stringname, Uri uri) {
this.number = number;
this.name=name;
this.uri = uri;
}
publicintgetNumber() {
returnnumber;
}
publicvoid setNumber(intnumber) {
this.number = number;
}
publicString getName() {
returnname;
}
publicvoid setName(Stringname) {
this.name=name;
}
publicUri getUri() {
returnuri;
}
publicvoid setUri(Uri uri) {
this.uri = uri;
}
//上面是传统的实体类的构造函数和getter、setter
//下面是序列化的核心
//向包裹中写入数据,包裹可以理解为一块内存区
publicboolean marshalling(Parcelout) {
out.writeSequenceable(uri); //注意Uri类型的写法和普通数据类型有所不同
returnout.writeInt(number) &&out.writeString(name);
}
//从包裹中读取数据
publicboolean unmarshalling(Parcelin) {
this.number = in.readInt();
this.name=in.readString();
returnin.readSequenceable(uri); //注意Uri类型的写法和普通数据类型有所不同
}
//序列化对象的内部构造器,必须实现
publicstaticfinal Sequenceable.Producer
PRODUCER = new Sequenceable.Producer
() {
publicStudent createFromParcel(Parcelin) { //从包裹中获取数据构造对象
// Initialize an instance first,thendo customized unmarshlling.
Student instance = new Student();
instance.unmarshalling(in);
returninstance;
} //必须实现Producer
};
}
下面编写MainAbilitySlice的代码,给Text控件添加一个点击事件来跳转页面并且传递一个student参数
package com.xdw.sequencedemo.slice;
import com.xdw.sequencedemo.ResourceTable;
import com.xdw.sequencedemo.Student;
import ohos.aafwk.ability.AbilitySlice;
import ohos.aafwk.content.Intent;
import ohos.agp.components.Component;
import ohos.agp.components.Text;
import ohos.agp.window.dialog.ToastDialog;
import ohos.utils.net.Uri;
publicclass MainAbilitySlice extends AbilitySlice {
private Text text;
@Override
publicvoid onStart(Intent intent) {
super.onStart(intent);
super.setUIContent(ResourceTable.Layout_ability_main);
text = (Text)findComponentById(ResourceTable.Id_text_helloworld);
text.setClickedListener(new Component.ClickedListener() {
@Override
publicvoid onClick(Component component) {
Intent intent1 = new Intent();
Student student = new Student();
student.setNumber(1);
student.setName("夏德旺");
Uri uri = Uri.parse("http://www.xiadewang.com:8080/login?username=xdw&password=123");
String scheme = uri.getScheme();
//new ToastDialog(getContext()).setText("scheme="+scheme).show();
student.setUri(uri);
intent1.setParam("student",student);
present(new TestSlice(),intent1);
}
});
}
@Override
publicvoid onActive() {
super.onActive();
}
@Override
publicvoid onForeground(Intent intent) {
super.onForeground(intent);
}
}
编写TestSlice的代码接收传递过来的student参数,并且通过toast展示
package com.xdw.sequencedemo.slice;
import com.xdw.sequencedemo.ResourceTable;
import com.xdw.sequencedemo.Student;
import ohos.aafwk.ability.AbilitySlice;
import ohos.aafwk.content.Intent;
import ohos.agp.window.dialog.ToastDialog;
import ohos.utils.net.Uri;
/**
* Created by夏德旺on2021/2/26 10:39
*/
publicclass TestSlice extends AbilitySlice {
@Override
protected void onStart(Intent intent) {
super.onStart(intent);
super.setUIContent(ResourceTable.Layout_slice_test);
if(intent!=null){
Student student = intent.getSequenceableParam("student");
String name= student.getName();
Uri uri = student.getUri();
//new ToastDialog(getContext()).setText("name="+name).show();
new ToastDialog(getContext()).setText("scheme="+uri.getScheme()).show();
}
}
@Override
protected void onActive() {
super.onActive();
}
@Override
protected void onForeground(Intent intent) {
super.onForeground(intent);
}
}
到此,代码编写完成,下面是运行测试图:
这里也顺便完美解决了之前51cto上的粉丝朋友问我的Sequenceable对象无法读取Uri数据的问题。
【编辑推荐】
【责任编辑:jianghua TEL:(010)68476606】
点赞 0
鸿蒙ability怎么理解,鸿蒙中的Ability之间或者进程间数据传递之对象(Sequenceable序列化)...相关推荐
- MFC:通过代码简单理解进程间的通讯机制——共享内存
下面用共享映射文件的方式实现进程间通信,代码可以运行. 一.浅理解 每个进程有自己独立的空间,一个进程无法访问其他进程的数据.就好像两个是互不干涉的个体,想让它们进行通信(交换数据),就必须有一段它们 ...
- (1.1)HarmonyOS鸿蒙中Ability概念及意义
1.简单理解:在鸿蒙中,可以简单理解为,打开APP后一个页面为一个Ability,而一个页面里面又有很多子页面(切片.片段)为AbilitySlice. 2.意义 一个Ability对应一个Hap包, ...
- 鸿蒙Ability(一):Feature Ability的Page Ability模板
鸿蒙Ability 导语 Ability概念 Feature Ability Page与AbilitySlice 在Page Ability中用代码编写界面 生命周期 Page Ability生命周期 ...
- 【鸿蒙 HarmonyOS】界面跳转 ( Page Ability 的 action 标识 | Page Ability 之间的界面跳转及传递数据 | 鸿蒙工程下创建 Module | 代码示例 )
文章目录 一.Page Ability 的 action 标识 二.Page Ability 之间的界面跳转及传递数据 三.鸿蒙工程下创建 Module 四.代码示例 五.执行效果 参考文档 : Pa ...
- 【鸿蒙 HarmonyOS】Ability 简介 ( 简介 | 创建应用 | Page Ability 生命周期 )
文章目录 一.Ability 简介 二.创建应用 三.Page Ability 生命周期 参考文档 : Page Ability 基本概念 Page Ability 声明周期 AbilitySlice ...
- 鸿蒙系统-手机-JS FA(Feature Ability)调用Java PA(Particle Ability)
鸿蒙系统-手机-JS FA(Feature Ability)调用Java PA(Particle Ability) 官方文档:https://developer.harmonyos.com/cn/do ...
- 鸿蒙HarmonyOS 方舟框架ArkUI eTS在一个ability下创建了很多page发现不能到达
鸿蒙HarmonyOS 方舟框架ArkUI eTS在一个ability下创建了很多page发现不能到达 提示:写完文章后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 鸿蒙HarmonyO ...
- 互联网晚报 | 9月15日 星期三 | iPhone 13正式发布;天猫双11正式启动商家报名;华为推出鸿蒙矿山操作系统“矿鸿”...
今日看点 ✦ 天猫双11发布10项商家扶持举措,9月15日正式启动商家报名 ✦ 华为宣布推出鸿蒙矿山操作系统"矿鸿",HarmonyOS正式走向B端 ✦ 超4万平米.20万件商品, ...
- 理解进程调度时机跟踪分析进程调度与进程切换的过程
虞啸川 + 原创作品转载请注明出处 + <Linux内核分析>MOOC课程http://mooc.study.163.com/course/USTC-1000029000 Linux既支持 ...
最新文章
- XMPP个人信息展示
- 【NOIP2010】【P1317】乌龟棋
- IntelliJ IDEA 中配置、使用 SVN
- Android 使用webview遇到的问题及解决办法
- python相等的表达式_02-python-运算符与表达式
- 1130: 零起点学算法37——求阶乘
- python和java哪个更有前途_Java和Python现在都很热门,哪个更有前途?
- JLink重刷固件(win7/win8/win10亲测可用)
- Miracle密码算法开源库(十二)分析 :mrflsh3.c
- 【LeetCode】第289场单周赛 --- 用中等题来骗来偷袭我这个老同志?
- libvirt live migration 流程
- 归因分析:淘宝直播数据助理及其价值研究
- 一文看尽CES Asia:大变革下的汽车与全面AI化的智能家居
- android开发者mac(含M1芯片)电脑全新配置2022
- 《数据结构》实验报告(一)——顺序表存储结构及实现
- hdu 5454 Excited Database(线段树)
- 利用 sqlplus spool 实现oracle 导出 csv 文件
- 采用Tagged Pointer的字符串
- WdatePicker日历控件参数配置大全
- Linux操作系统相关资料