IPC:inter-Process comununication
Android中使用多进程的方法: 给四大组件在AndroidManifest中制定android:process属性,除此无他法。其实还有一个非常规方法,在JNI中的native层fork一个新进程。
进程信息查看:可在DDMS中,或者在shell中使用命令:adb shell ps 或者 adb shell ps | grep *packagename*
多进程会导致的问题:1、静态成员和单例模式完全失效
2、线程同步机制完全失效
3、SharedPreferences的可靠性下降。SP不支持多进程同事执行写操作,会导致一定几率的数据丢失。
4、application会多次创建
序列化: serializable接口,其中的serialVersionUID如果不声明,反序列化时候会有影响。其工作机制:序列化时候系统会把当前类的serialVersionUID序列化的文件中,反序列化时候会去检测seriaVersionUID,判断是否和当前类一直,如果一致表明版本相同,可以成功反序列化,否则表明当前类和序列化额类发生了某些变换,比如成员的数量类型发生了改变,这时候无法正常反序列化。
序列化后,即可以用ObjectOutputStream和ObjectInputStream来实现读入写入。
Parcelable接口; 实现此接口,就可以序列化病通过Intent和Binder传递数据。Intent,Bundle和Bintmap,都是可序列化的。相比serialable的开销大和大量I/O操作,Parcealbe效率高但是使用稍微麻烦。主要用在内存序列化上。
Binder: 实现了IBinder接口的类,android的跨进程方式,还可以理解为一虚拟的物理设备,其设备驱动是/dev/binder。从Framework角度说是ServiceManager链接各种Manager和ManagerService的桥梁
当客户端发起远程请求,由于当前线程会被挂起纸质服务端进程返回数据,所以远程方法不能放在UI线程中发起请求;其次由于服务端BInder方法运行在Binder线程池中,则Binder方法不管是否好事都应该用同步方式,因为它已经运行在一个线程中了
*其他IPC方式:①contentProvider,
②Socket,
③共享文件(用于对数据同步要求不高的场合,sp方式因为系统对sp文件哟䘺缓存策略,多进程方式下其读写不可靠)
④Messenger:Messenger进行数据传递必须将数据放入Message中,都实现了Parcealbe接口,可以跨进程传输。Messenge能使用额载体只有
what、arg1、arg2、Bundle以及replyTo,另一字段object在2.2以后可以传输系统提供的实现了Parcealbe接口的对象。自定义的paecealbe
对象是无法通过object字段来传输的