//传递些简单的参数
Intent intentSimple = new Intent();
intentSimple.setClass(MainActivity.this, Main2Activity.class);
Bundle bundleSimple = new Bundle();
bundleSimple.putString("name", "jay");
bundleSimple.putString("age", "18");
intentSimple.putExtras(bundleSimple);
startActivity(intentSimple);
//接收参数
Bundle bunde = this.getIntent().getExtras();
String name = bunde.getString("name");
String age = bunde.getString("age");
接收结果日志:
Main2Activity: name: jay age: 18
//传递复杂些的参数
Map map1 = new HashMap();
map1.put("key1", "value1");
map1.put("key2", "value2");
List
//接收参数
Bundle bundle = getIntent().getExtras();
ArrayList list = bundle.getParcelableArrayList("list");
//从List中将参数转回 List>
List> lists= (List>)list.get(0);
String sResult = "";
for (Map m : lists)
{
for (String k : m.keySet())
{
sResult += "\r\n"+k + " : " + m.get(k);
}
}
2.2.1 发送数据
// 通过Serializable接口传参数的例子
HashMap map2 = new HashMap();
map2.put("key1", "value1");
map2.put("key2", "value2");
map2.put("key3", "value3");
map2.put("key4", "value4");
map2.put("key5", "value5");
Bundle bundleSerializable = new Bundle();
bundleSerializable.putSerializable("serializable", map2);
Intent intentSerializable = new Intent();
intentSerializable.putExtras(bundleSerializable);
intentSerializable.setClass(MainActivity.this,
Main2Activity.class);
startActivity(intentSerializable);
2.2.2 接收数据
// 接收参数
Bundle bundle = this.getIntent().getExtras();
//如果传 LinkedHashMap,则bundle.getSerializable转换时会报ClassCastException,不知道什么原因
//传HashMap倒没有问题。
HashMap map = (HashMap)bundle.getSerializable("serializable");
for (Map.Entry m:map.entrySet()){
Log.e(TAG, "onCreate: "+m.getKey()+" "+m.getValue() );
}
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;
}
}
发送数据:
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 person = (Person) getIntent().getSerializableExtra("person_data");
这个是通过实现Parcelable接口,把要传的数据打包在里面,然后在接收端自己分解出来。这个是Android独有的,在其本身的源码中也用得很多,
效率要比Serializable相对要好
2.3.1 首先要定义一个类,用于 实现Parcelable接口
public class XclParcelable implements Parcelable {
//定义要被传输的数据
public int mInt;
public String mStr;
public HashMap mMap = new HashMap();
private XclParcelable(Parcel in) {
mInt=in.readInt();
mStr=in.readString();
mMap=in.readHashMap(HashMap.class.getClassLoader());
}
public XclParcelable(){}
public static final Creator CREATOR = new Creator() {
@Override
public XclParcelable createFromParcel(Parcel in) {
return new XclParcelable(in);
}
@Override
public XclParcelable[] newArray(int size) {
return new XclParcelable[size];
}
};
@Override
public int describeContents() {
return 0;
}
@Override
public void writeToParcel(Parcel dest, int flags) {
等于将数据映射到Parcel中
dest.writeInt(mInt);
dest.writeString(mStr);
dest.writeMap(mMap);
}
}
2.3.2 设置参数
//通过实现Parcelable接口传参的例子
Intent intentParcelable = new Intent();
XclParcelable xp = new XclParcelable();
xp.mInt = 1;
xp.mStr = "字符串";
xp.mMap = new HashMap();
xp.mMap.put("key", "value");
intentParcelable.putExtra("Parcelable", xp);
intentParcelable.setClass(MainActivity.this,
Main2Activity.class);
startActivity(intentParcelable);
2.3.3 接受参数
//接收参数
Intent i = getIntent();
XclParcelable xp = i.getParcelableExtra("Parcelable");
Log.e(TAG, "onCreate: "+" mInt ="+xp.mInt
+"\r\n mStr"+xp.mStr
+"\r\n size()="+xp.mMap.size() );
引入依赖
implementation 'org.greenrobot:eventbus:3.1.1'
构造消息发送类(post调用的对象)
public class Student {
private String name;
private int age;
public Student(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;
}
}
注册:(一般在onCreate( )方法中注册)
EventBus.getDefault().register(this);
发布消息
EventBus.getDefault().post(new Student("刘哈哈", 27));
//粘性事件
EventBus.getDefault().postSticky(new Student("刘哈哈", 27));
接收事件:
@Subscribe(threadMode = ThreadMode.MAIN)
public void studentEventBus(Student student){
mShow.setText("姓名:"+student.getName()+" "+"年龄:"+student.getAge());
}
粘性事件接收
@Subscribe(threadMode = ThreadMode.MAIN, sticky = true)
public void studentEventBus(Student student){
mShow.setText("姓名:"+student.getName()+" "+"年龄:"+student.getAge());
}
解注册(防止内存泄漏)(一般在onDestroy( )方法中调用):
EventBus.getDefault().unregister(this);
参考链接:Android五种数据传递方法汇总