精华内容
下载资源
问答
  • Android 进程间的通信 ...Android 面试收集录14 Android 进程间通信方式 一篇文章了解相见恨晚的 Android Binder 进程间通讯机制 Broadcast、AIDL、ContentProvider、Messager的区别和适用场景 目录 ...

    Android 进程间的通信

    参考资料:
    几种进程通信方式的对比总结
    Android Binder 机制(一) Binder 的设计和框架
    Android 面试收集录14 Android 进程间通信方式
    一篇文章了解相见恨晚的 Android Binder 进程间通讯机制
    Broadcast、AIDL、ContentProvider、Messager的区别和适用场景

    目录

    Binder 通讯机制

    什么是 Binder

    Binder 是 Android 系统中进程间通讯( IPC )的一种方式,也是 Android 系统中最重要的特性之一。Android 中的四大组件 Activity , Service , Broadcast , ContentProvider ,不同的 App 等都运行在不同的进程中,它是这些进程间通讯的桥梁。正如其名“粘合剂”一样,它把系统中各个组件粘合到了一起,是各个组件的桥梁。

    Binder 架构

    Binder 模型

    Binder 通信采用 C-S 架构,它包含 Client、 Server、 ServiceManager 以及 Binder 驱动这四个组件,它们的工作就是让 Client 和 Server 进行通信。

    Binder 通信原理

    Client 和 Server

    如果 C-S 架构中的 Client 和 Server 属于同一进程的话,那么 Client 和 Server 之间的通信就非常容易。只需要在 Client 端先获取相应的 Server 端对象,再通过 Server 对象调用 Server 的相应接口即可。

    但是,Binder 机制中涉及到的 Client 和 Server 是位于不同的进程中的,这就意味着,不可能直接获取到 Server 对象。

    怎么办呢?

    解决方法是为 Client 提供一个 Server 的远程服务作为代理。Client 要和 Server 通信时,只需要调用该代理的相应接口,其作用就相当于直接拿到 Server 的对象。

    那么这个远程服务是如何帮 Client 代理的呢?

    首先我们要知道 Linux 系统下的内存划分为用户空间内核空间

    用户空间和内核空间

    用户空间是应用程序的运行空间,内核空间是 Linux 内核的运行空间。为了安全,它们是隔离的,即使用户的程序崩溃了,内核也不受影响。

    用户空间不能直接调用系统资源,必须通过系统接口,才能向内核发出指令,而内核空间可以执行任意命令,调用系统的一切资源。

    由于应用程序都运行在用户空间,并且互相隔离,所以如果不同的应用程序之间需要通信,则必须通过内核空间进行中转。这就好比以前不同地方的两个人通信需要借助邮局来传递信件一样。

    在上述 Binder 的四个组件中,Client 和 Server 位于用户空间,而 Binder 驱动位于内核空间,所以 Binder 驱动就扮演了“邮局”这样一个负责中转的角色。

    Binder 驱动

    在 Binder 驱动中,存在着一个个 Binder 实体,每一个 Binder 实体都保存了对应的 Server 的信息。

    ServiceManager

    ServiceManager 是一个特殊的 Server,负责 Server 的注册与查询,它在系统开机时启动。

    ServiceManager 中有一棵红黑树,用于存放 Binder 驱动中 Binder 实体的引用。Server 注册时,Binder 驱动会新建一个 Binder 实体,并在这棵树中添加该实体的引用。Server 的查询时,便是在这棵树上进行的。

    当应用程序启动时,ServiceManager 会和 Binder 驱动进行通信,告诉 Binder 驱动它是服务管理者。随后,Binder 驱动会为 ServiceManager 创建对应 Binder 实体,并将该 Binder 实体设为全局变量。方便后面 Client 和 Server 与 ServiceManager 进行通信。

    Client 获取远程服务代理

    上面说到,Client 要和 Server 通信,需要通过 Server 的远程服务作为代理。那么 Client 是如何获取到 Server 的远程服务的呢?

    Client 首先会向 Binder 驱动发起获取服务的请求。Binder驱动在收到该请求之后会将该请求转发给 ServiceManager 进程。随后,ServiceManager 会根据 Client 提供的 Server 的服务名,从红黑树中找到对应 Server 的引用信息,并将其返回给 Client 。

    Client 收到 Server 对应的 Binder 引用信息之后,就根据该 Binder 引用信息创建一个与 Server 对应的远程服务,这个远程服务就是我们所说的代理。

    Client 通过调用该远程服务的接口,就相当于在调用 Server 的服务接口一样。因为 Client 调用该 Server 的远程服务接口时,该远程服务会通过 Binder 驱动的 Binder 实体连接到真正的 Server 进行交互,从而执行相应的动作。

    总的流程

    1.系统启动
    ServiceManager -> Binder 驱动创建全局的 Binder 实体

    2.Server注册
    Server -> Binder 驱动创建 Binder 实体 -> ServiceManager 添加 Binder 引用

    3.Client 与 Server 通信

    Client -> Server 的远程服务 -> Binder 实体 -> Server

    AIDL

    Android Framework 层对 Binder 使用的封装,方便开发者使用。

    Server 端每收到一个请求,就会启动一个线程去响应。

    Client 端获取返回值是同步的。

    Messenger

    AIDL 的进一步封装,以串行的方式处理客户端发来的消息。

    Server 端收到的请求都会放在 Handler 的 MessageQueue 里面。

    Client 端获取返回值是异步的。

    ContentProvider

    AIDL 的封装,可以实现在应用程序中共享数据,并提供增删改查的功能。

    文件

    通过文件共享信息,如 SharedPreferences 。

    通过序列化对象到文件中,从文件中反序列化恢复对象。

    Socket

    通过 socket 实现一对一的网络传输。

    如何选择

    • 只有允许不同应用的客户端用 IPC 方式调用远程方法,并且想要在服务中处理多线程时,才有必要使用 AIDL
    • 如果需要调用远程方法,但不需要处理并发 IPC,就应该通过实现一个 Binder 创建接口
    • 如果您想执行 IPC,但只是传递数据,不涉及方法调用,也不需要高并发,就使用 Messenger 来实现接口
    • 如果需要处理一对多的进程间数据共享(主要是数据的 CRUD),就使用 ContentProvider
    • 如果要实现一对多的并发实时通信,就使用 Socket
    展开全文
  • IPC不是Android独有的,任何一个操作系统都需要有相应的IPC机制,比如Windows上可以通过剪贴板,管道和邮槽来进行进程间通信;Linux上可以通过命名管道、共享内容、信号量等进行进程间通信。 对于Android来说,它是...

    一、IPC的说明

    IPC是Inter-Process Communication的缩写,含义为进程间通信或跨进程通信,是指两个进程之间进行数据交换的过程。

    IPC不是Android独有的,任何一个操作系统都需要有相应的IPC机制,比如Windows上可以通过剪贴板,管道和邮槽来进行进程间通信;Linux上可以通过命名管道、共享内容、信号量等进行进程间通信。

    对于Android来说,它是一种基于Linux内核的移动操作系统,但它的进程间通信方式并不能完全继承自Linux;相反,它有自己的进程间通信方式。

    在Android中可以通过Binder轻松的实现进程间通信。Android还支持Socket,通过Socket可以实现任意两个终端之间的通信,同一设备的两个进程通过Socket通信自然也是可以的。

     

    二、Android中IPC的使用

    首先,只有面对多进程的情况才需要考虑进程间通信。多进程的情况分为两种:

    第一种是一个应用因为某些原因,自身需要采用多进程模式来实现,比如有些模块需要运行在单独的进程中、或者为了加大一个应用的可使用内存,需要通过多进程来获取多分内存空间。

    另一种是当前应用需要向其他的应用获取数据,所以必须采用跨进程的方式来获取数据,比如使用系统的ContentProvider去查询数据。

    通过给四大组件在AndroidMenifest中指定android:process属性,可以轻易地开启多进程模式。

     

    三、Android中IPC带来的问题

    两个应用共享数据:Android系统会为每个应用分配一个唯一的UID,具有相同UID的应用才能共享数据。两个应用通过ShareUID跑在同一个进程是有要求的,需要这两个应用有相同的ShareUID并且签名相同才可以。在这种情况下,他们可以相互访问对方的私有数据,比如data目录,组件信息等,不管他们是否跑在同一个进程。

    Android系统为每个应用分配了一个独立的虚拟机,或者说为每一个进程都分配一个独立的虚拟机,不同的虚拟机在内存分配上有不同的地址空间,这就导致在不同的虚拟机中访问同一个对象会产生多分副本。所有运行在不同进程中的四大组件,只要它们之间需要通过内存来共享数据,都会共享失败,这也是多进程带来的主要影响。

    一般来说,使用多进程会造成如下的问题:

    (1)静态成员和单例模式完全失效(不同的虚拟机中访问同一个对象会产生多分副本)

    (2)线程同步机制完全失效(不在同一块内存,不管是所对象还是锁全局类都无法保证线程同步)

    (3)SharePreferences的可靠性下降(不支持两个进程同时写操作)

    (4)Application会多次创建(因为创建新进程会分配独立虚拟机,相当于启动一个新的应用)

    虽说不能直接的共享内存,但是通过跨进程通信还是可以实现数据交互。

     

    四、Android中各种IPC方式

    1、使用Bundle

    四大组件中三大组件Activity、Service、Receiver都支持在Intent中传递Bundle数据。

    由于Bundle实现了Parcelable接口,所以它可以很方便的在不同的进程间传输数据。当然我们传输的数据必须能够被序列化,比如基本类型、实现了Parcelable接口的对象、实现了Serializable接口的对象以及一些Android支持的特殊对象。

    2、使用文件共享

    两个进程通过读写同一个文件来交换数据,比如A进程把数据写入文件,B进程通过读取这个文件来获取数据。

    Android系统基于Linux,使得并发读写文件可以没有限制的进行,甚至两个线程同时对文件读写操作都是允许的,尽管可能出问题,因此文件共享方式适合在对数据同步要求不高的进程间进行通信。

    SharedPreferences也属于文件的一种,但是由于系统对它的读写有一定的缓存策略,即在内存中会有一份SharedPreferences文件的缓存;因此在多进程模式下,系统对它的读写就变得不可靠,会有很大几率丢失数据,不建议在进程间通信中使用SharedPreferences。

    3、使用Messenger

    Messenger可以理解为信使,通过它可以再不同进程中传递Message对象,在Message中放入我们需要传递的数据,就可以实现数据的进程间传递了。

    Messenger是一种轻量级的IPC方案,它的底层实现是AIDL。由于它一次处理一个请求,因此在服务端不需要考虑线程同步的问题,因为服务端不存在并发执行的情形。

    4、使用AIDL

    AIDL是 Android Interface definition language的缩写,它是一种android内部进程通信接口的描述语言。AIDL可以处理发送到服务器端大量的并发请求(不同与Messenger的串行处理方式),也可以实现跨进程的方法调用。

    在Android中使用方法:创建一个Service和一个AIDL接口,接着创建一个类继承自AIDL接口中的Stub类并实现Stub中的抽象方法,在Service的onBind方法中返回这个类的对象,然后客户端绑定服务端Service,建立连接后就可以访问远程服务器了。

    5、使用ContentProvider

    ContentProvider是Android中提供的专门用于不同应用间进行数据共享的方式,天生适合进程间通信。

    ContentProvider的底层实现也是Binder,但是它的使用过程比AIDL简单的多,因为系统做了封装,使得无需关心细节即可轻松实现IPC。ContentProvider主要以表格的形式组织数据,和数据库很类似,但ContentProvider对底层的数据存储方式没有任何要求,既可以使用Sqlite数据库,也可以使用文件方式,甚至可以使用内存中的一个对象来存储。

    6、使用Socket

    Socket套接字,是网络通信中的概念,分为流式套接字和用户数据奥套接字两种,对应于网络的传输控制层中的TCP和UDP协议。

    两个进程可以通过Socket来实现信息的传输,Socket本身可以支持传输任意字节流。

    ===选择合适的IPC方式===,如下表

    名称优点缺点适用场景
    Bundle简单易用只能传输Bundle支持的数据类型四大组件的进程间通信
    文件共享简单易用

    不适合高并发场景,并且无法做到进程间

    即时通信

    无并发访问清醒,交换简单的数据,实时性不搞的场景
    AIDL功能强大,支持一对多并发通信,支持实时通信使用稍复杂,需要处理好线程同步一对多通信且有RPC需求
    Messenger功能一般,支持一对多串行通信,支持实时通信不能很好的处理高并发情形,不支持RPC,数据通过Message进行传输,因此只能传输Bundle支持的数据类型低并发的一对多即时通信,无RPC需求
    ContentProvider

    在数据源访问方面功能强大,支持一对多并发数据共享,

    可通过Call方法扩展其他操作

    可以理解为受约束的AICL,主要提供数据的CRUD数据一对多的进程间数据共享
    Socket功能强大,可以通过网络传输字节流,支持一对多并发实时通信实现细节稍微繁琐,不支持直接的RPC网络数据交换

    RPC(Remote Procedure Call,远程过程调用)是种C/S的编程模式,出于一种类比的愿望,在一台机器上运行的主程序,可以调用另一台机器上准备好的子程序。

    通过RPC可以充分利用非共享内存的多处理器环境,可以简便地将你的应用分布在多台工作站上,应用程序就像运行在一个多处理器的计算机上一样。

     

     五、Binder介绍

    Binder是Android系统进程间通信方式之一。Linux已经拥有的进程间通信IPC手段包括: 管道(Pipe)、信号(Signal)、跟踪(Trace)、插口(Socket)、报文队列(Message)、共享内存(Share Memory)和信号量(Semaphore)。

    Binder框架定义了四个角色:Server,Client,ServiceManager以及Binder驱动。

    其中Server,Client,ServiceManager运行于用户空间,驱动运行于内核空间。Binder就是一种把这四个组件粘合在一起的粘结剂了,其中,核心组件便是Binder驱动程序了,Service Manager提供了辅助管理的功能,Client和Server正是在Binder驱动和Service Manager提供的基础设施上,进行Client-Server之间的通信。这四个角色的关系和互联网类似:Server是服务器,Client是客户终端,ServiceManager是域名服务器(DNS),驱动是路由器。

    Binder的理解:

    1、从IPC角度来说,Binder是Android中的一种跨进程通信方式,该方式在Linux中没有;

    2、从Android Framework角度来说,Binder是ServiceManager连接各种Manager和相应ManagerService的桥梁;

    3、从Android应用层来说,Binder是客户端和服务端进行通许in的媒介,当BindService的时候,服务端会返回一个包含了服务端业务调用的Binder对象,通过这个Bind而对象,客户端就可以获取服务端提供的服务或者数据,这里的服务包括普通服务和基于AIDL的服务。

     

    在Android开发中,Binder主要用在Service中,包括AIDL和Messenger,普通服务中的Binder不涉及进程间通信。

    直观来讲,Binder是Android中的一个类,实现了IBinder接口。

    Binder的工作机制:

    当客户端发起远程请求时,由于当前线程会被挂起直至服务端进程返回数据,所以一个远程方法是很耗时的,那么不能在UI线程中发起此远程请求;

    由于服务端的Binder方法运行在Binder的线程池中,所以Binder方法不管是否耗时都应该采用同步的方式去实现,因为它已经运行在一个线程中了。

     

    六、具体实例

    进程间通信Demo实例

    https://github.com/PearLemon/IPCTest

     

    展开全文
  • Android app常见使用多进程的场景 1.吃大内存的模块,如地图模块、大图浏览、webview等,Android对内存的限制是针对于进程的。 2.调用系统服务,比如电话,闹钟 Android app要用多进程的两个原因: 1.Android虚拟机...

    Android app常见使用多进程的场景

    1.吃大内存的模块,比如:地图模块、大图浏览、webview等,Android对内存的限制是针对于进程的,即每个进程的内存空间是有大小限制的。
    2.调用系统服务,比如电话,闹钟等。

    Android app要用多进程的两个原因:

    1.突破虚拟机分配进程的运行内存限制。
    Android虚拟机分配给每个进程的内存是有限的(如16M,32M,64M,96M等等),可以在新的进程中去执行,避免主进程OOM
    2.提高app稳定性,单个进程崩溃不影响整个app
    如微信的小程序进程崩溃后,微信依然可以正常运行。
    3.对内存更可控,通过主动释放进程,减小系统压力,提高系统流畅性
    在接收到系统发出的trimMemory(int level)里主动释放重要级低的进程。
    4.LMK机制
    当系统内存不足时会杀死低优先级的进程

    Linux现有的进程间通信机制有哪些

    管道(Pipe):在创建时分配一个page大小的内存,缓存区大小比较有限;
    消息队列(Message Queue):信息复制两次,额外的CPU消耗;不适合频繁或信息量大的通信;
    共享内存(Share Memory):无须复制,共享缓冲区直接附加到进程虚拟地址空间,速度快;但进程间的同步问题操作系统无法实现,必须各进程利用同步工具解决。
    套接字(Socket):作为更通用的接口,传输效率低,主要用于不同机器或跨网络的通信。
    信号量(Semaphore):常作为一种锁机制,防止某进程正在访问共享资源时,其他进程也访问该资源。因此主要作为进程间以及同一进程内不同线程之间的同步手段。

    Android为什么要新增Binder机制,相比于其他进程间通信机制的优点

    在这里插入图片描述

    在这里插入图片描述
    在这里插入图片描述

    AIDL作用:生成Binder代码

    Binder进程通信原理

    客户端通过调用bindService可以拿到系统返回的服务端的IBinder对象,客户端通过这个IBinder对象就可以像调用普通方法一样调用另外一个进程(服务端)的方法

    调用bindService()执行的流程
    在这里插入图片描述

    ServiceManager是系统服务,运行在系统进程(service_manager进程)
    ActivityManagerService是系统服务,运行在系统进程(system_server进程)

    Linux的基础知识

    进程空间划分

    1.一个进程空间分为 用户空间(User space) 和 内核空间(Kernel space)。

    2.二者区别:
    进程间,用户空间的数据不可共享,所以,用户空间 = 不可共享空间
    进程间,内核空间的数据可共享,所以,内核空间 = 可共享空间,所有进程共用1个内核空间

    3.进程内的用户空间和内核空间进行交互需通过系统调用,主要通过函数:

    • copy_from_user():将用户空间的数据拷贝到内核空间
    • copy_to_user():将内核空间的数据拷贝到用户空间

    在这里插入图片描述

    进程隔离和跨进程通信(IPC)

    进程隔离

    为了保证安全性和独立性,一个进程不能直接操作或者访问另一个进程,即Android的进程是相互独立、隔离的。

    跨进程通信(IPC)

    即进程间需进行数据交互、通信

    跨进程通信的基本原理

    传统的跨进程通信:
    在这里插入图片描述

    而Binder机制则是:使用Binder连接两个进程,实现了mmap()系统调用,主要负责创建数据接收缓存区 ,并且管理该数据接收缓存区。

    传统的跨进程通信需拷贝数据2次,但Binder机制只需1次,主要是使用到了内存映射,具体下面会详细说明。

    内存映射

    内存映射原理可参考:内存映射(Memory Map)

    Binder机制的模型

    模型原理图

    Binder跨进程通信机制的模型, 基于 Client - Server 模式
    在这里插入图片描述

    模型的组成角色说明

    在这里插入图片描述

    此处重点讲解 Binder驱动的作用和原理

    Binder驱动简介

    在这里插入图片描述

    Binder驱动原理

    在这里插入图片描述
    关于内存映射可以参考:内存映射(Memory Map)

    模型原理的步骤说明

    在这里插入图片描述

    额外说明

    1.Client进程、Server进程 和 Service Manager 进程之间的交互都必须通过Binder驱动(使用 open 和 ioctl文件操作函数),而非直接交互。

    原因:

    1. Client进程、Server进程 和 Service Manager进程属于进程空间的用户空间,不可进行进程间交互。
    2. Binder驱动属于进程空间的内核空间,可进行进程间以及进程内交互。

    所以,原理图可表示为以下(虚线表示并非直接交互):
    在这里插入图片描述

    2: Binder驱动和Service Manager进程属于Android基础架构(即系统已经实现好了);而Client 进程 和 Server 进程属于Android应用层(需要开发者自己实现)

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

    3:Binder请求的线程管理

    Server进程会创建很多线程来处理Binder请求。
    Binder模型的线程管理采用Binder驱动的线程池,并由Binder驱动自身进行管理,而不是由Server进程来管理的。
    一个进程的Binder线程数默认最大是16,超过的请求会被阻塞等待空闲的Binder线程。所以,在进程间通信时处理并发问题时,如使用ContentProvider时,它的CRUD(创建、检索、更新和删除)方法只能同时有16个线程同时工作。

    下面,我将通过一个实例,分析Binder跨进程通信机制模型在Android中的具体代码实现方式

    Binder机制在Android中的具体实现

    bindService(intent, serviceConnection, BIND_AUTO_CREATE);

    ContextImpl.bindServiceCommon()

    ActivityManagerService. bindService()

    ActiveServices.bindServiceLocked()

    Binder机制的优点

    参考:

    Android跨进程通信:图文详解 Binder机制 原理
    图文详解 Android Binder跨进程通信的原理

    Android Bander设计与实现 - 设计篇
    面试必备:Binder进程通信原理
    Android Binder机制原理(史上最强理解,没有之一)
    android binder 基础实例及解析(一)

    Android Binder——通过AIDL探究Binder

    Binder机制

    Android Binder 原理解析

    Binder 进程间通信机制详解(Java 和 JNI 篇)

    https://www.androidos.net.cn/android/9.0.0_r8/xref/frameworks/base/core/java/android/app/ContextImpl.java
    https://www.androidos.net.cn/android/9.0.0_r8/xref/frameworks/base/core/java/android/app/ActivityManager.java
    https://www.androidos.net.cn/android/9.0.0_r8/xref/frameworks/base/services/core/java/com/android/server/am/ActivityManagerService.java
    https://www.androidos.net.cn/android/9.0.0_r8/xref/frameworks/base/core/java/android/os/ServiceManager.java

    https://www.androidos.net.cn/android/9.0.0_r8/xref/frameworks/base/services/core/java/com/android/server/am/ActiveServices.java

    展开全文
  • Android进程间和线程间通信方式

    千次阅读 2021-01-17 13:22:41
    进程:是具有一定独立功能的程序关于某个数据集合上的一次运行活动,进程是系统进行资源分配和调度的一个独立单位。线程:是进程的一个实体,是CPU调度和分派的基本单位,它是比进程更小的能独立运行的基本单位。线程...

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

    线程:是进程的一个实体,是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();

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

    展开全文
  • 首先介绍一下进程和线程的基本概念及两者之间的区别:   进程:是具有一定独立功能的程序关于某个数据集合上的一次运行活动,进程是系统进行资源分配和调度的一个独立单位。   线程:是进程的一个实体,是CPU...
  • 面试题之进程间通信问题

    千次阅读 2017-04-02 20:15:48
    你在进程中通讯,使用什么? 出了AIDL外,还有其他的方式吗?  有大概四种方式:  方式一:访问其他应用程序的Activity  方式二:Content Provider   方式三:广播... 下面详细介绍一下Messager进程间通信:
  • Android 系统复习面试系列(五)进程间通信本篇主要总结 Binder 原理,顺带提下其他进程间通信方式Android 进程间通信方法文件、AIDL、Binder、Messenger、ContentProvider、SocketLinux 进程间通信方法管道、消息队列...
  • Android 系统复习面试系列(五)进程间通信本篇主要总结 Binder 原理,顺带提下其他进程间通信方式Android 进程间通信方法文件、AIDL、Binder、Messenger、ContentProvider、SocketLinux 进程间通信方法管道、消息队列...
  • 移动研发在最近两年可以说越来越趋于稳定,因为越来越多人开始学习Android开发,造成市场参差不齐。正所谓入门容易成长很难,对未来比较迷茫,不知道自己技能该怎么提升,并且对于初级中级高级需要怎么进行成才,...
  • 好文推荐: 作者:wanderingguy 关于组件化 随着项目结构越来越庞大,模块与模块的边界逐渐变得不清晰,代码维护...通信的两侧是一个C/S架构,如果服务端与客户端同属一个进程我们称之为本地服务,如果分属不同进.
  • 前言 尤其是在最近一段时间内,感觉一天天的时间过得又慢又快,慢的是感觉复工了以后在公司的8.9个小时简直算是煎熬了,快的...1. Android架构设计模式 MVC架构设计模式:MVC全名是Model View Controller,是模型(mod
  • 1.binder是一种进程间通信机制 2.binder是一种基于C/S架构,运行在内核控件的binder驱动程序,进程间通过dev/binder这个文件来建立通信通道 :在linux中因为进程间是隔离的,而用户空间,需要通过系统调用才能访问到...
  • Android面试05-跨进程通信IPC他是谁?哪里需要用到多进程?...IPC是Inter-Process Communication的缩写,含义为进程间通信或者跨进程通信 windows IPC机制 剪贴板,管道,邮槽 Linux IPC机制 命名管道,共享内容,信
  • 我们android面试的时候,面试官会问到我们IPC,这个被问到的概率非常大,当然我每一次都会被问到,...含义就是进程间的通讯或者夸进程通讯,是指两个进程间进行数据交换的过程,那么什么是进程,什么是线程,进程和
  • 最近面试了一位工作12年的程序员, 这位老哥有3年java开发经验,2年H5,7年iOS开发经验,简历上写着精通Java,iOS,熟悉H5开发。没有具体的技术点。 说实话我很期待这位老哥的面试,于是让人事邀约了他。 老哥面试的...
  • StreamSocket:基于TCP协议的封装,以流的方式提供数据交互服务,提供了稳定的双向通信,通过“三次握手”建立连接,传输数据具有较高的稳定性。 Java中客户端使用Socket类,服务器端使用ServerSocket类。 ...
  • Android进程间通信之八面玲珑

    千次阅读 2021-03-08 02:56:52
    提到进程间通信,这是android开发中很重要的一环,也是面试高频知识点,本文总结一下进程间通信的几种方式,把这块知识系统起来。 什么是进程间通信 进程间通信(IPC,Interprocess communication)是一组编程接口...
  • 我继续问他,他说真正让他受打击的是这个月的一次面试。 “面的是一个大厂,面试官问了很多问题,一大半的问题我都是一知半解,回答上来问题也是特没底。 大概回顾了这场面试:上来先是问了Java基础知识,自定义...
  • Usinga Messenger 如果你需要使用服务交流远程的进程,那么你就可以使用Messenger为服务提供这个接口,它使你最简单的实现进程间通信。 下面说一说如何使用Messenger: ·service实现了Handler类用于接收从其他类发...
  • 对于大部分Android应用来讲,...进程间通信(Inter-Process Communication,简称IPC)常用的几种方式:Binder机制文件共享AIDLMessageContentProviderSocket1.Binder模型1-1 Binder模型图1-2 Binder原理图Binder中涉及...
  • 前言 说起IT行业,大多数人脑海里反应出的第一个标签一定是“高薪”,而说起程序员,大家更多想到的可能是: 秃顶、木讷、格子衫;...(2)Android面试题 (3)混合开发面试题 (4)高端技术面试题 (5).
  • Binder进程间通信机制(图文解析)

    千次阅读 多人点赞 2017-12-19 01:33:16
    前言本来想洋洋洒洒写一篇形象生动的...作为一名Android开发,常年使用java开发的人来说,C实在是太不友好了…..但是Binder机制对于整个Android系统来说,你难道没有感觉到,Binder是多么地重要~~所以我作为一名Andr
  • 2. 这时候服务端程序还阻塞在accpet等待下一次的客户端连接请求,运行新的客户端程序,然后强制退出客户端,发现服务端进程居然直接退出了! 咋办啊!感觉代码没有任何问题了,为啥还会出错,虽然很明确一定是write...
  • Android进程通信

    2021-02-20 14:29:51
    进程间的资源和数据互相隔离,而进程内的线程间是共享大多数资源和数据的,进程内可以运行多个线程,线程的崩溃会影响到进程的。 为什么使用多进程的开发? 由于系统资源紧张,每个应用可以使用的系统内存是有限制的...
  • 但是没办法的啊,必须的理解一些Android里Framework的底层实现,不然在面试里怎么突出的表现自己呢。幸好这时一位大神出现了:罗升阳写的一本《Android系统源码代码情景分析》,看完这本书,才明白Android的水也很深...
  • Android中的进程间通信(IPC机制)

    千次阅读 2016-05-10 15:35:25
    记得上次阿里电话面试就问,Android中的进程间通信有哪些?当时没怎么总结过,就只说了一个AIDL。今天就来总结总结吧。 什么是进程间通信? 顾名思义,两个进程之间进行数据交换的过程,那什么又是进程呢? 说到进程...
  • 闲着没事的时候,我喜欢看一些科技前沿的文章,逛B站,无意接触到了编程,入坑Android,开始了漫长的自学之路。 一方面是出于兴趣,另一方面是因为被程序员优渥的薪资待遇所吸引,于是我一直都在向程序员靠拢。 这...
  • 首先介绍一下进程和线程的基本概念及两者之间的区别:   进程:是具有一定独立功能的程序关于某个数据集合上的一次运行活动,进程是系统进行资源分配和调度的一个独立单位。   线程:是进程的一个实体,是CPU调度...
  • 前言相信大家在换工作或者在工作中,都会遇到AIDL相关的知识,相信大家在Android应用程序中使用AIDL不会有太大问题,更具网络上的相关信息,都能实现程序进程间通信所需,因为被Android封装后,随便定义一个文件就会...
  • Qt 之进程间通信(TCP/IP)

    千次阅读 2019-12-26 15:59:41
    Qt 之进程间通信(TCP/IP) 原创 ...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 10,230
精华内容 4,092
关键字:

android进程间通信面试

友情链接: netfpga_full_3_0_0.tar.gz