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 Activitystart Servicesend 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)的更多相关文章

  1. Android Binder机制详解:手写IPC通信

    想要掌握一样东西,最好的方式就是阅读理解它的源码.想要掌握Android Binder,最好的方式就是写一个AIDL文件,然后查看其生成的代码.本文的思路也是来自于此. 简介 Binder是Andro ...

  2. Binder机制,从Java到C (1. IPC in Application Remote Service)

    转载请标注:张小燕:http://www.cnblogs.com/zhangxinyan 1. Application 中的 service 我们知道Android中Service有三种类型:Loca ...

  3. Binder机制,从Java到C (大纲)

    转载请标注:张小燕:http://www.cnblogs.com/zhangxinyan/p/3487381.html 前段时间一直在看有关Binder机制的内容,觉得受益匪浅,整理记录于此,大家请随 ...

  4. Binder机制,从Java到C (3. ServiceManager in Java)

    上一篇 Binder机制,从Java到C (2. IPC in System Service :AMS)  中提到 Application是通过ServiceManager找到了AMS 的servic ...

  5. Android Binder机制简单了解

    Binder -- 一种进程间通信(IPC)机制, 基于OpenBinder来实现 毫无疑问, 老罗的文章是不得不看的 Android进程间通信(IPC)机制Binder简要介绍和学习计划 浅谈Ser ...

  6. 从mediaserver入手快速理解binder机制(最简单理解binder)【转】

    本文转载自;https://blog.csdn.net/u010164190/article/details/53015194 Android的binder机制提供一种进程间通信的方法,使一个进程可以 ...

  7. Android Binder机制(一) Binder的设计和框架

    这是关于Android中Binder机制的一系列纯技术贴.花了一个多礼拜的时间,才终于将其整理完毕.行文于此,以做记录:也是将自己所得与大家分享.和以往一样,介绍Binder时,先讲解框架,然后再从设 ...

  8. Android系统进程间通信Binder机制在应用程序框架层的Java接口源代码分析

    文章转载至CSDN社区罗升阳的安卓之旅,原文地址:http://blog.csdn.net/luoshengyang/article/details/6642463 在前面几篇文章中,我们详细介绍了A ...

  9. Binder机制,从Java到C (5. IBinder对象传递形式)

    1.IBinder的传递 Binder IPC通信中,Binder是通信的媒介,Parcel是通信的內容.远程调用过程中,其参数都被打包成Parcel的形式來传递.IBinder对象当然也不例外,在前 ...

随机推荐

  1. OBIEE SampleAppv406 自己主动启动配置

    SampleApp 一个简短的引论: SampleApp这是一个一站式服务,几乎证明OBIEE不管顶的特征可想而知. 它安装了大量的应用(数据库,OBIEE,的Endeca.TimesTen的.Ess ...

  2. Quartz.Net任务统一调度框架

    山寨版Quartz.Net任务统一调度框架   TaskScheduler 在日常工作中,大家都会经常遇到Win服务,在我工作的这些年中一直在使用Quartz.Net这个任务统一调度框架,也非常好用, ...

  3. jQuery 的 serializeArray()、serialize() 方法

    serializeArray()方法说明: 实例 输出以数组形式序列化表单值的结果: $("button").click(function(){ x=$("form&qu ...

  4. HDU 3639 Hawk-and-Chicken(Tarjan缩点+反向DFS)

    Problem Description Kids in kindergarten enjoy playing a game called Hawk-and-Chicken. But there alw ...

  5. APMServ—我用过的最优秀的PHP集成环境工具

    原文:APMServ-我用过的最优秀的PHP集成环境工具 经常折腾wordpress和各种cms,免不了要在本地测试一些程序,所以选择一款好的php集成环境就至关重要啦. 1. 我用过的php集成环境 ...

  6. 将字符串“abc”全排列成:abc、acb、bac、bca、cab、cba

     [STAThread]         static void Main()         {             string s = "abcd";           ...

  7. Object-C 基础学习笔记(for,foreach,while,switch)

    int main(int argc, const char * argv[]) { //for,foreach,while,do-while,switch NSMutableArray* mutabl ...

  8. intellij idea 13&14 插件推荐及快速上手建议 (已更新!)

    原文:intellij idea 13&14 插件推荐及快速上手建议 (已更新!) 早些年 在外企的时候,公司用的是intellij idea ,当时也是从eclipse.MyEclipse转 ...

  9. SQL点滴32—Excel中CONCATENATE函数生成SQL语句

    原文:SQL点滴32-Excel中CONCATENATE函数生成SQL语句 当拿到一个Excel的时候需要将这里面的数据插入到数据库里面,该怎么办,除了使用SSIS数据导入之外还可以使用Excel中的 ...

  10. ASP.Net使用母版页窗

    背景:每一个网页的基本框架结构类似: 浏览站点的时候会发现,好多站点中.每一个网页的基本框架都是一样的,比方,最上面都是站点的标题,中间是内容.最以下是站点的版权.开发提供商等信息: watermar ...