android进阶(二)-----android_IPC机制

一:IPC简介

android中使用多进程通过给四大组件指定android:process属性,也可以通过JNI在native层去fork一个新的进程

进程名以“:”开头的进程属于当前应用的私有进程,不以“:”开头的进程属于全局进程

使用多进程造成的问题:

静态成员和单例模式失效

线程同步失效

SharedPreferences的可靠性下降

Application会被多次创建

 

二、IPC介绍

IPC主要包含:Serializable接口、Parcelable接口以及Binder

Serializable和Parcelable接口可以完成对象的序列号过程

 

Serializable接口:是java提供的一个序列号接口,是一个空接口,为对象提供标准的序列化和反序列化操作,使用简单但是开销很大,序列化和反序列化过程需要大量I/O操作

使用:public class Test implements Serializable{}

 

Parcelable接口:主要用于内存序列化,是android中的序列化方式,缺点是使用起来麻烦点,但是效率很高

 

Binder:是android中的一个类,实现了IBinder接口。从IPC角度说Binder是android中的一种跨进程通信方式。还可以理解为一种虚拟的物理设备,设备驱动是/dev/binder

android开发中,Binding主要用在Service中,包括AIDL和Messenger

 

三:android中的IPC方式

使用Bundle:android中的三大组件(Activity、Service、Receiver)都支持在Intent中传递Bundle数据,由于Bundle实现了Parcelable接口,所以他可以方便的在不同的进程间传输

 

使用文件共享:两个进程通过读/写同一个文件来交换数据。文件共享方式适合在对数据同步要求不高的进程之间进行通讯,并且要处理并发读/写的问题,SharedPreferences是个特例,由于系统对他的读/写有缓存策略,因此在多进程模式下,系统对他的读/写变的不可靠,面对高并发的读/写访问,有很大几率丢失数据,不建议在进程间通信中使用SharedPreferences

 

使用Messenger:Messenger是一种轻量级的IPC方案,底层实现是AIDL。以串行的方式处理客户端发来的消息,如果大量消息同时发送,服务端仍然一个个处理,那么用Messenger就不合适了

 

使用AIDL:

AIDL支持的数据类型:

基本数据类型(int、long、char、boolean、double等)

String和CharSequence

List:只支持ArrayList,集合中元素必须能被AIDL支持

Map:值支持HashMap,集合中元素必须能被AIDL支持,包括key和value

Parcelable:所有实现了Parcelable接口的对象

AIDL:所有的AIDL接口本身也可以在AIDL中使用

 

(1)服务端创建一个Service来监听客户端的连接请求,创建AIDL文件,将暴露给客户端的接口在这个AIDL文件中声明,最后在Service中实现这个AIDL接口

(2)客户端绑定服务端的Service,绑定成功后,将服务端返回的Binder对象转成AIDL接口所属的类型,然后就可以调用AIDL中的方法了

(3)AIDL接口的创建

package com.test.test.aidl;

import com.test.test.aidl.Dog;

interface IDogManager{

List getDogList();

void addDog(Dog dog)

}

 

使用ContentProvider:ContentProvider是android中专门用于不同应用间进行数据共享的方式、天生就适合进程间通信。底层实现是Binder

ContentProvider主要以表格的形式来组织数据,并且可以包含多个表,除了表格的形式,ContentProvider还支持文件数据

 

使用Socket:Socket也称“套接字”是网络通信中的概念,分为流式套接字和用户数据报套接字两种,分别对应于网络的传输控制层的TCP和UDP协议,关于TCP和UDP的介绍请看另一篇文章:xxxxxxx

使用Socket需要声明权限

 

Binder连接池

Binder连接池的主要作用就是将每个业务模块的Binder请求同意转发到远程Service中去执行,从而避免了重复创建Service的过程

 

四、IPC方式的优缺点和使用场景

Bundle

优点:简单易用

缺点:只能传输Bundle支持的数据类型

适用场景:四大组件间的进程通信

 

文件共享

优点:简单易用

缺点:不适合高并发场景,并且无法做到进程间的即时通信

适用场景:无并发访问情形,交换简单的数据实时性不高的场景

 

AIDL

优点:功能强大、支持一对多并发通信,支持实时通信

缺点:使用比较复杂,需要处理好线程同步

使用场景:一对多通信且有RPC需求

 

Messenger

优点:功能一般,支持一对多串行通信,支持实时通信

缺点:不能很好处理高并发,不支持RPC,数据通过Message进行传输,只能传递Bundle支持的数据类型

适用场景:低并发的一对多即时通信,无RPC需求,或者无须返回结果的RPC需求

 

ContentProvider

优点:在数据源访问方面功能强大,支持一对多并发数据共享,可通过Call方法扩展其他操作

缺点:可以理解为受约束的AIDL,主要提供数据源的CRUD操作

适用场景:一对多的进程间的数据共享

 

Socket

优点:功能强大,可以通过网络传输字节流,支持一对多并发实时通信

缺点:实现细节稍微烦琐,不支持直接的RPC

适用场景:网络数据交换

 

你可能感兴趣的:(android进阶)