关闭

Android 进阶13:几种进程通信方式的对比总结

标签: android进程间通信
4861人阅读 评论(7) 收藏 举报
分类:
  • 不花时间打基础,你将会花更多时间解决那些不必要的问题。

读完本文你将了解:

RPC 是什么

RPC 即 Remote Procedure Call (远程过程调用) 是一种计算机通讯协议,它为我们定义了计算机 C 中的程序如何调用另外一台计算机 S 的程序,让程序员不需要操心底层网络协议,使得开发包括网络分布式多程序在内的应用程序更加容易。

RPC 是典型的 Client/Server 模式,由客户端对服务器发出若干请求,服务器收到后根据客户端提供的参数进行操作,然后将执行结果返回给客户端。

RPC 位于 OSI 模型中的会话层:
这里写图片描述

在面向对象编程中,它也被叫做 “远程方法调用”。

IDL 是什么

RPC 只是一种协议,规定了通信的规则。

在实际工作中客户端与服务端会有各种各样的平台,就好像日常开发一样,为了统一处理不同的实现,需要定义一个共同的接口,于是有了 IDL。

IDL 即 Interface Description Language (接口定义语言)。

它通过一种中立的方式来描述接口,使得在不同平台上运行的对象和用不同语言编写的程序可以相互通信交流。比如,一个组件用 C++ 写成,另一个组件用 Java 写,仍然可以通信。

这里写图片描述

IPC 是什么

IPC 即 Inter-Process Communication (进程间通信)。

Android 基于 Linux,而 Linux 出于安全考虑,不同进程间不能之间操作对方的数据,这叫做“进程隔离”。

“进程隔离”更详细的介绍(节选自:http://blog.csdn.net/u010132993/article/details/72582655):

在 Linux 系统中,虚拟内存机制为每个进程分配了线性连续的内存空间,操作系统将这种虚拟内存空间映射到物理内存空间,每个进程有自己的虚拟内存空间,进而不能操作其他进程的内存空间,只有操作系统才有权限操作物理内存空间。
进程隔离保证了每个进程的内存安全。

但是在大多数情形下,不同进程间的数据通讯是不可避免的,因此操作系统必须提供跨进程通信机制。

Android 几种进程通信方式

跨进程通信要求把方法调用及其数据分解至操作系统可以识别的程度,并将其从本地进程和地址空间传输至远程进程和地址空间,然后在远程进程中重新组装并执行该调用。

然后,返回值将沿相反方向传输回来。

Android 为我们提供了以下几种进程通信机制(供开发者使用的进程通信 API)对应的文章链接如下:

在上述通信机制的基础上,我们只需集中精力定义和实现 RPC 编程接口即可。

如何选择这几种通信方式

《Android 开发艺术探索》中总结的已经比较全面了:

这里写图片描述

这里再对比总结一下:

  • 只有允许不同应用的客户端用 IPC 方式调用远程方法,并且想要在服务中处理多线程时,才有必要使用 AIDL
  • 如果需要调用远程方法,但不需要处理并发 IPC,就应该通过实现一个 Binder 创建接口
  • 如果您想执行 IPC,但只是传递数据,不涉及方法调用,也不需要高并发,就使用 Messenger 来实现接口
  • 如果需要处理一对多的进程间数据共享(主要是数据的 CRUD),就使用 ContentProvider
  • 如果要实现一对多的并发实时通信,就使用 Socket

Thanks

《Android 开发艺术探索》
https://zh.wikipedia.org/wiki/%E9%81%A0%E7%A8%8B%E9%81%8E%E7%A8%8B%E8%AA%BF%E7%94%A8
https://zh.wikipedia.org/wiki/%E6%8E%A5%E5%8F%A3%E6%8F%8F%E8%BF%B0%E8%AF%AD%E8%A8%80
http://blog.csdn.net/u010132993/article/details/72582655
https://developer.android.com/guide/components/processes-and-threads.html

1
0
查看评论

Android 进程间通信的几种实现方式

一、概述        由于应用程序之间不能共享内存。在不同应用程序之间交互数据(跨进程通讯),在android SDK中提供了4种用于跨进程通讯的方式。这4种方式正好对应于android系统中4种应用程序组件:Activity、Content Provid...
  • zhuangyalei
  • zhuangyalei
  • 2016-01-14 09:53
  • 21857

Android:进程间通信交互

Intent 的 ComponentName 广播-BroadcastReceiver ContentProvider AIDL
  • bdmh
  • bdmh
  • 2015-12-08 10:04
  • 5199

Android 基于Message的进程间通信 Messenger完全解析

转载请标明出处: http://blog.csdn.net/lmj623565791/article/details/46858663; 本文出自:【张鸿洋的博客】 一、概述说到Android进程间通信,大家肯定能想到的是编写aidl文件,然后通过aapt生成的类方便的完成服务端,以及客...
  • lmj623565791
  • lmj623565791
  • 2015-07-23 09:58
  • 60312

Android进程间通信(IPC)机制Binder简要介绍和学习计划

在Android系统中,每一个应用程序都是由一些Activity和Service组成的,这些Activity和Service有可能运行在同一个进程中,也有可能运行在不同的进程中。那么,不在同一个进程的Activity或者Service是如何通信的呢?这就是本文中要介绍的Binder进程间通信机制了。
  • Luoshengyang
  • Luoshengyang
  • 2011-07-20 02:36
  • 382762

Android IPC机制(二)用Messenger进行进程间通信

本来想写Binder的,笔者很多年前研究Android Native Framework时才了解到的,实话说对应用层的开发帮助不大,网上文章也比较多,如果想了解可以参考Android Bander设计与实现 - 设计篇这篇文章。另外在看这篇文章前最好看一下本文章的前篇Android IPC机制(一)...
  • itachi85
  • itachi85
  • 2016-01-03 11:53
  • 4836

Android进程间通信(IPC)常用方式

进程间通信方式在Android开发中我们可以通过Intent、ContentProviders来实现进程间通信,如果不限于Android特有的话,我们还可以使用File、Socket等方式,反正只要进程间能交换信息就行了。像Intent,我们平时使用的时候好像都没感觉出是在进程间通信。其实Andro...
  • fiendvip
  • fiendvip
  • 2016-03-30 17:31
  • 3416

Android 进程间通讯四种方式

android系统中应用程序之间不能共享内存,在android SDK中提供了4种用于跨进程通讯的方式。这4种方式正好对应于android系统中4种应用程序组件:Activity、Content Provider、Broadcast和Service。1、Activity可以跨进程调用其他应用程序的A...
  • hedong316
  • hedong316
  • 2016-01-20 14:43
  • 9557

【进程间通信】Android 进程间通信的几种实现方式

一、整体结构下面将逐一介绍4种通讯方式二、4种通讯方式1、ActivityAndroid内置了许多可供其他程序跨进程访问的Activity,比如跳至打电话页面(指定Action,uri跨进程访问) Intent callIntent = new Intent(Intent.ACTION_CA...
  • Tomasyb
  • Tomasyb
  • 2017-06-06 14:32
  • 442

Android中进程间通讯常见的几种方式以及使用场景

上一个星期看刚哥的书,主要进行了Android中IPC机制的学习,具体的实现方式网上有很多,我这里只是进行简单的总结。 Android中不同的进程中的组件,拥有独立的虚拟机,Application,以及内存空间,所以不能通过共享内存来进行数据交互。下面几种方法却可以实现数据交互。 介...
  • qdh186
  • qdh186
  • 2017-10-23 11:23
  • 181

android进程间通信学习一

由于android系统中应用程序之间不能共享内存。因此,在不同应用程序之间交互数据(跨进程通讯)就稍微麻烦一些。在android SDK中提供了4种用于跨进程通讯的方式。这4种方式正好对应于android系统中4种应用程序组件:Activity、Content Provider、Broadcast和...
  • victory08
  • victory08
  • 2013-03-20 14:18
  • 19206
    个人资料
    • 访问:1464574次
    • 积分:16296
    • 等级:
    • 排名:第764名
    • 原创:257篇
    • 转载:76篇
    • 译文:15篇
    • 评论:944条
    关于我
    测试播放器
    博客专栏
    最新评论
    统计