Android IPC(一)跨进程通讯的几种方式、作用

下一篇:Android IPC(二)Messenger实现跨进程双向通信

一丶跨进程通信作用

  • 数据传输:一个进程需要将它的数据发送给另一个进程,发送的数据量在一个字节到几M字节之间。
  • 共享数据:多个进程要操作共享数据,一个进程对共享数据。
  • 信息传递:一个进程需要向另一个进程发送消息,通知它发生了某种事件。
  • 资源共享:多个进程之间共享同样的数据。为了做到这一点,需要内核提供锁和同步机制。
  • 进程控制:有些进程希望完全控制另一个进程的执行,此时控制进程希望能够拦截另一个进程的所有陷入和异常,并能够及时知道它的状态改变。

二丶进程间通信的概念

每个进程各自有不同的用户地址空间,任何一个进程的变量在另一个进程中都是看不到的,所以进程之间要交换数据必须通过内核,在内核中开辟出一块缓冲区。一个进程把自己的数据从用户空间拷贝到内核缓冲区,另一个进程再从内核缓冲区把数据读走。内核提供的这种机制称为进程间通信(IPC,Inter Process Communication)

三丶Linux 通信的几种方式

Linux进程间基本的通信方式主要有:管道(pipe)(包括匿名管道和命名管道)、信号(signal)、消息队列(queue)、共享内存信号量套接字

3.1、管道

管道的实质是一个内核缓冲区,管道的作用正如其名,需要通信的两个进程在管道的两端,进程利用管道传递信息。管道对于管道两端的进程而言,就是一个文件,但是这个文件比较特殊,它不属于文件系统并且只存在于内存中。

管道依据是否有名字分为匿名管道和命名管道(有名管道),这两种管道有一定的区别。

匿名管道有几个重要的限制:

管道是半双工的,数据只能在一个方向上流动,A进程传给B进程,不能反向传递
管道只能用于父子进程或兄弟进程之间的通信,即具有亲缘关系的进程。
命名管道允许没有亲缘关系的进程进行通信。命名管道不同于匿名管道之处在于它提供了一个路径名与之关联,这样一个进程即使与创建有名管道的进程不存在亲缘关系,只要可以访问该路径,就能通过有名管道互相通信。

3.2、信号

信号是软件层次上对中断机制的一种模拟,是一种异步通信方式,进程不必通过任何操作来等待信号的到达。信号可以在用户空间进程和内核之间直接交互,内核可以利用信号来通知用户空间的进程发生了哪些系统事件。

信号来源:

信号事件的发生有两个来源:硬件来源,比如我们按下了键盘或者其它硬件故障;软件来源,最常用发送信号的系统函数是kill, raise, alarm和setitimer以及sigqueue函数,软件来源还包括一些非法运算等操作。

进程对信号的响应:

进程可以通过三种方式来响应信号:(1)忽略信号,即对信号不做任何处理,但是有两个信号是不能忽略的:SIGKLL和SIGSTOP;(2)捕捉信号,定义信号处理函数,当信号发生时,执行相应的处理函数;(3)执行缺省操作,Linux对每种信号都规定了默认操作。

3.3、消息队列

消息队列是消息的链表,具有特定的格式,存放在内存中并由消息队列标识符标识,并且允许一个或多个进程向它写入与读取消息

3.4、共享内存

使得多个进程可以可以直接读写同一块内存空间,是针对其他通信机制运行效率较低而设计的。

为了在多个进程间交换信息,内核专门留出了一块内存区,可以由需要访问的进程将其映射到自己的私有地址空间。进程就可以直接读写这一块内存而不需要进行数据的拷贝,从而大大提高效率。

需要注意的是:共享内存并未提供同步机制,在一个进程结束对共享内存的写操作之前,并无自动机制可以阻止另二个进程开始对它进行读取。所以,我们通常需要用其他的机制来同步对共享内存的访问。

3.5、信号量

信号量实质上就是一个标识可用资源数量的计数器,它的值总是非负整数。而只有0和1两种取值的信号量叫做二进制信号量(或二值信号量),可用用来标识某个资源是否可用。

3.6、套接字

套接字是更为基础的进程间通信机制,与其他方式不同的是,套接字可用于不同机器之间的进程间通信。

有两种类型的套接字:基于文件的和面向网络的。

(1).Unix套接字是基于文件的,并且拥有一个“家族名字”–AF_UNIX,它代表地址家族(address family):UNIX。

(2).第二类型的套接字是基于网络的,它也有自己的家族名字–AF_INET,代表地址家族(address family):INTERNET

不管采用哪种地址家族,都有两种不同的套接字连接:面向连接的和无连接的。

(1)面向连接的套接字(SOCK_STREAM):进行通信前必须建立一个连接,面向连接的通信提供序列化的、可靠地和不重复的数据交付,而没有记录边界。

这意味着每条信息可以被拆分成多个片段,并且每个片段都能确保到达目的地,然后在目的地将信息拼接起来。

实现这种连接类型的主要协议是传输控制协议(TCP)。

(2)无连接的套接字(SOCK_DGRAM):在通信开始之前并不需要建立连接,在数据传输过程中并无法保证它的顺序性、可靠性或重复性。

然而,数据报确实保存了记录边界,这就意味着消息是以整体发送的,而并非首先分成多个片段。

由于面向连接的套接字所提供的保证,因此它们的设置以及对虚拟电路连接的维护需要大量的开销。然而,数据报不需要这些开销,即它的成本更加“低廉”

实现这种连接类型的主要协议是用户数据报协议(UDP)。

四丶Android 通信的几种方式

Bundle&Intent

bundle实现了parcelable接口,在Android中不同的应用运行在不同的进程中。通过Intent启动其他应用的组件Activity,Service,Receiver。同时,可以将数据存储在Bundle中,然后设置在Intent中,就实现了第一种跨进程通讯IPC。

SharedPerference

不同的多个进程的应用,可以对磁盘里的同一个文件读写。SharedPerference就是xml文件存储键值对实现的。

但是,Android系统基于Linux内核,并没有对文件的读写做并发处理。因此有可能发生异常。

Activity

Activity的跨进程访问与进程内访问略有不同。虽然它们都需要Intent对象,但跨进程访问并不需要指定Context对象和Activity的 Class对象,而需要指定的是要访问的Activity所对应的Action(一个字符串)。有些Activity还需要指定一个Uri(通过 Intent构造方法的第2个参数指定)。

   在android系统中有很多应用程序提供了可以跨进程访问的Activity,例如,下面的代码可以直接调用拨打电话的Activity。
Intent callIntent = new  Intent(Intent.ACTION_CALL, Uri.parse("tel:12345678" );  
startActivity(callIntent);

Content Provider

Android应用程序可以使用文件或SqlLite数据库来存储数据。Content Provider提供了一种在多个应用程序之间数据共享的方式(跨进程共享数据)。应用程序可以利用Content Provider完成下面的工作

  1. 查询数据

  2. 修改数据

  3. 添加数据

  4. 删除数据

     虽然Content Provider也可以在同一个应用程序中被访问,但这么做并没有什么意义。Content Provider存在的目的向其他应用程序共享数据和允许其他应用程序对数据进行增、删、改操作。
    

Android系统本身提供了很多Content Provider,例如,音频、视频、联系人信息等等。我们可以通过这些Content Provider获得相关信息的列表。这些列表数据将以Cursor对象返回。因此,从Content Provider返回的数据是二维表的形式。

Broadcast

广播是一种被动跨进程通讯的方式。当某个程序向系统发送广播时,其他的应用程序只能被动地接收广播数据。这就象电台进行广播一样,听众只能被动地收听,而不能主动与电台进行沟通。
在应用程序中发送广播比较简单。只需要调用sendBroadcast方法即可。该方法需要一个Intent对象。通过Intent对象可以发送需要广播的数据。

Messager

如需让服务与远程进程通信,则可使用Messenger为服务提供接口。
定义一个MessengerService继承自Service,并在AndroidManifest.xml中声明并给一个进程名,使该服务成为一个单独的进程。

Messenger的使用方法:

服务端实现一个Handler,由其接收来自客户端的每个调用的回调。
Handler用于创建Messenger对象(对Handler的引用)。
Messenger创建一个IBinder,服务端通过onBind()使其返回客户端。
客户端使用IBinder将Messenger(引用服务的Handler)实例化,然后使用后者将Message对象发送给服务端。
服务端在其Handler中(具体地讲,是在handleMessage()方法中)接收每个Message。

AIDL

AIDL是一种接口描述语言,通常用于进程间通信。它用于让某个Service与多个应用程序组件之间进行跨进程通信,从而可以实现多个应用程序共享同一个Service.

使用AIDL的步骤:

创建AIDL,在main下新建一个文件夹aidl,然后在aidl下新建AIDL文件,这时系统会自动为该文件创建一个包名。
在java下新建一个类AIDLService继承自Service。
在AndroidManifest.xml中注册,并给一个进程名,是该服务成为一个独立的进程。
在MainActivity中进行与AIDLService之间的进程间通信。

Socket

Socket 通信和 Binder 通信类似,也是一种 C/S 模型的通信方式

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
### 回答1: Android 中的进程通信IPC)有以下几种方式: 1. Binder:是 Android 系统中最常用的 IPC 机制,它是一种高效、稳定、安全的进程通信方式,常用于 Service 和 Activity 之间通信。 2. Messenger:基于 Binder 实现的进程通信方式,可以向其他进程发送 Message。 3. AIDL:也是基于 Binder 实现的进程通信方式,使用 AIDL 定义接口,然后在客户端和服务端之间传递数据。 4. ContentProvider:提供了一种在多个应用程序之间共享数据的方式,其他应用程序可以通过 ContentResolver 访问 ContentProvider 中的数据。 5. Socket:通过套接字进行进程通信,常用于网络通信和本地进程通信。 6. BroadcastReceiver:通过 Intent 进行进程通信,可以在不同的应用程序之间传递消息。 以上是 Android 中常见的进程通信方式,不同的场景可以选择不同的方式来实现进程通信。 ### 回答2: Android进程通信方式有以下几种: 1. 使用Bundle:Bundle是一种存储数据的容器,在Android中可以用于进程通信。通过将数据存储在Bundle对象中,然后在不同的进程间传递Bundle对象来实现通信。 2. 使用Intent:Intent是一种在Android中用于传递消息和数据的对象。通过在不同的进程间发送Intent来实现进程通信。 3. 使用AIDL(Android Interface Definition Language):AIDL是一种用于定义进程接口的语言。通过在服务端定义AIDL接口,然后在客户端通过AIDL来调用服务端提供的接口,实现进程通信。 4. 使用Messenger:Messenger是一种轻量级的进程通信机制,它基于Handler和Binder机制。通过在不同的进程间传递Messenger对象,实现进程通信。 5. 使用ContentProvider:ContentProvider是一种用于在不同应用程序之间共享数据的组件。通过在ContentProvider中实现数据的读写操作,其他应用程序可以通过ContentResolver来访问和共享这些数据,实现进程通信。 通过以上几种方式Android应用程序可以实现不同进程间的通信,以满足不同的需求和场景。 ### 回答3: Android进程通信有以下几种方式: 1. Binder机制:Binder是Android中一种高效的进程通信机制,它是基于C/S架构的,通过将服务以Binder驱动的方式注册到系统Service Manager中,实现一对多或多对多的进程通信。 2. AIDL(Android Interface Definition Language):AIDL是Android进程通信接口定义语言,通过定义接口及数据类型,在服务端和客户端之间进行通信。AIDL框架提供了支持程序的IPC(Inter-Process Communication)功能。 3. Messenger:Messenger是基于AIDL封装的一种进程通信方式。通过Messenger可以实现进程间的消息传递,但是一次只能传递一个消息,不能进行数据的交互操作。 4. ContentProvider:ContentProvider是Android提供的一种进程通信方式,它通过对外共享数据的方式实现进程间的数据交换。ContentProvider可以对外提供访问数据库等共享数据的接口,并通过URI进行数据的增删改查操作。 5. Broadcast Receiver:广播接收器是一种全局的事件通知机制,可以在不同进程之间进行消息的发送和接收。通过广播接收器可以实现简单的进程通信,但是通信的内容只能是Intent对象。 6. Socket:Socket是一种传统的网络通信方式,通过网络套接字进行进程通信。在Android中,可以使用Socket实现不同进程之间的通信,但是相对于其他方式,Socket的效率较低。 以上是常见的Android进程通信方式,根据具体的需求和场景选择适合的方式可以有效实现进程间的数据交换和消息传递。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

王睿丶

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值