使得Intent可以传递对象(方法:Serializable序列化 和 Parcelable)

Intent可以用于启动活动、发送广播、启动服务等等,还可以在Intent添加一些数据,以达到传值的效果

传递常见数据类型的数据(如int,String):(这里仅仅假设在Activity1,传递到Activity2)

① Intent. putExtra(  "Key" ,value),添加要传递的数据  (Activity1中

Intent intent = new Intent(Activity1.this, Activity2.class);
intent.putExtra("StringData","hello");
intent.putExtra("intData",123);
startActivity(intent);

② getIntent() . getXxxTypeExtra(" Key ") 获取数据类型为XxxType的数据 (XxxType如Int,String) (Activity2中

getIntent().getStringExtra("StringData");    
getIntent().getIntExtra("intData");    

酱紫,就可以从Activity1传递数据给Activity2了,不过,单纯的putExtra()并不能传递对象只能传递一些普通数据类型的数据。

要使得Intent能传递对象,有两种方法:Serializable(序列化)和Parcelable(打包的)

Serializable(序列化的):

Serializable是序列化的意思,表示将一个对象转换成 可存储或可传输 的状态。序列化后的对象,可以在 网络上传输 存储到本地

① Serializable序列化 方法:只需要让一个类去实现Serializable接口即可,这样此类的所有对象都是序列化的、可以传输的

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;
    }
}

② 在Activity1中,传递可以这样写:因为Person类实现了Serializble接口即序列化了,所以Person的对象可以传输

Person person=new Person();
person.setName("臭居居");
person.setAge("22");
//因为Person类实现了Serializble接口即序列化了,所以Person的对象可以传输
Intent intent=new Intent(Activity1.this, Activity2.class);
intent.putExtra("personData",person);    //携带person对象
startActivity(intent);

③ 在Activity2中,获取方法是:( 类名)getIntent(). getSerializableExtra("person_data"),而不是getStringExtra之类的了

Person person =( Person )getIntent().getSerializableExtra("personData")

注意,获取对象的时候,要将它向下转型成Person对象。最终,Intent完成传递对象了

 

Parcelable(打包的):分解对象成Intent所支持的数据类型

Parcelable方式的原理是,将一个 完整的对象 进行分解,分解后的每一部分都是Intent所支持的数据类型,这样也可以实现对象的传递。

① 首先,也是让一个类实现Parcelable接口,不过还需重写describeContents()writeToParcel(Parcel parcel, int i) ,并提供一个CREATOR常量

public class Person implements Parcelable {
    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;
    }

    //重写describeContents(),这个没什么写,直接返回0即可
    @Override
    public int describeContents() {
        return 0;
    }

    //重写writeToParcel(Parcel parcel, int i)
    //在这里,需要将此类Person的字段属性,用参数1的Parcel的writeXxx(字段名) 一一写出
    @Override
    public void writeToParcel(Parcel parcel, int i) {
        parcel.writeString(name); //写出字段name
        parcel.writeInt(age);     //写出字段age
    }

    //最后,需提供一个 Parcelable的常量CREATOR ,泛型指定为本类Person
    public static final Parcelable.Creator<Person> CREATOR=new Parcelable.Creator<Person>(){

        //重写createFromParcel,
        // 在这里,用parcel的readXxx(字段名) 读取刚才写出的Person字段
        @Override
        public Person createFromParcel(Parcel parcel) {
            Person person=new Person();
            person.name=parcel.readString();//读取name字段
            person.age=parcel.readInt();    //读取age字段
            return person;                  //返回person对象
        }

        //重写newArray(int i),返回一个Person数组即可
        @Override
        public Person[] newArray(int i) {
            return new Person[i];
        }
    };
}

注意,在重写writeToParcel(Parcel parcel, int i)时,用parcel.writeXxx(name)写出字段的顺序 

和       在重写createFromParcel(Parcel parcel)时,用parcel.readXxx( )的      读取字段的顺序   一致,才能读取准确

②在Activity1传递 :

Person person=new Person();
person.setName("臭居居");
person.setAge("22");
//因为Person类实现了Serializble接口即序列化了,所以Person的对象可以传输
Intent intent=new Intent(Activity1.this, Activity2.class);
intent.putExtra("personData",person);    //携带person对象
startActivity(intent);

③ 在Activity2中获取,有些不同,而是用getIntent().getParcelableExtra(" Key "):

Person person =( Person )getIntent().getParcelableExtra("personData")
 

注意,获取对象的时候,要将它向下转型成Person对象。最终,Intent完成传递对象了

 

总结:

Serializable 和 Parcelable都可以实现Intent传递对象,Serializable 实现简单不用重写什么方法不过因为会把整个对象序列化,效率比Parcelable低一些。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值