Binder机制,从Java到C (2. IPC in System Service :AMS)
1.建立Activity和Service的IPC之前
在上一篇 Binder机制,从Java到C (1. IPC in Application Remote Service) 里面有说到Activity通過AMS的bindService(),触发Service的onBind(),然后会调用Client的onServiceConnected() 回调方法,把一個Binder代理对象传递给Client。
那实际上,AMS也是一个Service,那它是运行在另外一個process,所以Activity要调用AMS.bindService()。来建立Application Activity和Service的IPC通信之前,首先得和AMS進行IPC通信。
我们在开发过程中,经常会创建一个Intent,然后start Activity,start Service,send broadcast。
如下面图中所示,所有Intent,都会通过IActivityManager走入Activity,Service,Broadcast三個不同的处理方法。这些处理都是在另外一个process进行的。就是AMS所在的进程。

2.AMS 框架
在AMS中,沒有使用aidl,而是自己去實現了Stub端和Proxy端。Stub端:ActivityManagerService, Proxy 端:ActivityManagerProxy
下面这个图是以前分析AMS的时候一个框架图,拿来用一下,就看红框框的几个类吧。
ActivityManagerProxy就是提供给客户端的代理对象,客户端可以通过这个代理,请求AMS的服务。那这个请求当然是通过它里面的mRemote来发出的,这个mRemote当然也是BinderProxy啦。
ActivityManagerService继承了ActivityManagerNative,大部分AMS的功能执行都是在这里。
因为上面这两个类都实现了同一个接口文件IActivityManager,所以对客户端来说,通过代理来调用函数,就像调用远程服务一样。

3.Application获得AMS的Proxy
Application是怎麼得到AMS的Proxy的呢?这里就要从代码开始看起了。
3.1 就看startActivity好了,跟踪代码,最后会发现调用到ContexImpl中的:
/frameworks/base/core/java/android/app/ContextImpl.java
public void startActivityAsUser(Intent intent, Bundle options, UserHandle user) {
ActivityManagerNative.getDefault().startActivityAsUser(...);
}
代码很简单!但是这样就可以调用AMS的服务了。
3.2 那来看一下这个getDefault()究竟是什么:
/frameworks/base/core/java/android/app/ActivityManagerNative.java
static public IActivityManager getDefault() {
return gDefault.get();
}
private static final Singleton<IActivityManager> gDefault = new Singleton<IActivityManager>() {
protected IActivityManager create() {
IBinder b = ServiceManager.getService("activity"); (1)
IActivityManager am = asInterface(b); (2)
return am;
}
};
说明:
(1):原來也是获得了Activity service的IBinder,只是这个IBinder是从ServiceManager获得的。实际上和RemoteService的情況一樣,这个IBinder实际上也是一個BinderProxy对象。
(2) 返回的是ActivityManagerProxy,里面有個mRemote就是BinderProxy对象。
总结一下,上面这个过程可以概括的说是:
Application通过ServiceManager找到了AMS 的service代理对象,Application通過這個service代理对象也就可以和AMS通信了。
那接下來的问题就是:
servicemanager其实也是一個另外的进程,Application是怎么找到servicemanager的?或者说是怎么拿到servicemanager的BinderProxy的呢?
请看下一篇。
Binder机制,从Java到C (3. ServiceManager in Java)
Binder机制,从Java到C (2. IPC in System Service :AMS)的更多相关文章
- Android Binder机制详解:手写IPC通信
想要掌握一样东西,最好的方式就是阅读理解它的源码.想要掌握Android Binder,最好的方式就是写一个AIDL文件,然后查看其生成的代码.本文的思路也是来自于此. 简介 Binder是Andro ...
- Binder机制,从Java到C (1. IPC in Application Remote Service)
转载请标注:张小燕:http://www.cnblogs.com/zhangxinyan 1. Application 中的 service 我们知道Android中Service有三种类型:Loca ...
- Binder机制,从Java到C (大纲)
转载请标注:张小燕:http://www.cnblogs.com/zhangxinyan/p/3487381.html 前段时间一直在看有关Binder机制的内容,觉得受益匪浅,整理记录于此,大家请随 ...
- Binder机制,从Java到C (3. ServiceManager in Java)
上一篇 Binder机制,从Java到C (2. IPC in System Service :AMS) 中提到 Application是通过ServiceManager找到了AMS 的servic ...
- Android Binder机制简单了解
Binder -- 一种进程间通信(IPC)机制, 基于OpenBinder来实现 毫无疑问, 老罗的文章是不得不看的 Android进程间通信(IPC)机制Binder简要介绍和学习计划 浅谈Ser ...
- 从mediaserver入手快速理解binder机制(最简单理解binder)【转】
本文转载自;https://blog.csdn.net/u010164190/article/details/53015194 Android的binder机制提供一种进程间通信的方法,使一个进程可以 ...
- Android Binder机制(一) Binder的设计和框架
这是关于Android中Binder机制的一系列纯技术贴.花了一个多礼拜的时间,才终于将其整理完毕.行文于此,以做记录:也是将自己所得与大家分享.和以往一样,介绍Binder时,先讲解框架,然后再从设 ...
- Android系统进程间通信Binder机制在应用程序框架层的Java接口源代码分析
文章转载至CSDN社区罗升阳的安卓之旅,原文地址:http://blog.csdn.net/luoshengyang/article/details/6642463 在前面几篇文章中,我们详细介绍了A ...
- Binder机制,从Java到C (5. IBinder对象传递形式)
1.IBinder的传递 Binder IPC通信中,Binder是通信的媒介,Parcel是通信的內容.远程调用过程中,其参数都被打包成Parcel的形式來传递.IBinder对象当然也不例外,在前 ...
随机推荐
- Sicily 1299 Academy Awards (map + vector)集装箱
链接:http://soj.me/show_problem.php?pid=1299&cid= Description Selected from 3,850 teams from 1,329 ...
- AssetManager asset使用
Android 该系统提供了一个程序为每个新的设计/assets文件夹.保存该文件在此文件夹可以在一个程序被打包./res 和/assets所不同的是,android不/assets下生成的文件ID. ...
- js之面向对象----封装篇
学习了一天的面向对象总结一下,共分为三类 - -! 老规矩 第一部分是概念性知识!!! 面向对象编程,我们可以把他想象成我们在造人.一个对象便是一个人,这个人有胳膊有腿,这便是一个对象的属性或者方法. ...
- A + B Again 2057 有符号的64进位的运算
Problem Description There must be many A + B problems in our HDOJ , now a new one is coming.Give you ...
- hadoop得知;datajoin;chain署名;combine()
hadoop一种简化机制来管理job和control作业之间的非线性依赖,job对象mapreduce表明. job该目的是通过使实例化jobconf对象的构造函数的工作落实. x.addDeopen ...
- oracle_体系结构图_逻辑结构图
1.oracle 的体系结构图 重要!!! 2.oracle的逻辑结构图
- ReactJS.NET 开发
初探ReactJS.NET 开发 ReactJS通常也被称为"React",是一个刚刚在这场游戏中登场的新手.它由Facebook创建,并在2013年首次发布.Facebook ...
- 无废话WCF入门教程五[WCF的通信模式]
一.概述 WCF在通信过程中有三种模式:请求与答复.单向.双工通信.以下我们一一介绍. 二.请求与答复模式 描述: 客户端发送请求,然后一直等待服务端的响应(异步调用除外),期间处于假死状态,直到服务 ...
- 数据持久化之SP的优化—送工具类
第一点:sp存储的是键值对 getSharedPreferences 第一个參数是你保存文件的名字,第个是保存的模式一般能够默觉得0 先看普通 使用SP 存储String类型字符串吧 SharedPr ...
- MonkeyRunner于Windows在下面Eclipse开发环境的搭建步骤(并解决在线Jython配置错误的问题)
网上有一shangdong_chu网友写了一篇文章介绍了如何Eclipse构造MonkeyRunner,他做了叙述一个很好的说明.但我对我的环境试验后会见Jython解析错误的问题,和制品缺少Pyde ...