什么是IPC机制?
IPC(Inter-Process Communication)是指进程间通信或跨进程通信,也可以说两个进程进行数据交换的过程。
什么是进程?什么是线程?
进程是指一个执行单元在移动设备中指一个应用或一个程序
线程是CPU调度的最小单元,同时线程是一种有限的资源。
一个进程中可以只有一个线程,也就是主线程,在Android中主线程也被称之为UI线程,UI线程里主要操作界面元素,但不能做耗时任务。如果做了就会出现界面无响应。在Android中有一个特殊的名字叫做ANR(Application Not Responding)解决方法就是把一些耗时任务放在子线程中就可以。
IPC机制可不只是Android中独特有的,任何操作系统都会有相应的IPC机制,说到IPC使用的场景就要提到多进程,因为主要为了进程与进程之间通信。Android 是多进程模式的。
如何开启多进程
在Android中多进程是指一个应用中存在多个进程的现象。我先说说一个应用进程之间的通信。如何使用定义多进程,主要在Android四大组件中开启进程这需要在AndroiMenifest中具体的四大组件制定android:process属性,除此之外 别无他法。
一般来说,使用多进程会造成如下几方面的问题:
(1) 静态成员和单例模式完全失效
(2)线程同步机制完全失效
(3)SharedPreferences的可靠性下降
(4)Application会多次被创建
讲到IPC就必须知道三方面内容 :Serializable接口 ,Parcelable接口, Binder
1.Serializable接口
这是Java提供的一个序列化接口。它是一个空接口,为对象提供标准的序列化 和反序列化。怎样实现序列化呢 ,实现Serializable接口并申明serialVersionUID,这样我们就可轻松的实现序列化了。但实际上我们也可忽略serialVersionUID这样也能正确实现序列化。
那问题就又来了,为什么会有serialVersionUID呢?它是做什么的?
可以理解为这是反序列化的一个标识 只有标识相同才能被正常反序列化,可以手动指定,也可以根据类名的哈希值。
2.Parcelable接口
这是Android 提供的一个实现序列化的接口,实现也可通过Intent ,Binder传输
3.Binder
Binder在Android中是一个类,它实现了IBinder接口。从IPC机制来说它是一种跨进程通信的方式,它主要在Service中应用,包括AIDL和Messenger。
Android 中的IPC方式:
1.使用Bundle
四大组件中三大组件都是在intent中利用bundle来传输数据,由于Bundle实现了Parcelable,所以可以方便地进行传输。
2.使用后文件共享
共享文件是不错的进程间通信的方式,两个进程读写同一文件夹数据,
3.使用Messenger
顾名思义翻译成中文为信息管理者,就是在不同的进程中传递Messenger对象,在里面放入我们需要传递的数据,就可进行传递数据,是一种轻量级的IPC方案,底层是AIDL
服务端进程
首先,我们需要在服务端创建一个Service来处理客户端的连接请求,同时创建Handler并通过Handler来创建一个Messenger,然后在Service的onBind中返回这个messenger对象的底层Binder
客户端进程
首先绑定服务端的Service,绑定成功后用服务器返回的IBinder对象创建一个Messenger,并把这个Message对象通过Message对象的replyTo参数传递给服务器。
4.使用AIDL
AIDL可以来实现跨进程调用服务的方法
服务端:
服务端首先创建一个Service用来监听客户端的连接请求,然后创建一个AIDL文件,将暴露给客户端的接口在此申明,Service实现AIDL接口
客户端:
客户端所做的事情就简单,首先需要绑定服务端的Service,返回的Binder对象转为AIDL接口所属的类型,接着掉AIDL中的方法。
注意AIDL对数据类型有要求:
基本数据类型(int,long,char,boolean,double等);
String和CharSequence;
List:只支持ArrayList,里面的每个元素都必须被支持;
Map:只支持HashMap,里面的每个元素都必须被支持,包括Key和value
Parceable:所有都实现了Parceable接口对象;
AIDL:AIDL文件中的接口都可在AIDL文件中使用;
5.使用ContentProvider
ContentProvider是Android专门为不同应用进行数据共享的方式。它的底层还是Binder使用却简单 因为系统进行了封装。
ContentProvider就相当于一个数据库,它主要是以表格的形式,除此之外还有文件数据如:图片,视频,音频。
6.使用Socket
Socket也称之为套接字是网路通信的一种概念,它分为流式套接字和用户数据报套接字两种,分别对应于网络的传输控制层中的TCP和UDP协议。TCP协议是面向连接的协议,提供稳定的双向通信功能,TCP要经过三次握手才能完成,为了提供稳定的数据传输功能,具有很高的稳定性;UDP是无连接的 提供不稳定的单向通信功能,UDP也可以实现双向通信 但是不稳定。
网友评论