Android系统的跨进程简介

为什么不能直接跨进程通信?

为了安全考虑,应用之间的内存是无法互相访问的,各自的数据都存在于自身的内存区域内。

如何跨进程通信?

要想跨进程通信,就要找到一个大家都能访问的地方,例如硬盘上的文件,多个进程都可以读写该文件,通过对该文件进行读写约定好的数据,来达到通信的目的。

Android中的跨进程通信采用的是Binder机制,其底层原理是共享内存。

Binder机制

  • Android中的跨进程通信采用的是Binder机制。
  • Binder在linux层面属于一个驱动,但是这个驱动不是去驱动一个硬件,而且驱动一小段内存。
  • 不同的应用通过对一块内存区域进行数据的读、写操作来达到通信的目的。
  • 不同的应用在同一内存区域读写数据,为了告知其他应用如何理解写入的数据,就需要一个说明文件,这就是AIDL。当两个应用持有相同的AIDL文件,就能互相理解对方的的意图,就能做出相应的回应,达到通信的目的。

系统服务

什么是系统服务?

由android系统提供的服务,以供应用程序调用,来操作手机。如果应用能直接操作手机,后果将不堪设想,为了安全性和统一性,所有手机操作都将由系统来完成,应用通过发送消息给系统服务来请求操作。系统服务就是系统开放给应用端的操作接口,类似于Web服务开放出来的接口。

我们通过context. getSystemService可以获取到系统服务的代理对象,该代理对象内部有一个系统服务的远程对象引用。代理对象和系统服务有相同的api接口,我们调用代理对象,代理对象会调用远程对象,远程对象通知系统服务,这样操作起来就像直接访问系统服务一样轻松。

系统服务和应用端的通信机制

  • 系统服务XxxService

是一个Binder类的子类,一旦创建后,就开启一个线程死循环用来检测某段内存是否有数据写入

  • Binder驱动

自身创建时,创建一个XxxRemote远程对象,存放到Binder驱动中,XxxRemote远程对象可以和XxxService系统服务通信

  • 应用端

通过context. getSystemService()获取XxxServiceProxy对象,该对象内部引用了XxxRemote对象, XxxServiceProxy和XxxService具有相同的API,我们调用XxxServiceProxy时,XxxServiceProxy就调用XxxRemote并等待XxxRemote返回。XxxRemote会往某段内存中写入数据,写完后就开始监视该内存区域,Binder驱动会把XxxRemote写入的数据拷贝到XxxService监视着的内存区域,当XxxService一旦发现有数据,就读取并进行处理,处理完毕后,就写入该区域,这是Binder驱动又会把该数据拷贝到XxxRemote监视的内存区域,当XxxService发现内存区域有数据读取该区域数据,并把内容返回给XxxServiceProxy。这样就完成了一次进程间的通信。

所以一个系统服务会产生两个Binder对象,一个是运行在系统中的系统服务本身,一个是存放到Binder驱动中的远程对象。所不同的是系统服务Binder对象对开启一个线程监听消息,远程对象不会,它是运行在调用者的线程中。

客户端也可以不使用系统服务的远程Binder对象,而是自己创建一个Binder对象,通过Binder驱动和系统服务进行关联,这样的好处客户端可以随时通知系统服务,系统服务也可以随时通知客户端,而不是像上面所说的系统服务只能被动的等着客户端调用。

Binder间的通信机制

Binder对象都有各自的内存区域,当Binder1想要向Binder2发送数据时,就会把数据写入自己的内存区域,然后通知Binder驱动,Binder驱动会把数据拷贝到Binder2的内存区域,然后通知Binder2进行读取,Binder读取完毕后,将把数据写入binder2的内存区域,然后通知Binder驱动,Binder驱动将会把数据拷贝到Binder1的内存区域中。这样就完成了一次通信。

如果Binder1是系统服务,Binder2是系统服务的远程对象,这样任何应用程序在获取了Binder2的引用后,都可以和Binder1进行通信。但是缺点也很明显,只能由应用端请求系统服务,系统服务不能主动去联系应用端。WifiManagerService之类的就是采用这种方式。

还有一种方式是Binder1是系统服务,Binder2是应用端创建的Binder对象,他们两者通过Binder驱动进行连接后,应用端可以主动调系统服务,系统服务也可以主动调用应用端。WindowManagerService就是采用的这种方式。

IPC

进程间通信或跨进程通信,是指两个进程间进行数据交换的过程。

PRC:远程过程调用

多进程

线程是CPU调度的最小单元,同时线程是一种有限的系统资源。而进程一般指一个执行单元,在PC和移动设备上指一个程序或者一个应用。一个进程可以包含多个线程,因此进程和线程是包含与被包含的关系。

  • Intent
  • Bundle
  • 共享文件
  • SharedPrefrence
  • ContentProvider
  • Messenger
  • AIDL
  • Binder
  • Socket

Android中的多进程模式

  • 一个应用中存在多个进程的情况
  • 多个应用间的多进程
android:process=":remote" 私有进程
android:process="com.google.googleplay.remote" 全局进程

序列化

序列化,反序列化,持久化

Serializable

Java提供的一个序列化接口

序列化流

  • ObjectInputStream
  • ObjectOutputStream

Parcelable

Android提供的序列化接口

Binder

实现IBinder接口,是Android的一种跨进程通信方式,是客户端和服务端进行通信的媒介

  • IBinder
  • Binder
  • Stub

当客户端发起远程请求时,由于当前线程会被挂起直至服务端进程返回数据,所有一个远程方法是很耗时的,那么不能在UI线程中发起此远程请求;由于服务端的Binder运行在Binder的线程池中,所以Binder方法不管是否耗时都采用同步的方式去实现,因为它已经运行在一个线程中了

Binder死亡代理

  • linkToDeath()
  • unlinkToDeath()

共享文件

一个进程序列化对象到sd上的一个文件,另一个进程反序列化sd上的一文件

Messenger

底层实现是AIDL,一次处理一个请求,不用考虑线程同步的问题,主要作用是传递消息

AIDL

  • 只支持方法,不支持静态常量
  • AIDL的包结构在服务端和客户端要保持一致

RemoteCallbackList

  • 实现了同步功能

Android的跨进程通信相关推荐

  1. 再谈Android Binder跨进程通信原理

    在谈Android的跨进程通信问题上时,总会问到Android的IPC机制,是指两个进程之间进行数据交换的过程.按操作系统的中的描述,线程是CPU调度最小的单元,同时线程是一种有限的系统资源,而进程是 ...

  2. Android Messenger跨进程通信相关学习总结

    Messenger是什么? Messenger是对AIDL的封装,AIDL又是基于Binder机制实现的,使用Messenger能使我们更简单的实现进程间通信 优势在于我们可以免于自己去定义.aidl ...

  3. 【Binder】Android 跨进程通信原理解析

    前言 在Android开发的过程中,用到跨进程通信的地方非常非常多,我们所使用的Activity.Service等组件都需要和AMS进行跨进程通信,而这种跨进程的通信都是由Binder完成的. 甚至一 ...

  4. Android中的跨进程通信方法实例及特点分析(二):ContentProvider

    1.ContentProvider简单介绍 在Android中有些数据(如通讯录.音频.视频文件等)是要供非常多应用程序使用的.为了更好地对外提供数据,Android系统给我们提供了Content P ...

  5. Android跨进程通信一 Messenger

    实现客户端与服务端之间的交互 说明:         Messenger是信使的意思,从它的名字就可以了解到它充当着信差的角色.Android通过它实现跨进程通信,主要有客户端信使与服务端信使两种角色 ...

  6. Android 跨进程通信大总结

    转载请标明出处:http://blog.csdn.net/zhaoyanjun6/article/details/111553746 本文出自[赵彦军的博客] 文章目录 1.Android进程 2.修 ...

  7. android四个组件的跨进程通信

    Android四大组件(Activity,service,broadcast,Content Provider)跨进程通信相信在android项目中进程用到,此处将一一做以说明以及总结. 1.简括: ...

  8. Android之解决aidl里面函数参数太大不能跨进程通信的问题

    问题: 因为做的截屏拍照是跨进程通信的,所以需要用aidl,但是参数传递用的byte[] image,网上查了下aidl传递的基本参数类型,没有byte[], 然后把图片转化成String,结果时候接 ...

  9. Android组件化跨进程通信框架Andromeda解析

    关于组件化 随着项目结构越来越庞大,模块与模块间的边界逐渐变得不清晰,代码维护越来越困难,甚至编译速度都成为影响开发效率的瓶颈. 组件化拆分是比较常见的解决方案,一方面解决模块间的耦合关系.将通用模块 ...

最新文章

  1. [python] 溜了,溜了,七牛云图片资源批量下载 自建图床服务器
  2. HashMap 1.7工作原理
  3. (网络编程)TCP实现聊天
  4. GraphQL入门之工程搭建
  5. java空心三角形_java经典算法_019打印三角形(空心,实心)
  6. 把对方陷入困境中(博弈论的诡计)
  7. 科聊——即时通信软件原型设计
  8. Mybatis 动态传入order by 参数排序无效
  9. 一个神奇的???whatever~~
  10. java.io.Serializab接口
  11. Extjs介绍及视频教程
  12. 文字转语音怎么在线生成MP3格式的音频?
  13. kali功能介绍及安装(超详细)
  14. 首届CCF计算机职业资格认证考试题解(C++)
  15. ForeSpider数据采集软件之链接抽取
  16. 解析微信小程序真正的作用
  17. css文本行高是哪个属性_css属性行高line-height的用法详解
  18. 【日常问题】chrome开启无痕模式,屏蔽第三方cookie
  19. 【BZOJ1455】罗马游戏(左偏树)
  20. 关于Codeforces的一点事

热门文章

  1. 微软 ibm novell云计算大会印象记
  2. WL 2009 professional【已解决】谢谢nooby跟海风
  3. 行路的心情-让自己慢下来(11)
  4. 为什么企业需关心DDoS攻击?—Vecloud微云
  5. Oracle中启动和关闭的各种方式
  6. web頁面優化以及SEO
  7. ListListObject list = new ArrayListListObject(); 求回答补充问题 list.get(position).add(Object);为什么会...
  8. AES加密补位填充的一个问题
  9. 观《phonegap第三季 angularjs+ionic视频教程 实时发布》学习笔记(一)
  10. Memcached安装和基本使用