美文网首页
使用 Intent 传递对象

使用 Intent 传递对象

作者: TTTqiu | 来源:发表于2016-05-12 21:48 被阅读73次
  • Intent 的 putExtra() 方法中所支持的数据类型是有限的,虽然常用的一些数据类型它都会支持,但是当想传递一些自定义对象的时候就会发现无从下手。这时需要使用** Serializable 方式 Parcelable 方式**来传递对象。

一、 Serializable 方式


  • Serializable序列化的意思,表示将一个对象转换成可存储或可传输的状态
1. 要使一个类的对象可序列化,只需要让这个类去实现 Serializable 这个接口就可以了。

比如说有一个 Person 类,其中包含了 name 和 age 这两个字段,想要将它序列化就可以这样写,这样所有的 Person 对象就都是可序列化的了

public class Person implements Serializable{  
    private String name;
    private int age;
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public int getAge() {
        return age;
    }
    public void setAge(int age) {
        this.age = age;
    }
}
2. 传递序列化的对象。
Person person = new Person();
person.setName("Tom");
person.setAge(20);
Intent intent = new Intent(FirstActivity.this, SecondActivity.class);
intent.putExtra("person_data", person);
startActivity(intent);
  • 由于 Person 类实现了 Serializable 接口,所以才可以这样写。
3. 获取序列化的对象。
Person person = (Person) getIntent().getSerializableExtra("person_data");
  • 调用 getSerializableExtra() 方法来获取通过参数传递过来的序列化对象,接着再将它向下转型成 Person 对象。

二、Parcelable 方式


  • Parcelable 方式的实现原理是将一个完整的对象进行分解,而分解后的每一部分都是 Intent 所支持的数据类型,这样也就实现传递对象的功能了。
1. Parcelable 的实现方式。
public class Person implements Parcelable {
    private String name;
    private int age;
    ......

    @Override
    public int describeContents() {
        return 0;
    }

    @Override
    public void writeToParcel(Parcel dest, int flags) {
        dest.writeString(name); // 写出name
        dest.writeInt(age); // 写出age
    }

    public static final Parcelable.Creator<Person> CREATOR = new Parcelable.Creator<Person>() {
        @Override
        public Person createFromParcel(Parcel source) {
            Person person = new Person();
            person.name = source.readString(); // 读取name
            person.age = source.readInt(); // 读取age
            return person;
        }

        @Override
        public Person[] newArray(int size) {
            return new Person[size];
        }
    };
}
  • 首先让 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 作为数组大小就可以了。
2. 传递对象。
Person person = new Person();
person.setName("Tom");
person.setAge(20);
Intent intent = new Intent(FirstActivity.this, SecondActivity.class);
intent.putExtra("person_data", person);
startActivity(intent);
  • 传递对象方法与 Serializable 方式一样。
3. 获取对象。
Person person = (Person) getIntent().getParcelableExtra("person_data");
  • 调用 getParcelableExtra() 方法来获取对象,接着再将它向下转型成 Person 对象。

3. 对比


Serializable 方式较为简单,但由于会把整个对象进行序列化,因此效率较低。所以在通常情况下还是更加推荐使用 Parcelable 方式来实现 Intent 传递对象的功能。

相关文章

  • 第十三章-- 一些技巧工具

    1.全局获取context的技巧 2.使用Intent传递对象 使用Intent传递对象有两种实现方式:Seria...

  • 8.7 Intent2

    Intent传递简单数据 Intent传递数组 Intent传递集合 Intent传递对象 1.将对象转换为Jso...

  • 使用Intent传递对象

    1. Serializable方式 Serializable是序列化的意思,含义是将一个对象转化为可存储或是可传输...

  • 使用 Intent 传递对象

    Intent 的 putExtra() 方法中所支持的数据类型是有限的,虽然常用的一些数据类型它都会支持,但是当想...

  • Android中的Intent

    目录 1.Intent 2.Intent类型 3.Intent中的主要信息 4.使用实例 5.Intent传递对象...

  • Android 使用 Intent 传递对象

    Serializable 方式: 实例代码: Parcelable 方式: 实例代码: 测试传递对象: 测试接收对...

  • 关于Intent你知多少?

    什么是Intent? Intent是一个消息传递对象,可以使用它来启动其它应用组件。Intent使组件之间通信更加...

  • Intent和他的过滤器

    什么是Intent intent是一个消息传递对象,可以使用它从其他应用组件请求操作。通常我们用intent来启动...

  • [Android][Intent]

    1.Intent的作用 Intent 是一个消息传递对象,您可以使用它从其他应用组件请求操作。简单来说Intent...

  • 序列化Serializable和Parcelable的理解和区别

    序列化是需要使数据对象在不同的activity之间传递。android使用Intent的putExtra()来传递...

网友评论

      本文标题:使用 Intent 传递对象

      本文链接:https://www.haomeiwen.com/subject/alpprttx.html