Android的跨进程通信_Jack-Chan的博客-程序员宅基地

技术标签: 系统服务  messenger  Android高级  跨进程通信  binder  aidl  

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工作原理

Binder死亡代理

  • linkToDeath()
  • unlinkToDeath()

共享文件

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

Messenger

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

Messenger工作原理

AIDL

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

RemoteCallbackList

  • 实现了同步功能
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/axi295309066/article/details/60133525

智能推荐

云计算、云原生与容器学习笔记-基础概念_Sindweller5530的博客-程序员宅基地

集中式还是分布式?关于云的架构,我目前还是比较混乱。。。一般情况下,有一个包含大量物理计算资源的云计算中心,从海量用户或终端设备收集的数据发送到云计算中心去计算并返回。边缘计算为什么需要边缘计算?云计算中心有可能离用户很远,用户需要经过多跳连接到云计算中心。可能导致的问题就是会有较大的时延,并且带宽也降低了,不能及时返回指令是很可怕的事情。那就会想让云计算能力跨越广域网,延伸到网络边缘来提供计算、存储和网络带宽。边缘站点更靠近用户,对于视频直播这种实时性要求很高的服务来说会比云计算中心处理并多跳

Java——模拟实现ArrayList和LinkedList类(一)_monologuezjp的博客-程序员宅基地

由于数组一旦定义,其长度就无法改变,某些情况下给我们的编程带来了不便。Java提供了两个集合——ArrayList类和LinkedList类,用来代替数组,有效解决了数组长度不能动态改变的问题。为了加深对数组和这两个集合类的理解,于是模拟这两个类实现了两个Box类,用来代替Array。为了方便,这里只实现了存储int类。模拟实现ArrayListArrayList 的好处是:可以动态增...

用Eclipse调试Node.js代码_赶路人儿的博客-程序员宅基地_eclipse调试js代码

1、在eclipse上安装v8插件: 1)Help>Install New Software ,在弹出的界面上点击Add,然后输入name和location两个信息,如下图:Name:随便取一个;location:http://chromedevtools.googlecode.com/svn/update/dev/注:安装的时候需要使用vpn,因为这里的地址是请求到了go

【考研高数-线性代数-强化】第四章 线性方程组(重点,别马虎大意)_刘鑫磊up的博客-程序员宅基地

【考研高数-线性代数-基础】第四章 线性方程组【重点】课本讲义:P82~P111一:网络结构网络图二:基本内容与重要结论1.基础知识2.主要定理三:典型例题1.基础解系2.解方程组Ax=b通用方程组求解: 1.已知方程组 同解变形(行变换)讨论参数 2.抽象方程组 秩、解的结构、推理分析一:齐次方程组Ax=0 n-r(A)线性无关的解向量、基础解系二:非齐次方程组Ax=b 有解判...

73.ORM聚合函数详解:Count_长大的小蚂蚁的博客-程序员宅基地

Count:用来求某个数据的个数。在以下所有的示例中所采用的模型为:from django.db import models# 定义作者模型class Author(models.Model): name = models.CharField(max_length=100, unique=True) age = models.IntegerField() ema...

ZUPT的相关初步理解_slam让我头疼的博客-程序员宅基地_zupt算法

参考至https://zhuanlan.zhihu.com/p/115529319零速修正(Zero Velocity Update, ZUPT)即,当载体处于静止状态时,载体此时的速度为零,利用载体中的惯性系统的解算速度作为系统速度误差的观测量,对其他误差量进行修正,改善静止状态下的组合导航结果,不需要增加外部传感器,因而是一种有效且廉价易实现的技术。零速修正一般方法利用卡尔曼滤波进行。当检测到载体处于静止状态时,利用SINS子系统解算的速度作为系统速度误差的观测量,进行卡尔曼滤波估计,利用更新后的

随便推点

mysql zimbra_Zimbra 相关设置_爱家小厨酱的博客-程序员宅基地

zimbra 相关的一些设置,不定期更新。更换 Logo 图标和链接mkdir /opt/zimbra/jetty/webapps/zimbra/logos/zmprov mcf zimbraSkinLogoURL https://mail.exsvc.cnzmprov md exsvc.cn zimbraSkinLogoURL https://mail.exsvc.cnzmprov md exs...

提升 iOS 开发效率! Xcode 9 内置模拟器的9个技巧_weixin_34324081的博客-程序员宅基地

iOS模拟器是在开发任意iOS应用程序过程中不可或缺、无法被忽视的一个部分。值得一提的是,Xcode 9的新模拟器带来了很多有用的功能,能够提升你的开发效率。对比历代模拟器的更新,这次有了很重大的改变。所以让我们开始这篇教程的重点吧,本文会列出我在新iOS模拟器中发现的新功能(一些技巧也可以在旧的模拟器中使用)。1. 在全屏模式下使用Xcode模拟器当你使用13寸的 Mac 时,Xcode ...

MySQL 基础 ———— 视图的应用与总结_圣斗士Morty的博客-程序员宅基地

引言视图是一种虚拟表,和普通表的使用是一样的,视图的一大特点就是“临时性”,是通过表动态生成的数据,只保存SQL逻辑,不保存查询结果。视图在实际生产中主要有两种应用场景:1、多个地方用到同样的查询结果;2、该查询使用的SQL比较复杂。下面,我们来总结一下这个在开发中经常会用到的知识点。一、视图的优势首先,视图并不能提高SQL的性能,它的作用在于更好的组织数据。优势有以下...

Mirai实现QQ机器人_只是六号z的博客-程序员宅基地_mirai机器人

Mirai实现机器人Java实现QQ机器人教程1.拉取项目demo2.修改配置文件3.滑动窗口验证(1)配置JVM参数(2)启动项目(3)获取ticket①让手机和电脑连接②开启调试模式③进行滑动验证4.简单测试Java实现QQ机器人教程要想实现Java版的QQ机器人,其实并不难,今天就给大家分享一下使用Mirai框架制作简单的QQ机器人。1.拉取项目demo首先,Miari是一个开源的框架,我们可以从GitHub上拉取项目进行查看,但是GitHub需要使用加速插件才能很好的访问,所以在这里我们可以

在centOs 上搭建nginx来部署静态页面网站_weixin_34392435的博客-程序员宅基地

2019独角兽企业重金招聘Python工程师标准>>> ...

LibreOJ #2036. 「SHOI2015」自动刷题机_weixin_30302609的博客-程序员宅基地

#2036. 「SHOI2015」自动刷题机内存限制:256 MiB时间限制:1000 ms标准输入输出题目类型:传统评测方式:文本比较题目描述曾经发明了信号增幅仪的发明家 SHTSC 又公开了他的新发明:自动刷题机——一种可以自动 AC 题目的神秘装置。自动刷题机刷题的方式非常简单:首先会瞬间得出题目的正确做法,然后开始写程序。每秒,自动刷...