鸿蒙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既支持 ...
最新文章
- 【php】windows安装PHP5.5+Apache2.4
- slf4j 使用方法---个人总结
- 用apksigner进行批量签名的脚本
- Spring 国际化 MessageSource
- Git清除用户名和密码
- xml格式的word转为标准格式_保持的怎么保证Word格式不变?4个技巧需要带走
- MDI格式文件的打开与转换(pdf)
- h5 监听安卓物理返回键
- csgo举报机器人怎么安排_求一个CSGO的举报和点赞用的机器人
- Java桌面截图程序(带快捷键)
- 加菲猫语录精选74 中英俄三语版
- 2019云计算机峰会,计算机学院师生参加“2019华为云城市峰会”
- 第五章 资本主义发展的历史进程
- Spring 微服务实战
- 机器学习系列(8)_回归算法,支持向量机
- 能被3,4,5等数整除的数的特征
- 如何立即关闭 Node 服务器?
- Python:实现aliquot sum等分求和算法(附完整源码)
- 通用 zkSNARK
- 成长日记1.1.0_S
热门文章
- 中文字体的英文名称对照表
- Invert a Binary Tree
- 联想宣布29亿美元收购摩托罗拉移动
- 知识点:什么是硬分叉和软分叉
- kiel实现c语言编程,单片机实验1(Kiel-软件的使用和C程序调试)教学文案(18页)-原创力文档...
- 检测到系统程序出现问题(System program problem detected)?已解决!
- Android--- 筛选框需求(1)房产类APP条件筛选框,包含区域(单选,多选),竖着排列(单选,多选),横向排列(单选,多选)
- 博弈——悼念512汶川大地震遇难同胞——选拔志愿者(巴什博弈)
- python投掷骰子实验报告_用Python来掷个色子玩~
- c语言字符串碱基互补配对,碱基互补配对原则