第一行代码-13.2 使用Intent传递对象
来源:互联网 发布:软件测试的基础理论 编辑:程序博客网 时间:2024/06/08 12:01
使用Intent传递一般类型的数据比较简单,只要通过intent.putExtra(key, value)就可以实现,但是怎么传递自定义类型的数据,就需要使用一些技巧了。
1、Serializable方式
Serializable 是序列化的意思,表示将一个对象转换成可存储或可传输的状态。序列化后的对象可以在网络上进行传输,也可以存储到本地。至于序列化的方法也很简单,只需要让一个类去实现Serializable 这个接口就可以了。
下面我们创建Student类,继承Serializable。
public class Student implements Serializable{ private String name; private String number; public void setName(String name) { this.name = name; } public void setNumber(String number) { this.number = number; } public String getName() { return name; } public String getNumber() { return number; }}
然后就可以用Intent.putExtra来插入Student对象了:
mBSecondActivity.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { Intent intent = new Intent(MainActivity.this, SecondActivity.class); Student student = new Student(); student.setName("Curry"); student.setNumber("30"); intent.putExtra("student_data", student); startActivity(intent); }});
然后在SecondActivity中获取这个Student对象:
Student student = (Student) getIntent().getSerializableExtra("student_data");
2、Parcelable方式
和Serializable方式不同在于,Parcelable 方式的实现原理是将一个完整的对象进行分解,而分解后的每一部分都是Intent 所支持的数据类型,这样也就实现传递对象的功能了。但是它的实现过程比较复杂,下面先创建Person类,并继承Parcelable接口。
public class Person implements Parcelable{ private String name; private int age; public void setName(String name) { this.name = name; } public void setAge(int age) { this.age = age; } public String getName() { return name; } public int getAge() { return age; } public static final Creator<Person> CREATOR = new Creator<Person>() { @Override public Person createFromParcel(Parcel in) { Person person = new Person(); person.setName(in.readString()); person.setAge(in.readInt()); return person; } @Override public Person[] newArray(int size) { return new Person[size]; } }; @Override public int describeContents() { return 0; } @Override public void writeToParcel(Parcel dest, int flags) { dest.writeString(name); dest.writeInt(age); }}
Parcelable 的实现方式要稍微复杂一些。可以看到,首先我们让Person 类去实现了Parcelable 接口,这样就必须重写describeContents()和writeToParcel()这两个方法。其中describeContents()方法直接返回0 就可以了,而writeToParcel()方法中我们需要调用Parcel的writeXxx()方法将Person 类中的字段一一写出。注意字符串型数据就调用writeString()方法,整型数据就调用writeInt()方法,以此类推。
除此之外,我们还必须在Person 类中提供一个名为CREATOR 的常量,这里创建了Parcelable.Creator 接口的一个实现,并将泛型指定为Person。接着需要重写createFromParcel()和newArray()这两个方法,在createFromParcel()方法中我们要去读取刚才写出的name 和age字段,并创建一个Person 对象进行返回,其中name 和age 都是调用Parcel 的readXxx()方法读取到的,注意这里读取的顺序一定要和刚才写出的顺序完全相同。而newArray()方法中的实现就简单多了,只需要new 出一个Person 数组,并使用方法中传入的size 作为数组大小就可以了。
在SecondActivity中获取对象的方式差不多,如下:
Person person = (Person) getIntent().getParcelableExtra("person_data");
总结:虽然序列化的方式比较简单,但是由于会将整个对象序列化,所以效率方面会比Parcelable方法低一些。所以在通常情况下还是更加推荐使用Parcelable 的方式来实现Intent 传递对象的功能。
- 第一行代码-13.2 使用Intent传递对象
- (第一行代码笔记)使用Intent传递对象
- android 使用Intent传递对象 Serializable 或者 Parcelabel 《第一行代码》
- 第一行代码:显示Intent
- 第一行代码:隐式Intent
- Android Studio Intent使用(显式、隐式) 第一行代码
- 使用Intent传递对象
- 使用Intent传递对象
- 使用Intent 传递对象
- 使用Intent传递对象
- 使用Intent传递对象
- 使用Intent传递对象
- Android Studio Intent向上下活动传递数据 第一行代码
- Android--第一行代码 Intent用法
- 《第一行代码》学习笔记intent
- 如何使用Intent传递对象
- Android-使用Intent传递对象
- 使用Intent传递自定义对象
- 待重写
- OpenCV中的三种图像数据结构CvMat,IplImage和Mat(一)CvMat
- 1192: [HNOI2006]鬼谷子的钱袋
- redis
- BZOJ-3225 立方体覆盖 线段树+扫描线+乱搞
- 第一行代码-13.2 使用Intent传递对象
- 将网页添加至阅读列表——SSReadingList
- 小刚的Android研究笔记~在未开启USB调试的Android手机绕过锁屏密码
- 自我介绍
- 软考大纲
- [LeetCode]40 和的组合 II
- jQuery面试题答案
- 数论+dfs+复数除法剪枝 Secret Code hdu1111
- Linux系统运维/vi的额外功能/4