android activity 传数据,2.Activity间的数据传递

# 问题:两个Activity之间如何传递数据呢?

Android中,在两个Activity之间传递数据是一个常见的需求。

对于这个问题,可以分为两个层面:

1.怎么将数据从Activity A传递给Activity B呢?

2.怎么将Activity A的参数传递给Activity B呢?

* * * * *

我们先来回答第2个问题,**怎么传递参数?**

毫无疑问,使用Intent的Bundle携带参数,实现在Activity之间传递参数传递。如传递基本数据类型可以使用:

~~~

intent.putExtra(key, value);

~~~

**除了传递基本类型外,如何传递自定义的对象呢**?

这里就涉及到本文想谈论的Parcelable。Parcelable是Android提供的一个序列化接口。

在做开发的过程中,序列化是非常常见的。比如要将对象保存本地磁盘或者在网络上传输等。实现序列化有两种方式,一种是实现Serializable接口,第二种是实现Parcelable。

* * * * *

* Serializable与Parcelable的区别

1、Serializable是JDK提供的接口,而Parcelable是Android SDK提供的。

2、Serializable序列化是**基于磁盘**的,而Parcelable是**基于内存**的,效率比Serializable接口高效,可用于Intent数据传递,也可用于进程间通信(IPC)。

3、Serializalbe会使用反射,序列化和反序列化过程需要大量I/O操作,Parcelable自已实现封送和解封(marshalled &unmarshalled)操作不需要用反射,数据也存放在Native内存中,效率要快很多。

注:Bundle中既可以传递Parcelable对象,也可以传递Serializable对象

~~~

Bundle bundle = new Bundle();

bundle.putSerializable(String key, Serializable value);

bundle.putParcelable(String key, Parcelable value);

~~~

* * * * *

* Parcelable和Parcle这两者之间的关系

Parcelable接口定义在封送/解封送过程中混合和分解对象的契约。

Parcelable接口的底层是**Parcel容器对象**。Parcel类是一种最快的序列化/反序列化机制,专为Android中的进程间通信而设计。**该类提供了一些方法来将成员容纳到容器中,封装后的数据可以通过Intent或IPC传递,除了基本类型外,只有实现了Parcelable接口的类才能放入parcel中。**

典型的Parcelable实现写法如下:

~~~

public class PersonParcelable implements Parcelable {

private String name;

private int age;

protected PersonParcelable(Parcel in) {

name = in.readString();

age = in.readInt();

}

/**

* 内容描述接口

* @return

*/

@Override

public int describeContents() {

return 0;

}

/**

* 将类的数据写到Parcel对象中,即将需要传递的数据打包到Parcel容器中,以便另一端从容器中读取。

* @param out

* @param flags

*/

@Override

public void writeToParcel(Parcel out, int flags) {

out.writeString(name);

out.writeInt(age);

}

public static final Creator CREATOR = new Creator() {

/**

* 从Parcel容器中读取传递数据值,封装成Parcelable对象返回逻辑层。

* @param in

* @return

*/

@Override

public PersonParcelable createFromParcel(Parcel in) {

return new PersonParcelable(in);

}

/**

* 供外部类反序列化本类数组使用

* @param size

* @return

*/

@Override

public PersonParcelable[] newArray(int size) {

return new PersonParcelable[size];

}

};

}

~~~

* * * * *

**在两个Activity之前传递对象还要注意什么呢?**

一定要要注意对象的大小,Intent中的Bundle是在使用Binder机制进行数据传递的,能使用的Binder的缓冲区是有大小限制的(有些手机是2M),而一个进程默认有16个binder线程,所以一个线程能占用的缓冲区就更小了(以前做过测试,大约一个线程可以占用128KB)。所以当你看到“The Binder transaction failed because it was too large.”这类TransactionTooLargeException异常时,你应该知道怎么解决了。

因此,使用Intent在Activity之间传递List和Bitmap对象是有风险的。

另外注意:因为android不同版本Parcelable可能不同,所以不推荐使用Parcelable进行数据持久化。

* * * * *

接下来回答开始提出的第二个问题:如何将数据从Activity A传递到Activity B?

1.上面介绍过的,基于消息的通信机制 Intent--------boudle,extra。

2.利用static静态数据,public static成员变量

3.基于外部存储的传输 ,File/Preference/Sqlite,如果要针对第三方应用需要Content provider

4.基于Ipc的通信机制

5.基于Application Context

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值