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. IOS View传统的价值观之间

    1.采用NSUserDefaults通过值,这样的方法不限于传送少量数据的: 比方你要传一个float的值.在须要传的时候用 [[NSUserDefaults standardUserDefaults ...

  2. CocoaPods停在Analyzing dependencies解决方案

    现在很多开源项目应用cocoapod.这使集成第三方库都非常方便,在没有花project里设置哪些参数.仗着. 只要运行pod update要么pod install时间,经常会卡在Analyzing ...

  3. Codeforces Round #265 (Div. 2) C. No to Palindromes! 构建无回文串子

    http://codeforces.com/contest/465/problem/C 给定n和m,以及一个字符串s,s不存在长度大于2的回文子串,如今要求输出一个字典比s大的字符串,且串中字母在一定 ...

  4. crontab 里不能运行expdp

    编辑脚本 xxx.sh #!/bin/shrq=`date +%Y%m%d`filename="test$rq"expdp system/*** directory=expdump ...

  5. CII-2.4指针常量和常量指针

    #define T Stack_T typedef struct T *T; struct T { int count; struct elem { void *x; struct elem *lin ...

  6. 【分享】小工具大智慧之Sql执行工具

    原文:[分享]小工具大智慧之Sql执行工具 工具概况 情况是这样的,以前我们公司有很多Sql用于完成一些很不起眼但又不得不完成的业务,出于方便就直接在Sql查询分析器里执行,按理说应该写一些专门的工具 ...

  7. HDOJ 3518 Boring counting

    SAM基本操作 拓扑寻求每个节点  最左边的出现left,最右边的出现right,已经有几个num ...... 对于每个出现两次以上的节点.对其所相应的一串子串的长度范围 [fa->len+1 ...

  8. Codeforces 113A-Grammar Lessons(实现)

    A. Grammar Lessons time limit per test 5 seconds memory limit per test 256 megabytes input standard ...

  9. C语言库函数大全及应用实例一

    原文:C语言库函数大全及应用实例一                                 [编程资料]C语言库函数大全及应用实例一 函数名: abort 功 能: 异常终止一个进程 用 法: ...

  10. php rsa 加密、解密、签名、验签

    由于对接第三方机构使用的是Java版本的rsa加解密方法,所有刚开始在网上搜到很多PHP版本的rsa加解密,但是对接java大多都不适用. 以下php版本是适用于对接java接口,java适用密钥再p ...