美文网首页
Android的IPC机制

Android的IPC机制

作者: Prisoner_King | 来源:发表于2018-06-06 08:00 被阅读0次

    什么是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也可以实现双向通信 但是不稳定。

    相关文章

      网友评论

          本文标题:Android的IPC机制

          本文链接:https://www.haomeiwen.com/subject/lkkvsftx.html