相关问题
所有运行在不同进程中的四大组件,只要它们之间需要通过内存来共享数据,都会共享失败,这也是多进程所带来的主要影响。正常情况下,四大组件中间不可能不通过一些中间层来共享数据,那么通过简单地指定进程名来开启多进程都会无法正确运行。一般来说,使用多进程会造成如下几方面的问题:
静态成员和单例模式完全失效
线程同步机制完全失效
SharedPreferences的可靠性下降
Application会多次创建
为了解决这个问题,系统提供了很多跨进程通信方法,虽然说不能直接地共享内存,但是通过跨进程通信我们还是可以实现数据交互。实现跨进程通信的方式有很多,比如通过Intent来传递数据,共享文件SharedPreference,基于Binder的Messenger和AIDL以及Socket等。
相关概念
Serializable接口
Serializable是Java提供的一个序列化接口,它是一个空接口,为对象标准的序列化和反序列化操作。使用Serializable来实现序列化相当简单,声明一下即可(即implements Serializable)。
Parcelable接口
Parcel内部包装了可序列化的数据,可以在Binder中自由传输,在序列化过程中需要实现的功能有序列化、反序列化和内容描述序列化功能有writeToParcel方法来完成,最终是通过Parcel中的一系列write方法来完成的。
不仅要声明,还要实现内部的相应方法。
注意:写入数据的顺序和读出数据的顺序必须相同。
Serializable和Parcelable比较
Serializable是Java中的序列化接口,开销大,在序列化和反序列化过程中需要大量的I/O操作。而Parcelable是Android中的序列化方式,因此更适合用在Android平台上,它的缺点就是使用起来稍微麻烦点,但是它的效率很高。
Binder
Binder是Android中的一个类,实现了IBinder接口。
从IPC角度来说,Binder是跨进程通信的一种方式;
从Android Framework角度来说,Binder是ServiceManager连接各种Manager(ActivityManager、WindowManager等等)和相应ManagerService的桥梁;
从Android应用层来说,Binder是客户端和服务端进行通信的媒介。
Android中的IPC方式
使用Bundle(Bundle实现了Parcelable接口)
使用文件共享
使用Messenger(Messenger是一种轻量级的IPC方案,底层实现是AIDL)
使用AIDL(远程服务跨进程通信的一种方式)
使用ContenProvider(底层实现是Binder)
使用Socket
IPC方式的优缺点和适用场景
参考链接:添加链接描述