Android中数据的传递以及对象序列化
Android中当两个Activity需要有信息交互的时候,可以使用Intent。具体来说:
发送单一类型数据:
发送方:
String data = "Hello SecondActivity";
Intent intent = new Intent(FirstActivity.this, SecondActivity.class);
intent.putExtra("extra_data", data);
startActivity(intent); #在onClick中调用
接收方:
Intent intent = getIntent();
String data = intent.getStringExtra("extra_data");#可以在onCreate中读取
除了putExtra("key", value)/getStringExtra("key")之外, 根据传递的value的类型还有很多对,比如:
putExtra("key", intvalue)/getintExtra("key")
putExtra("key", floatvalue)/getfloatExtra("key")
putExtra("key", doublevalue)/getDoubleExtra("key")
putExtra("key", bundlevalue)/getBundleExtra("key")
...
发送多种数据类型的组合:
也可以用Bundle把很多数据类型(包括嵌套Bundle)放到Bundle中一并发送:
//sender
Bundle b = new Bundle();
b.putInt("age", 2);
b.putString("data", "hello");
intent.putExtras(b);
startActivity(intent);
//receiver
Intent i = getIntent();
Bundle b = i.getExtras();
int age = b.getInt("age");
String data = b.getString("data");
发送类对象:
只有实现了Serializable或者Parcelable接口的类对象才可以实现序列化并可以通过Intent和Binder传递。
方法1:Serializable
Serializable是Java提供的序列化方法,优点是使用简单,一切由系统负责;缺点是速度稍慢。
public class User implements Serializable{
private String name;
private Integer age;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Integer getAge() {
return age;
}
public void setAge(Integer age) {
this.age = age;
}
public User(String name, Integer age){
this.name = name;
this.age = age;
}
}
//sender
intent.putExtra("user", (Serializable) new User("JM", 30));
//Receiver Intent i = getIntent(); User user = (User) i.getSerializableExtra("user"); textView.setText(String.format("name: %s, age: %s", user.getName(), user.getAge()));
注:声明一个类为Serilizable时,可以一起指定serialVersionUID变量,类型为private static final long。
这个变量的主要作用是保证类可以被正常序列化,比如当前类和序列化的类发生了某些变化,比如成员变量的数量,类型可能发生了改变,这个时候是无法正常反序列化的,会报如下错误,程序会Crash:
Main; local class incompatible: stream classdesc serialVersionUID = ********
方法2:Parcelable
public class User implements Parcelable{
private String name;
private Integer age;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Integer getAge() {
return age;
}
public void setAge(Integer age) {
this.age = age;
}
public User(String name, Integer age){
this.name = name;
this.age = age;
}
@Override
public int describeContents() {
return 0;
}
@Override
public void writeToParcel(Parcel parcel, int i) {
//write all the fields that want to send
parcel.writeString(getName());
parcel.writeInt(getAge());
}
public static final Creator<User> CREATOR = new Creator<User>() {
@Override
public User createFromParcel(Parcel parcel) {
return new User(parcel.readString(), parcel.readInt());
}
@Override
public User[] newArray(int i) {
return new User[i];
}
};
}
//Sender
intent.putExtra("user", (Parcelable) new User("JM", 30));
startActivity(intent);
//Receiver
User user = (User) i.getParcelableExtra("user");
textView.setText(String.format("name: %s, age: %s", user.getName(), user.getAge()));
如果在User中有多个同类型字段,比如String,可以用Bundle来实现:
@Override
public void writeToParcel(Parcel parcel, int i) {
//write all the fields that want to send
// parcel.writeString(getName());
// parcel.writeInt(getAge());
Bundle b = new Bundle();
b.putString("name", getName());
b.putInt("age", getAge());
parcel.writeBundle(b);
} public static final Creator<User> CREATOR = new Creator<User>() {
@Override
public User createFromParcel(Parcel parcel) {
// return new User(parcel.readString(), parcel.readInt());
Bundle b = parcel.readBundle();
return new User(b.getString("name"), b.getInt("age"));
} @Override
public User[] newArray(int i) {
return new User[i];
}
};
系统中很多类是实现了Parcelble接口的类,他们都是可以直接序列化的,比如Intent、Bundle、Bitmpa的呢个,同时List和Map也可以序列化,前提是他们里面的每个元素都是可序列化的。
Serializable是Java中的序列化接口,使用起来简单但是开销大,序列化和反序列化需要大量的I/O操作。而Parcelable是Android的序列化方式,因此更适合Android平台,缺点是使用稍微麻烦,但是效率高。
Parcelable主要用于内存序列化。Serialzable主要用于序列化到存储设备或者序列化后通过网络传输。
从别的Activity得到返回结果:
启动端:
startActivityForResult(intent, 0);
0表示请求码,说明此次请求的意图是什么。
接收端:
Intent i = new Intent();
i.putExtra("data", editText.getText().toString());
setResult(RESULT_OK, i);
finish();
Android中数据的传递以及对象序列化的更多相关文章
- Xamarin Android 中Acitvity如何传递数据
在xamarin android的开发中,activity传递数据非常常见,下面我也来记一下在android中activity之间传递数据的几种方式, Xamarin Android中Activity ...
- Android笔记——Android中数据的存储方式(二)
我们在实际开发中,有的时候需要储存或者备份比较复杂的数据.这些数据的特点是,内容多.结构大,比如短信备份等.我们知道SharedPreferences和Files(文本文件)储存这种数据会非常的没有效 ...
- Android中数据存储(三)——SQLite数据库存储数据
当一个应用程序在Android中安装后,我们在使用应用的过程中会产生很多的数据,应用都有自己的数据,那么我们应该如何存储数据呢? 数据存储方式 Android 的数据存储有5种方式: 1. Share ...
- Android中数据存储(一)
国庆没有给国家添堵,没有勾搭妹子,乖乖的写着自己的博客..... 本文将为大家介绍Android中数据存储的五种方式,数据存储可是非常重要的知识哦. 一,文件存储数据 ①在ROM存储数据 关于在ROM ...
- Android笔记——Android中数据的存储方式(一)
Android中数据的存储方式 对于开发平台来讲,如果对数据的存储有良好的支持,那么对应用程序的开发将会有很大的促进作用. 总体的来讲,数据存储方式有三种:一个是文件,一个是数据库,另一个则是网络.其 ...
- android中的事件传递和处理机制
一直以来,都被android中的事件传递和处理机制深深的困扰!今天特意来好好的探讨一下.现在的感觉是,只要你理解到位,其实事件的 传递和处理机制并没有想象中的那么难.总之,不要自己打击自己,要相信自己 ...
- android中数据存储
android中数据存储 Android 中存储数据的方式有五种:SQLite数据库.文件存储.内容提供者.网络.SharedPreferences(Key----value)五种存储方式. ...
- Android中数据存储(四)——ContentProvider存储数据
目录(?)[+] 当一个应用程序在Android中安装后,我们在使用应用的过程中会产生很多的数据,应用都有自己的数据,那么我们应该如何存储数据呢? 数据存储方式 Android 的数据存储有5种方 ...
- C#在WinForm中使用WebKit传递js对象实现与网页交互的方法
这篇文章主要介绍了C#在WinForm中使用WebKit传递js对象实现与网页交互的方法,涉及针对WebBroswer控件及WebKit控件的相关使用技巧,需要的朋友可以参考下 本文实例讲述了C#在W ...
随机推荐
- requirejs加载css样式表
1. 在 https://github.com/guybedford/require-css 下载到require-css包 2. 把css.js或者css.min.js复制到项目的js目录下 3. ...
- img的空白符
在div里面嵌套了一个img出来问题,div的高度超过了img的高度,大约3px ,查看了样式没什么问题,后来百度了一下,找到了2种的方法都有效: 第一种:img{display:block} 第二种 ...
- Linux C相关基础
系统求助 man 函数名 man 2 函数名 - 表示函数是系统调用函数 man 3 函数名 - 表示函数是C的库函数 eg:man fread man 2 w ...
- org.dbunit.database.ambiguoustablenameexception
对于一个数据库下面多个shema的情况,如果使用DBUNIT配置会出现,上面的错误,不清楚的表名,解决如下 增加红色的shema指定 参考:http://stackoverflow.com/quest ...
- log4j PatternLayout 输出解析
以下是PatternLayout.class源码的文档介绍: A flexible layout configurable with pattern string. This code is know ...
- Deep Learning 22:总结一些deep learning的基本知识
1.交叉熵代价函数 2.正则化方法:L1和L2 regularization.数据集扩增.dropout 3. 数据预处理 4.机器学习算法中如何选取超参数:学习速率.正则项系数.minibatch ...
- SQL Server Reporting Service(SSRS) 第二篇 SSRS数据分组Parent Group
SQL Server Reporting Service(SSRS) 第一篇 我的第一个SSRS例子默认使用Table进行简单的数据显示,有时为了进行更加直观的数据显示,我们需要按照某个字段对列表进行 ...
- iOS使用Security.framework进行RSA 加密解密签名和验证签名
iOS 上 Security.framework为我们提供了安全方面相关的api: Security框架提供的RSA在iOS上使用的一些小结 支持的RSA keySize 大小有:512,768,10 ...
- Forward和Redirect的区别
一:间接请求转发(Redirect) 二:直接请求转发(Forward) 用户向服务器发送了一次HTTP请求,该请求可能会经过多个信息资源处理以后才返回给用户,各个信息资源使用请求转发机制相互转发请求 ...
- 用excel做分组散点图
散点图主要观察两组变量间的趋势和分布,如果变量多于两组,仍旧使用散点图的话,那所有点都会集中在同一显示区域内,使人无法准确判断,此时一般使用散点图矩阵进行两两比较.除此之外,如果并不关心组与组之间的关 ...