一、传递一般数据类型
比如:整型 浮点型 字符串等。
Intent intent=new Intent(); intent.setClass(MainActivity.this, OtherActivity.class); //putExtra方法 可以传递各种数据类型的值 第一参数是键值 第二参数是值 intent.putExtra("data", "我是Kaming"); startActivity(intent);
//可以通过getExtras方法来获取键值 返回的数据类型是Bundle类型 Bundle bundle=getIntent().getExtras(); String data=bundle.getString("data"); Log.d("OtherActivity", data);
二、传递对象
第一种方法(Serializable):
Intent intent=new Intent(); intent.setClass(MainActivity.this, OtherActivity.class); Obj obj=new Obj(); obj.setName("Kaming"); //Serializable类型的putExtra方法 intent.putExtra("obj", obj); startActivity(intent);
Bundle bundle=getIntent().getExtras(); Obj data=(Obj) bundle.get("obj");//get Log.d("OtherActivity",data.getName());
注意:在Obj中要implements Serializable接口
第二种方法(Parcelable):
Intent intent=new Intent(); intent.setClass(MainActivity.this, OtherActivity.class); Obj2 obj2=new Obj2(); obj2.setAge("19"); obj2.setName("Kaming"); intent.putExtra("obj", obj2); startActivity(intent);
package com.example.activity01; import android.os.Parcel; import android.os.Parcelable; public class Obj2 implements Parcelable{ private String name; private String age; public String getName() { return name; } public void setName(String name) { this.name = name; } public String getAge() { return age; } public void setAge(String age) { this.age = age; } @Override public int describeContents() { // TODO Auto-generated method stub return 0; } public static Parcelable.Creator<Obj2> CREATOR=new Creator<Obj2>(){ @Override public Obj2 createFromParcel(Parcel source) { // TODO Auto-generated method stub Obj2 obj2=new Obj2(); obj2.setAge(source.readString()); obj2.setName(source.readString());//读的顺序和下面写的顺序一样 return obj2; } @Override public Obj2[] newArray(int size) { // TODO Auto-generated method stub return null; } }; @Override public void writeToParcel(Parcel dest, int flags) { // TODO Auto-generated method stub dest.writeString(age); dest.writeString(name); } }
在Obj2中要 implements Parcelable,完成两个抽象方法;
在writeToParcel方法中 可以写入数据
声明public static Parcelable.Creator<Obj2> CREATOR=new Creator<Obj2>(){};泛类
在createFormParcel方法中 可以读出数据
Parcelable和Serializable的区别:
Serializable的作用是为了保存对象的属性到本地文件、数据库、网络流、rmi以方便数据传输,当然这种传输可以是程序内的也可以是两个程序间的。而Android的Parcelable的设计初衷是因为Serializable效率过慢,为了在程序内不同组件间以及不同Android程序间(AIDL)高效的传输数据而设计,这些数据仅在内存中存在,Parcelable是通过IBinder通信的消息的载体。
效率:
Parcelable的性能比Serializable好,在内存开销方面较小,所以在内存间数据传输时推荐使用Parcelable,如activity间传输数据,而Serializable可将数据持久化方便保存,所以在需要保存或网络传输数据时选择Serializable,因为android不同版本Parcelable可能不同,所以不推荐使用Parcelable进行数据持久化。
PS:在JAVA中没有Parcelable这个类,在Android中才有。
原文:http://my.oschina.net/u/1458196/blog/317033