导航:首页 > 操作系统 > Android进程之间的通信

Android进程之间的通信

发布时间:2023-05-30 00:06:20

android开发中跨进程通信有几种方式

  1. Activity可以跨进程调用其他应用程序;

  2. Content Provider可以跨进程访问其他应用程序中的数据;

  3. Broadcast可以向android系统中所有应用程序发送广播;

  4. Content Provider返回的是Cursor对象,而Service返回的是java对象,这种可以跨进程通讯的服务叫AIDL服务;

Ⅱ android 进程间通信 rabbitmq

https://github.com/Harry-III/RabbitMQ-Android

上手了RabbitMQ?再来看看它的交换机(Exchange)吧
RabbitMQ的Java应用(1) -- Rabbit Java Client使用
RabbitMQ(三)入门 —— RabbitMQ的五种模式和四种交换机

本例子是改编自上面的github链接

1、android端不采用轮询的方式请求服务器,有点类似推送的感觉,能即时收到服务器的信息

1、将rabbitmq放到单独的进程中
2、重新定义一些方法

1、在多进程中通过 message.replyTo 方法将通信方式传递给 Service端

2、rabbitmq的管道创建是要在线程里面,否则会报错
3、如果有2个用户都采用一个管道(管道名 A),当服务器将信息都输送到A管道后,哪个用户处理消息快,哪个用户得到的信息就多,所以最好就是每个用户一个管道

本项目 github

RabbitMQClient .java

RabbitMQUtil .java

Ⅲ Android 使用Messenger实现跨进程之间通信

以前讲到跨进程通信,我们总是第一时间想到AIDL(Android接口定义语言),实际上,使用Messenger在很多情况下是比使用AIDL简单得多的。
大家看到Messenger可能会很轻易的联想到Message,然后很自然的进一步联想到Handler——没错,Messenger的核心其实就是Message以及Handler来进行线程间的通信。

以下是如何使用Messenger的步骤:

综上六步就能完成客户端与Service的跨进程双向通信过程:
客户端 -> Service -> 客户端
简单的例子(客户端向服务器端发送消息,服务器接收):

服务端主要是返给客户端一个IBinder实例,以供服务端构造Messenger,并且处理客户端发送过来的Message。当然,不要忘了要在Manifests文件里面注册.

客户端就主要是发起与服务端的绑定,以及通过onServiceConnected()方法来过去服务端返回来的IBinder,借此构造Messenger,从而可以通过发送Message的方式与服务端进行交互。

服务器接收消息后回复消息给客户端

客户端修改:
客户端需要添加一个handler用于接收消息

服务端修改:
在服务端的handler获取客户端发送的msg.replyTo

Ⅳ Android多进程通信之 Binder

在 Linux 中一个进程空间可以分为 用户空间 内核空间 ,不同的进程它们的用户空间数据不可共享,但是它们的内核空间的数据可共享,即所有进程共用 1 个内核空间。进程内用户空间和内核空间进行交互需通过系统调用。

Android 系统时基于 Linux 内核的,Linux 已经提供了多种 IPC 方式,如下:

所以,Android 为啥又单独弄出一个 Binder 呢?主要有如下原因:

直观地说,Binder 是 Android 中的一个类,它实现了 IBinder 接口;从 Android Framework 角度来说,Binder 是 ServiceManager 连接各种 Manager(ActivityManager、WindowManager...) 和相应 ManagerService 的桥梁;从 Android 应用层来说,Binder 是客户端和服务端进行通信的媒介,当 bindService 的时候,服务端会返回一个包含了服务端业务调用的 Binder 对象,通过这个 Binder 对象,客户端就可以获取服务端提供的服务或者数据,这里的服务包括普通服务和基于 AIDL 服务。

Binder 定义了四个角色:Server,Client,ServiceManager 和 Bidner 驱动,其中 Server、Client、ServiceManager 运行于用户空间,Binder 驱动运行于内核空间。

Binder 工作原理:

Ⅳ 了解Android进程间通信的四种方式

由于应用程序之间不能共享内存。在不同应用程序之间交互数据(跨进程通讯),在android 

SDK中提供了4种用于跨进程通讯的方式。这4种方式正好对应于android系统中4种应用程序组

件:Activity、Content Provider、Broadcast和Service。其中Activity可以跨进程调用其他应

用程序的Activity;Content Provider可以跨进程访问其他应用程序中的数据(以Cursor对象形

式返回),当然,也可以对其他应用程序的数据进行增、删、改操 作;Broadcast可以向

android系统中所有应用程序发送广播,而需要跨进程通讯的应用程序可以监听这些广播;

Service和Content Provider类似,也可以访问其他应用程序中的数据,但不同的是,Content 

Provider返回的是Cursor对象,而Service返回的是Java对象,这种可以跨进程通讯的服务叫

AIDL服务。

Ⅵ Carson带你学Android:全面剖析Binder跨进程通信原理

从而全方位地介绍 Binder ,希望你们会喜欢。

在本文的讲解中,按照 大角度 -> 小角度 去分析 Binder ,即:

从而全方位地介绍 Binder ,希望你们会喜欢。

在讲解 Binder 前,我们先了解一些 Linux 的基础知识

具体请看文章: 操作系统:图文详解 内存映射

Binder 跨进程通信机制 模型 基于 Client - Server 模式

此处重点讲解 Binder 驱动作用中的跨进程通信的原理:

原因:

所以,原理图可表示为以下:

所以,在进行跨进程通信时,开发者只需自定义 Client & Server 进程 并 显式使用上述3个步骤,最终借助 Android 的基本架构功能就可完成进程间通信

注册服务后, Binder 驱动持有 Server 进程创建的 Binder 实体

此时, Client 进程与 Server 进程已经建立了连接

Client 进程 根据获取到的 Service 信息( Binder 代理对象),通过 Binder 驱动 建立与 该 Service 所在 Server 进程通信的链路,并开始使用服务

步骤1: Client 进程 将参数(整数a和b)发送到 Server 进程

步骤2: Server 进程根据 Client 进要求 调用 目标方法(即加法函数)

步骤3: Server 进程 将目标方法的结果(即加法后的结果)返回给 Client 进程

对比 Linux ( Android 基于 Linux )上的其他进程通信方式(管道、消息队列、共享内存、
信号量、 Socket ), Binder 机制的优点有:

特别地,对于从模型结构组成的Binder驱动来说:

不定期分享关于 安卓开发 的干货,追求 短、平、快 ,但 却不缺深度

Ⅶ Android:AIDL进程间通信基本框架

在某些业务场景下,我们需要在应用中单独开启一个进程进行一些操作。比如性能监控,如果让原始业务和性能监控本身的业务跑在同一个进程下,那么就会导致性能统计的数据的失真。

而进程间通信,一般采用AIDL机制的客户端与服务端通信。

AIDL只能传递如下几类数据:

当传递自定义 Parcelable 时,有三处地方需要注意:

当传递其他 aidl 接口时,同样必须要 import 这个 aidl 文件

编写完 aidl 文件后,make一下工程,会在 build 下的 generated 下的 source 下的 aidl 目录生成对应的接口类文件。aidl 接口其实就是 API 接口,通过实现对应接口类的 Stub 子类来实现具体的 API 逻辑;通过对应接口类的 Stub 子类的 asInterface 方法得到具体的实现类,调用具体的 API 方法。

一个基本的客户端服务端的通信结构一般包括如下功能

客户端的功能

服务端的功能

客户端的相关功能实现比较简单,麻烦的是服务端的功能。因为 AIDL 接口定义的都是服务端的接口,是由客户端来调用的。而想要实现服务端反向调用客户端则需要通过其他手段实现。

想要实现服务端主动连接客户端,最好的办法就是 服务端发送广播,客户端收到广播后再主动连接服务端 ,通过这种方式变相地实现服务端主动连接客户端的功能

想要实现服务端主动断开客户端,除了上面 发送广播是一种实现方式外,还可以通过 android 的系统API RemoteCallbackList,用包名作为key值来注册远程回调接口的方式,让服务端持有客户端的回调接口,服务端调用回调接口,客户端在回调接口中实现主动断开服务端 ,通过这种方式变量地实现服务端主动断开客户端的功能。而采用后者会显得更加优雅

既然所有的操作归根结底都是由客户端来完成的,那么客户端必须得有如下的功能模块:

服务端必须得有的功能模块:

那么,整体的通信流程就是如下的步骤:

首先是通信的 aidl 接口定义

然后是客户端的连接操作与断开连接操作,包括广播接收者的注册以及回调接口的实现

然后是客户端的拉取数据和推送数据操作

接着是服务端的 iBinder 接口的实现,完成回调接口的注册、业务子线程的开启和关闭、数据的推送和数据的拉取操作

然后是服务端的主动连接和主动断开连接操作

最后是服务端的 onUnbind 方法的实现,对回调接口进行反注册

服务端模仿 FloatViewPlugin 自定义插件,实现 IServicePlugin 接口,定制个性化的悬浮窗插件

客户端在 Appliaction 的 onCreate方法中初始化

在 MainActivity 上实现连接、断开、数据通信

Ⅷ Android进程间和线程间通信方式

        进程:是具有一定独立功能的程序关于某个数据集合上的一次运行活动,进程是系统进行资源分配和调度的一个独立单位。

  线程:是进程的一个实体,是CPU调度和分派的基本单位,它是比进程更小的能独立运行的基本单位。线程自己基本上不拥有系统资源,只拥有一些在运行中必不可少的资源(如程序计数器,一组寄存器和栈),但是它可与同属一个进程的其他的线程共享进程所拥有的全部资源。

  区别:

  (1)、一个程序至少有一个进程,一个进程至少有一个线程;

  (2)、线程的划分尺度小于进程,使得多线程程序的并发性高;

  (3)、进程在执行过程中拥有独立的内存单元,而多个线程共享内存,但线程之间没有单独的地址空间,一个线程死掉就等于整个进程死掉。

---------------------

一、Android进程间通信方式

1.Bundle

  由于Activity,Service,Receiver都是可以通过Intent来携带Bundle传输数据的,所以我们可以在一个进程中通过Intent将携带数据的Bundle发送到另一个进程的组件。

  缺点:无法传输Bundle不支持的数据类型。

2.ContentProvider

  ContentProvider是Android四大组件之一,以表格的方式来储存数据,提供给外界,即Content Provider可以跨进程访问其他应用程序中的数据。用法是继承ContentProvider,实现onCreate,query,update,insert,delete和getType方法,onCreate是负责创建时做一些初始化的工作,增删查改的方法就是对数据的查询和修改,getType是返回一个String,表示Uri请求的类型。注册完后就可以使用ContentResolver去请求指定的Uri。

3.文件

  两个进程可以到同一个文件去交换数据,我们不仅可以保存文本文件,还可以将对象持久化到文件,从另一个文件恢复。要注意的是,当并发读/写时可能会出现并发的问题。

4.Broadcast

  Broadcast可以向android系统中所有应用程序发送广播,而需要跨进程通讯的应用程序可以监听这些广播。

5.AIDL方式

  Service和Content Provider类似,也可以访问其他应用程序中的数据,Content Provider返回的是Cursor对象,而Service返回的是Java对象,这种可以跨进程通讯的服务叫AIDL服务。

         AIDL通过定义服务端暴露的接口,以提供给客户端来调用,AIDL使服务器可以并行处理,而Messenger封装了AIDL之后只能串行运行,所以Messenger一般用作消息传递。

6.Messenger

  Messenger是基于AIDL实现的,服务端(被动方)提供一个Service来处理客户端(主动方)连接,维护一个Handler来创建Messenger,在onBind时返回Messenger的binder。

  双方用Messenger来发送数据,用Handler来处理数据。Messenger处理数据依靠Handler,所以是串行的,也就是说,Handler接到多个message时,就要排队依次处理。

7.Socket

  Socket方法是通过网络来进行数据交换,注意的是要在子线程请求,不然会堵塞主线程。客户端和服务端建立连接之后即可不断传输数据,比较适合实时的数据传输

二、Android线程间通信方式

  一般说线程间通信主要是指主线程(也叫UI线程)和子线程之间的通信,主要有以下两种方式:

1.AsyncTask机制

  AsyncTask,异步任务,也就是说在UI线程运行的时候,可以在后台的执行一些异步的操作;AsyncTask可以很容易且正确地使用UI线程,AsyncTask允许进行后台操作,并在不显示使用工作线程或Handler机制的情况下,将结果反馈给UI线程。但是AsyncTask只能用于短时间的操作(最多几秒就应该结束的操作),如果需要长时间运行在后台,就不适合使用AsyncTask了,只能去使用Java提供的其他API来实现。

2.Handler机制

  Handler,继承自Object类,用来发送和处理Message对象或Runnable对象;Handler在创建时会与当前所在的线程的Looper对象相关联(如果当前线程的Looper为空或不存在,则会抛出异常,此时需要在线程中主动调用Looper.prepare()来创建一个Looper对象)。使用Handler的主要作用就是在后面的过程中发送和处理Message对象和让其他的线程完成某一个动作(如在工作线程中通过Handler对象发送一个Message对象,让UI线程进行UI的更新,然后UI线程就会在MessageQueue中得到这个Message对象(取出Message对象是由其相关联的Looper对象完成的),并作出相应的响应)。

三、Android两个子线程之间通信

  面试的过程中,有些面试官可能会问Android子线程之间的通信方式,由于绝大部分程序员主要关注的是Android主线程和子线程之间的通信,所以这个问题很容易让人懵逼。

  主线程和子线程之间的通信可以通过主线程中的handler把子线程中的message发给主线程中的looper,或者,主线程中的handler通过post向looper中发送一个runnable。但looper默认存在于main线程中,子线程中没有Looper,该怎么办呢?其实原理很简单,把looper绑定到子线程中,并且创建一个handler。在另一个线程中通过这个handler发送消息,就可以实现子线程之间的通信了。

  子线程创建handler的两种方式:

  方式一:给子线程创建Looper对象:

new Thread(new Runnable() {

            public void run() { 

                Looper.prepare();  // 给这个Thread创建Looper对象,一个Thead只有一个Looper对象

                Handler handler = new Handler(){ 

                    @Override 

                    public void handleMessage(Message msg) { 

                        Toast.makeText(getApplicationContext(), "handleMessage", Toast.LENGTH_LONG).show(); 

                    } 

                }; 

                handler.sendEmptyMessage(1); 

                Looper.loop(); // 不断遍历MessageQueue中是否有消息

            }; 

        }).start();

---------------------

       方式二:获取主线程的looper,或者说是UI线程的looper:

new Thread(new Runnable() {

            public void run() { 

                Handler handler = new Handler(Looper.getMainLooper()){ // 区别在这!!! 

                    @Override 

                    public void handleMessage(Message msg) { 

                        Toast.makeText(getApplicationContext(), "handleMessage", Toast.LENGTH_LONG).show(); 

                    } 

                }; 

                handler.sendEmptyMessage(1); 

            }; 

        }).start();

---------------------

Ⅸ Android 跨进程通信--Binder篇

话说Binder 其实是由George Hoffman 老哥,在1991年Be公司启动了一个“openBinder”的项目,该项目的宗旨是研究一个高效的信号传递工具,允许多个软件相互合作,构成一个软件系统。在BE被parmSource收购以后,openBinder由hackborn继续开发。在Hackborn加入google之后,他继续开发出了Android Binder。

而Android系统是基于Linux内核实现的,Linux已经提供了多种进程间通信机制,比如:管道、消息队列、共享内存和套接字(Socket)等等。

讲它们优缺点前先补充说明:
“进程隔离”--这个技术是为了避免进程A写入进程B的情况发生。 进程的隔离实现,使用了虚拟地址空间进程A的虚拟地址和进程B的虚拟地址不同,这样就防止进程A将数据信息写入进程B。进程隔离的安全性通过禁止进程间内存的访问可以方便实现。相比之下,一些不安全的操作系统DOS能够允许任何进程对其他进程的内存进行写操作。

“虚拟内存”-- 是计算机系统内存管理的一种技术。它使得应用程序认为它拥有连续可用的内存(一个连续完整的地址空间),而实际上,它通常是被分隔成多个物理内存碎片,还有部分暂时存储在外部磁盘存储器上,在需要时进行数据交换。与没有使用虚拟内存技术的系统相比,使用这种技术的系统使得大型程序的编写变得更容易,对真正的物理内存的使用也更有效率。

注意: 虚拟内存 不只是“用磁盘空间来扩展物理内存”的意思——这只是扩充内存级别以使其包含硬盘驱动器而已。把内存扩展到磁盘只是使用虚拟内存技术的一个结果,它的作用也可以通过覆盖或者把处于不活动状态的程序以及它们的数据全部交换到磁盘上等方式来实现。对虚拟内存的定义是基于对地址空间的重定义的,即把地址空间定义为“连续的虚拟内存地址”,以借此“欺骗”程序,使它们以为自己正在使用一大块的“连续”地址。

Ⅹ Android进程间通信

1. 简要说说进程与线程的区别和联系。

2. 应用内使用多进程可能导致哪些问题?

当一个APP启用了多进程后,系统会为不同的进程分配不同的内存空间,因此所有需要通过内存共享的行为都会失败。另外,还会导致以下几个问题:

3. Android中有哪些进程间通信方式?

由于不同的进程拥有不同的数据空间,所以无论是应用内还是应用间,均无法通过共享内存来实现进程间通信。

进程和线程的主要区别(总结) - CSDN

线程和进程的区别是什么? - 知乎

Android 多进程通信之几个基本问题

面试题:IPC(跨进程通信)

阅读全文

与Android进程之间的通信相关的资料

热点内容
午马全部电影名字韩剧 浏览:572
命令方块如何喷方块 浏览:609
程序员都年薪几十万吗 浏览:211
台湾电影补课老师,强上女学生电影叫什么 浏览:132
浏览器加密套件 浏览:439
jsphp传参数 浏览:641
欧美电影推荐大尺码 浏览:375
微信文件夹找用户名 浏览:30
武动干坤同人小说免费阅读 浏览:616
怎么找小度语音app 浏览:160
车险具体折扣算法 浏览:367
时借时花app怎么找不到了 浏览:740
压缩图片500k 浏览:243
程序员笔记本选锐龙r7400u 浏览:353
服务器如何查看cpu配置 浏览:615
北京复盛压缩机 浏览:89
烟台汽车空调压缩机 浏览:389
pythonopencvdct 浏览:27
h3c接口配置命令 浏览:780
安卓手机怎么连接不上苹果耳机 浏览:153