IPC笔记

作者: lipyhui | 来源:发表于2018-11-25 00:05 被阅读0次

一、说明

      笔记主要是《Android开发艺术探索》的阅读笔记和自己的理解,笔记中部分内容引自《Android开发艺术探索》。

      因此需要着重感谢任玉刚先生和他所著的《Android开发艺术探索》;然后感谢任玉刚先生授权我使用小部分《Android开发艺术探索》原文。

      推荐Android开发者购买正版《 Android开发艺术探索》,该书是初级Android开发者进阶的必备良品!

    由于本人水平有限,其中出现的错误或者不合理的地方望各位读者多多包含,并指出其中不合理和错误的地方,以便我来修改正。谢谢!

二、笔记时间

    2018年10月9日

三、简述

    本文主要记录《Android开发艺术探索》中第二章中的重要知识点,其中包含Binder、Messenger、AIDL、ContentProvider、Socket等一些重要知识细节。

    文中加入了一些个人理解,可能有一些说明不合理或者错误之处,望各位读者指出错误的地方,以便我来修改错误,避免误导读者。谢谢!

四、详情

1、简介

    IPC的全称是Inter-Process Communication,意思就是进程间通信或者跨进程通信,通俗说就是两个进程之间进行数据交换的过程。本文只摘要几大IPC的重要知识点,详细说明和使用另起文章进行说明。

注:

1)进程名:进程名是一个字符串,一个应用在不指定进程名的情况下,进程名则是应用的包名。进程名以“:”开头的进程属于当前应用的私有进程,其他应用的组件不可以和它跑在同一个进程中,而进程名不以“:”开头的进程属于全局进程,其他应用通过ShareUID方式可以和它跑在同一个进程中。

2)多进程:多进程就是同时运行多个进程。这样容易造成以下几点问题,第一,静态成员和单列模式完全失效;第二,线程同步机制完全失效;第三,SharedPreferences的可靠性下降;第四,Application会被创建多次。

2、跨进程通信方式

2.1、Binder

     从IPC的角度来说,Binder是Android中一种跨进程通信的方式;从Android应用层的角度来说,Binder是客户端与服务端通信的桥梁,通过bindService,服务端会返回一个包含了服务端业务调用的Binder对象,通过这个Binder对象,客户端就可以获取服务端提供的服务或者数据。

     Android开发中,Binder主要应用中Service中,包括AIDL和Messenger,其中普通service中的Binder不涉及进程间通信。其中Messenger的底层其实是AIDL。注:Binder中的onTransact方法可以做权限验证,因为当该方法返回false时,客户端的请求会失败。

2.2、Bundle

     由于Bundle实现了Parcelable接口,所以它能够方便地在不同进程之间传输。同时Android的四大组件有三大组件(Activity、Service、Receiver)支持在Intent中传递Bundle。

2.3、文件共享

     共享文件是两个进程通过读写同一个文件来交换数据。

2.4、Messenger

     Messager可以在不同进程中传递Message对象,但是Messenger只能用来交换数据。Messager是一个轻量级的IPC方案,它的底层实现方式是AIDL。Messager是以串行的方式来处理客服端的消息,也就是大量消息的时候还是只能一个一个处理。

2.5、AIDL

     AIDL跨进程通信可以实现跨进程的方法调用。AIDL跨进程通信分为服务端和客户端两个方面。

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

2)客户端:客服端首先绑定服务端的Service,绑定成功后,将服务端返回的Binder对象转换成AIDL接口所属的类型,接着就可以调用AIDL中的方法来。

注:

1)AIDL支持的数据类型:1、基本数据类型(int、long、char、boolean、double等);2、String和CharSequence;3、ArrayList,且里面的元素必须是AIDL所支持的数据类型;4、HashMap,且里面的key和value都必须是AIDL所支持的数据类型;5、Parcelable对象;6、AIDL,AIDL接口本身也可以在AIDL文件中使用。 

2)AIDL接口只支持方法,不支持声明静态常量。

2.6、ContentProvider

ContentProvider是Android中提供的专门用于不同应用间进行数据共享的方式,它只交换数据,数据的操作还是通过数据库等来操作。ContentProvider底层实现是Binder。ContentProvider的使用也非常简单,第一步实现ContentProvider的默认方法,其方法和数据库的实现方法类似,包含查询、插入、更新、删除等;第二步在“AndroidManifest.xml”中注册ContentProvider,通过“android:authorities”指定ContentProvider的唯一标识、“android:permission”来设置权限;最后就是在需要的地方通过URI来唯一指定ContentProvider并调用相应方法。

2.7、Socket

     Socket也被称为“套接字”,是网络通信中的概念,它分为流式套接字和用户数据套接字两种,分别对应网络传输中的TCP和UDP协议,它可以实现进程间通信。注:1、Socket需要声明网络权限;2、我们不能在主线程中访问网络,不然会崩溃报错;3、Socket无法实现系统应用和普通应用跨进程通信,除非普通应用也使用系统签名。

3、不同IPC所适用的场景

     其中Binder是AIDL、Messenger、ContentProvider的底层实现,因此这三种所适用的场景,Binder都可以实现。其他IPC所使用场景如图一所示。

图一 IPC方式的优缺点和使用场景

相关文章

网友评论

    本文标题:IPC笔记

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