之前我们在讲android启动方式的时候就看到Intent的身影,具体如果大家想要了解可以去看看之前的文章 ->点击传送门。今天我们主要讲的是数据传递。

1.基本用法

      Intent传递数据是以Key,Value键值对的形式传递,主要通过putExtra()方法,该方法接收两个参数第一个是Key,第二是Value下面我们来看一下Intent都可以传递什么类型

Android Intent携带数据大小限制 android intent传值_android数据回传多个页面

那么接收接收数据时需要用到Intent的getXxxExtra方法,该方法通过传入之前设置的Key取值。我们来看下边这张图

Android Intent携带数据大小限制 android intent传值_Data_02

我们来看一个例子

Activity A 跳转到 MainActivityIntent intent = new Intent(context, MainActivity.class);        intent.putExtra("key_int", 1);        intent.putExtra("key_String", "zwt");        String [] arr = {"a", "b", "c"};        intent.putExtra("key_array", arr);        context.startActivity(intent);        MainActivity OnCreat中获取数据Intent intent = getIntent();        int num = intent.getIntExtra("key_int", 0);        String name = intent.getStringExtra("key_String");        String [] array = intent.getStringArrayExtra("key_array");

2. 数据回传 

      Intent 也可以把数据回传上一个Activity,这也是我们日常开发中经常用到的。想要是这样回传功能 我们在启动Activity是需要调用startActivityForResult(Intent intent, int requestCode) ,当启动的Activity 做了一系列动作之后在finish前需要new Intent 并设置回传数据,之后调用setResult(RESULT_OK, intent);上一个Activity在接收回传数据时需要重写onActivityResult(int requestCode, int resultCode, Intent data)方法 下边我们看一个代码示例

A Activity 启动 B Activity B在finish时将数据回传给AA 启动 B 要求返回数据 Intent intent =new Intent(this, BActivity.class);startActivityForResult(intent, 1002)B 关闭时Intent intent =new Intent();intent.putExtra("backData", 11);setResult(RESULT_OK,intent);finish();A 中重写 onActivityResult();@Override protected void onActivityResult(int requestCode, int resultCode, Intent data) {if (ResultCode == RESULT_OK && requestCode == 1002){//接收B返回的数据int num = data.getIntExtra("backData", 0);}}

3.自定义类型序列化传送

     使用Intent 来传递自定义对象的主要方式有两种 Serializable 和 Pracelable。Seralizable 是指将一个对象转换成可存储或可传输状态。序列化后的对象可以在网上传输也可以存储到本地。Parcelable 同样可是实现上述功能,其原理是将一个完整的对象进行分解,而分解后的每一个部分都是Intent所支持的数据类型,这样也就实现了传递对象的功能。下面我们来看一段实例代码。

自定义实现类 Serializable 只需实现Serializable接口即可public class TestData implements Serializable{      private int index;        private String name;        public TestData(int index, String name) {            this.index = index;            this.name = name;        }        public int getIndex() {            return index;        }        public void setIndex(int index) {            this.index = index;        }        public String getName() {            return name;        }        public void setName(String name) {            this.name = name;        }}自定义实现类 Parcelable 需要2步 第一需要实现 接口 Pracelable 第二步重写重写 describeContents() 返回 0 即可, 重写writeToParcel() 写入类中定义相应字段,然后再提供一个CREATOR常量class TestData implements Parcelable {    private int index;    private String name;    public int getIndex() {        return index;    }    public void setIndex(int index) {        this.index = index;    }    public String getName() {        return name;    }    public void setName(String name) {        this.name = name;    }    @Override    public int describeContents() {        return 0;    }    @Override    public void writeToParcel(Parcel dest, int flags) {        dest.writeInt(index);        dest.writeString(name);    }    public static final Parcelable.Creator CREATOR  =new Parcelable.Creator(){        @Override        public TestData createFromParcel(Parcel source) {            TestData testData =new TestData();            testData.setIndex(source.readInt());            testData.setName(source.readString());            return testData;        }        @Override        public TestData[] newArray(int size) {            return new TestData[size];        }    };}具体使用TestData testData=new TestData();testData.setIndex(1);testDate.setName("zwt");Intent intent=new Intent(this, BActivity.class);intent.putExtra("data", testData);startActivity(intent);获取数据Intent intent =getIntent();//注意需要类型转换TestData data = (TestData )intent.getPracelableExtra("data");

这两种序列化方式Serializable比Parcelable效率偏低,但Serializable实现相对简单,一般从效率角度出发我们在开发中尽量使用Parcelable的方式实现Intent传递对象。

      最后提一下Intent传递数据时 数据大小是受Binder限制的 ,如果数据传递或者回传的数据大小超出Binder传递缓存的大小时就会抛出TransactionTooLargeException异常。这个大小限定通常是1M 但不是上限,因为Binder中可能也同时在处理其它的传输工作。不同的机型和系统版本,这个上限值也可能会不同。至于Binder机制我会单独找一篇文章介绍!