Android Binder机制中的异步回调

“Binder通信是同步而不是异步的”,但是在实际使用时,是设计成客户端同步而服务端异步。

看看Framwork层的各service类java源码便会知道,在客户端调用服务端的各种方法时,通常会传递一个Binder过来,该Binder对象用于服务端做异步回调,而服务端本身会使用handler或队列的方式做成异步处理。在Android中,系统service是作为"管理者"的身份存在的,像Ams(ActivityManagerService),它并不创建Activity,创建Activity的是客户端的ActivityThread,但是每当ActivityThread想创建一个Acitivty,就必须告诉Ams,Ams会进行调度该Acitivty的创建。更简单的一个例子,Toast和NotificationManagerService,Toast负责弹出窗口的创建显示和隐藏,而何时显示跟何时隐藏却是由NotificationManagerService决定的。具体可以看看这篇文章Toast窗口的源码分析

我们可以发现,当队列本来不为空时,客户端的同步在服务端执行完将ToastRecord放入队列之后就可以结束了。服务端会通过连续取出队列项并且回调客户端的show()和hide()方法。而在服务度回调show()和hide()时,客户端就成了”服务端“,这时它通过handler将本次真正的显示和隐藏Toast窗口操作压入Message队列,再一次实现了异步操作。

那为什么要设计成这样呢?以Toast为例,假如服务端不设计成异步调用+使用Binder回调,那当有2个Toast请求同时过来时,为了实现串行化显示(Toast每次只显示一个,本次显示完毕后才接下去显示下一个),那么第二个Toast进程就必须阻塞着等待第一个Toast显示再隐藏,更糟糕的是,即使是第一个请求也必须在显示之后阻塞着等待服务端发送隐藏指令。

(我在看源码时对于每次IPC调用客户端都会传递一个Binder对象到服务端觉得很奇怪,当时以为是为了"双向通信":服务端也可能需要客户端的一些处理结果。但看了更多代码后我觉得可能更准确的原因是为了异步回调。以上只是个人理解,如有错误请指出。)

时间: 2024-11-10 16:44:50

Android Binder机制中的异步回调的相关文章

Android Binder机制(2) ContextManager注册过程分析

引言 Context Manager对应的进程为servicemanager,它先于Service Server与服务客户端运行,首先进入接收IPC数据的状态,处理来自Service Server或服务客户端的请求.在init.rc脚本文件中也可以看到Context Manager在mediaserver与system_server之前运行了. 每当Service Server注册服务时,Context Manager都会把服务的名称与Binder节点编号注册到自身的服务目录中,该服务目录通过根

Android Binder机制(3) 本地服务注册过程

本博客将讲解本地服务的注册过程,为了方便大家更好地理解,选择了MediaPlayer Service作为例子. 启动并注册MediaPlayer Service的代码在frameworks/base/media/mediaserver/main_mediaserver.cpp中,如下: main_mediaserver.cpp 1 2 3 4 5 6 7 8 9 10 11 12 int main(int argc, char** argv) { sp<ProcessState>proc(Pr

android Binder机制原理

Android Binder机制原理(史上最强理解,没有之一)(转) 原文地址: http://blog.csdn.net/universus/article/details/6211589 Binder是Android系统进程间通信(IPC)方式之一.Linux已经拥有的进程间通信IPC手段包括(Internet Process Connection): 管道(Pipe).信号(Signal)和跟踪(Trace).插口(Socket).报文队列(Message).共享内存(Share Memo

android binder 机制二(client和普通server)

在讲它们之间的通信之前,我们先以MediaServer为例看看普通Server进程都在干些什么. int main() { -- // 获得ProcessState实例 sp<ProcessState> proc(ProcessState::self()); // 得到ServiceManager的Binder客户端实例 sp<IServiceManager> sm = defaultServiceManager(); -- // 通过ServiceManager的Binder客户

Android Binder机制分析(5) Binder_ioctl()分析

引言 在博客Android Binder机制(3)本地服务注册过程这篇博客中我们详细讲解了本地服务的注册过程,除了一个地方之外,那就是IPCThreadState::waitForResponse()方法中的talkWithDriver(),而在talkWithDriver()中调用了binder_ioctl(),由于内容太多,所以专门写一篇博客进行分析. 实际上,不只是在服务注册过程中会调用到Binder Driver中的binder_ioctl(),在服务检索.服务使用阶段都会调用到bind

android binder 机制 (ServiceManager)

Binder机制作为一种IPC通信机制,在android系统中扮演了非常重要的角色,因此我也花了一些时间来研究它,按照我的理解,下面我将从4个方面来讲一下Binder,如有不对的地方,还希望大家多多指教.下面的例子都将以MediaServer来讲. 一.ServiceManager ServiceManager在Binder系统中相当与DNS,Server会先在这里注册,然后Client会在这里查询服务以获得与Service所在的Server进程建立通信的通路. 在与ServiceManager

【转】Android - Binder机制

以下几篇文章是较深入分析binder机制. 目录 1. Android - Binder机制 - ServiceManager 2. Android - Binder机制 - 普通service注册 3. Android - Binder机制 - 获得普通service 4. Android - Binder机制 - client和普通service交互 5. Android - Binder机制 - Binder框架总结 6. Android - Binder机制 - ProcessState

浅谈android binder机制

binder机制 是谷歌优化在android上更适合终端的IPC(多进程通信方式),满足系统对通信方式,传输性能和安全性的要求. 特性: 1. 用驱动程序来推进进程间的通信.2. 通过共享内存来提高性能.3. 进程间同步调用以及异步调用 ........................................... IADL是用binder机制进行IPC的典型代表 IADL是一个接口描述文件,规定IPC通信的接口,一般使用于client/server模式 c/s双方写好IADL后,系统会

Android Binder机制介绍

做过Android开发的同学可能有些体会,入门初期,工作内容主要是实现各式各样的UI界面,以及实现应用的业务逻辑.在这个阶段,我们会逐渐熟悉View系统,逐渐学会实现各种各样的界面以及动画效果.再往后,当我们想更深入的学习android系统,比如学习android四大组件的启动过程.AMS.PMS等等时,都会遇到一个叫做Binder的东西.结合笔者的经验,Binder可以说是深入理解Android系统的重要基础.binder作为android系统进程间通信的机制,贯穿在方方面面.我们平时使用最多