5.使用Intent实现Activity之间对象的传输

由于前面写了Intent,就一起写,这个是Intent的高级使用,可以不看先

通常有两种实现方式
1.Serializable 序列化对象,将对像转换成可传输的状态,比如二进制。

具体代码:

先看看要被传输的对象的类Person
//实现了这个接口后,就是通知了系统,该类的实例可以被序列化
public class Person  implements Serializable{  

    private String name;
    private int age;

    public Person (String name,int age){
        this.name=name;
        this.age=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 class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        Button sendDate=(Button)findViewById(R.id.sendDate);

        sendDate.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {

                //初始化person
                Person person=new Person("lee",19);

                Intent intent =new Intent(MainActivity.this,SecondActivity.class);

                //向SecondActivity传递person实例,将对象存在Intent中,key为lee
                intent.putExtra("lee",person);

                startActivity(intent);
            }
        });

再看看要接收的改动对象的Activity

public class SecondActivity extends AppCompatActivity {
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_second);

        //取出对象
        Person person=(Person)getIntent().getSerializableExtra("lee");

        //测试有没有取出
        Log.d("ssssss",person.getName()+"\t"+person.getAge());
    }
}

2.Parcelable方式
原理:将对象分解成很多部分,所有的部分都是Intent所支持传输的数据类型,其实解析,再组合出来,都是在Person类中进行的,所以在前面的基础上,实现一个Parcelable接口,复写一些方法,就可以了,那些复写的方法就是用来传输时解析对象,组合对象用的,

看Person类代码:

//实现Parcelable接口
public class Person  implements Parcelable{

    private String name;
    private int age;

    public Person (String name,int age){
        this.name=name;
        this.age=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;
    }

    //复写该方法用来进行数据的写出,存到dest中
    @Override
    public void writeToParcel(Parcel dest, int flags) {
        dest.writeString(name);
        dest.writeInt(age);
    }

    //默认要复写的,一般返回0就好
    @Override
    public int describeContents() {
        return 0;
    }

    //还必须要提供一个CREATOR常量,注意泛型都是要传输的对象类
    //这里用了个接口的实现,在里面对数据读出来,并返回对象
    public static final Parcelable.Creator<Person> CREATOR=new Parcelable.Creator<Person>(){
        @Override
        public Person createFromParcel(Parcel source) {

            //由于前面先写入的是name,这里必须先读取
            String name=source.readString();
            int age=source.readInt();

            Person person=new Person(name,age);
            return person;
        }

        //这里按要求复写就好
        @Override
        public Person[] newArray(int size) {
            return new Person[size];
        }
    };
}

MainAcitvity中代码不变,
那在SecondActivity中取对象怎么取???

//取出对象
        Person person=(Person)getIntent().getParcelableExtra("lee");

总结:第一种方法简单,但是第二种在性能上有优势

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值