问题描述:
Intent 可以 启动活动 启动服务 发送广播
在用Intent 的putExtra()方法传递的数据类型是有限的 比如不好传递一个自定义对象:
解决办法:
两种方式: Serializable & Parcelable
1.Serializable
Serializable :序列化,表示将一个对象转换成可存储可传输的状态,序列化后的对象可以在网络上传输也可以持久化到本地
实现方法:让一个类去实现Serializable接口
如有一个Dog类 包含了name age两个字段 序列化就可以这样写:
public class Dog 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; } }让 Dog类实现了Serializable接口 这样所有的Dog对象就都是可序列化的了
然后在Activity跳转时即可写成:
Dog dog = new Dog(); dog.setName("Love"); dog.setAge(520); Intent intent = new Intent(MainActivity.this,SecondActivity.class); intent.putExtra("dog_data",dog); startActivity(intent)在 SecondActivity获取这个对象:
Dog dog = (Dog) getIntent().getSerializableExtra("dog_data");
2.Parcelable
Parcelable: 将一个完整的对象进行分解,分解后的每一部分都是Intent所支持的数据,亦可实现传递对象的功能
创建一个Cat类,实现Parcelable接口
/** * Created by UFO * * 1.首先实现Parcelable接口 必须重写describeContents()和writeToParcel()两个方法 */ public class Cat 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; } @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<Cat> CREATOR = new Parcelable.Creator<Cat>(){ @Override public Cat createFromParcel(Parcel source) { Cat cat = new Cat(); cat.name = source.readString();//读取name cat.age= source.readInt();//读取age return cat; } @Override public Cat[] newArray(int size) { return new Cat[size]; } }; }
然后在Activity跳转时即可写成:
Cat cat = new Cat(); cat.setName("baby"); cat.setAge(521); Intent intent = new Intent(MainActivity.this,SecondActivity.class); intent.putExtra("cat_data",cat); startActivity(intent)在 SecondActivity获取这个对象:
Cat cat = (Cat) getIntent().getParcelableExtra("cat_data");
OK!