Binder机制,从Java到C (3. ServiceManager in Java)
上一篇 Binder机制,从Java到C (2. IPC in System Service :AMS) 中提到 Application是通过ServiceManager找到了AMS 的service代理对象。那在这个之前当然是要先找到ServiceManager的代理对象,才能调用ServiceManager的服务嘛。下面就看看怎么来获得这个代理对象的吧:
还记得上一篇调用的ServiceManager的方法吧:IBinder b = ServiceManager.getService("activity");
那下面就來看一下ServiceManager.getService()是怎样的:
/frameworks/base/core/java/android/os/ServiceManager.java
public final class ServiceManager {
...
private static IServiceManager getIServiceManager() {
if (sServiceManager != null) {
return sServiceManager;
}
// Find the service manager
sServiceManager = ServiceManagerNative.asInterface(BinderInternal.getContextObject()); (1)
return sServiceManager;
}
public static IBinder getService(String name) {
try {
IBinder service = sCache.get(name);
if (service != null) {
return service;
} else {
return getIServiceManager().getService(name);
}
} catch (RemoteException e) {
Log.e(TAG, "error in getService", e);
}
return null;
}
说明:
(1) :根据前两篇的分析,我们可以推測是在BinderInternal.getContextObject()中,找到了ServiceManager的BinderProxy,似乎和前面有些不同。接着看。
那就接着看BinderInternal.getContextObject()有什麼不同:
/framework/base/core/java/com/android/internal/os/BinderInternal.java
public class BinderInternal {
….
public static final native IBinder getContextObject();
….
}
会getContextObject()是个JNI方法, ServiceManager难道运行在native环境?答案是Yes! ServiceManager确实运行在Native环境。
继续看,在/framework/base/core/jni/android_util_Binder.cpp找到了对应的方法:
static jobject android_os_BinderInternal_getContextObject(JNIEnv* env, jobject clazz)
{
sp<IBinder> b = ProcessState::self()->getContextObject(NULL);
return javaObjectForIBinder(env, b); //按照字面意思来看,就是把一个Native层的Binder代理对象转化成Java层的Binder代理对象
}
这个方法只有两句代码,第一句看着就是找一个IBinder对象啦,然后第二句,就是把一个Native里面的Binder代理对象转化成Java层的Binder代理对象,然后好返回给Java层。
来看一下第一句代码,在/frameworks/native/libs/binder/ProcessState.cpp里:
sp<IBinder> ProcessState::getContextObject(const sp<IBinder>& caller)
{
return getStrongProxyForHandle(0);
}
里面的这一句代码就暂时先不展开了,不然没完没了了,這里按字面意思也可以看出,是根据一个handle來获得一个Native层的Binder代理对象。而是一個default值。代表servicemanager的binder handle值。所以这里你给个0,就返回给你servicemanager的Binder代理对象。
那到这里,我們就认为通过BinderInternal.getContextObject(),获得了Native的一個binder 代理对象后,javaObjectForIBinder()会创建一个BinderProxy对象返回到Java层去。
经过上面的分析,我们可以知道:ServiceManager的Stub端在Native层。ServiceManager的Proxy端在Java层。
结合前面两篇总结一下:
1. Application通过AMS的static 方法,先得到ServiceManager的BinderProxy。
2. 然后从ServiceManager获得AMS的BinderProxy,从而可以使用AMS的远程服务方法。
3. Application通过AMS的远程服务方法,如bindservice(), 將Application Remote Service的BinderProxy提供给Activity,从而Activity可以远程调用这些remote service 的服务。
现在可以串起来了吧。
Binder机制,从Java到C (3. ServiceManager in Java)的更多相关文章
- Android系统进程间通信Binder机制在应用程序框架层的Java接口源代码分析
文章转载至CSDN社区罗升阳的安卓之旅,原文地址:http://blog.csdn.net/luoshengyang/article/details/6642463 在前面几篇文章中,我们详细介绍了A ...
- Binder机制,从Java到C (8. ServiceManager in Native)
在第三篇 Binder机制,从Java到C (3. ServiceManager in Java) 中,讲到ServiceManager的Stub端在Native,Proxy端在Java.实际上,还要 ...
- Binder机制,从Java到C (大纲)
转载请标注:张小燕:http://www.cnblogs.com/zhangxinyan/p/3487381.html 前段时间一直在看有关Binder机制的内容,觉得受益匪浅,整理记录于此,大家请随 ...
- Binder机制,从Java到C (2. IPC in System Service :AMS)
1.建立Activity和Service的IPC之前 在上一篇 Binder机制,从Java到C (1. IPC in Application Remote Service) 里面有说到Activi ...
- Binder机制,从Java到C (1. IPC in Application Remote Service)
转载请标注:张小燕:http://www.cnblogs.com/zhangxinyan 1. Application 中的 service 我们知道Android中Service有三种类型:Loca ...
- Binder机制,从Java到C (5. IBinder对象传递形式)
1.IBinder的传递 Binder IPC通信中,Binder是通信的媒介,Parcel是通信的內容.远程调用过程中,其参数都被打包成Parcel的形式來传递.IBinder对象当然也不例外,在前 ...
- Binder机制,从Java到C (6. Binder in Native : libbinder)
1.Java和C++中的Binder 从前一篇 Binder机制,从Java到C (5. IBinder对象传递形式) 中可以看到,使用Binder的Java代码,到最后都会进入到Native环境,将 ...
- Android中的Binder机制的简要理解
转载自:http://www.linuxidc.com/Linux/2012-07/66195.htm http://blog.csdn.net/sunxingzhesunjinbiao/articl ...
- Android深入浅出之Binder机制
一说明 Android系统最常见也是初学者最难搞明白的就是Binder了,很多很多的Service就是通过Binder机制来和客户端通讯交互的.所以搞明白Binder的话,在很大程度上就能理解程序运行 ...
随机推荐
- C面试题
1.sizeof()和strlen()使用? 答案: 1.从功能定义,strlen功能,要查找字符串的长度,sizeof功能是用来寻找指定的变量或变量类型的存储器占用 尺寸: 2.sizeof是运算符 ...
- 如何让虚拟机识别插入的USB闪存驱动器
首先,打开虚拟机,再就是工具栏 有一台虚拟机 -> 移动设备 -> usb ->欧克. 版权声明:本文博主原创文章,博客,未经同意不得转载.
- struts2 通配符简化配置
在struts映射中反复出现的模式 动作方法 描写叙述 下一个动作方法 add 为save准备网页 save save 提交INSERT list edit 为update准备网页 update up ...
- 通过Web Api 和 Angular.js 构建单页面的web 程序
通过Web Api 和 Angular.js 构建单页面的web 程序 在传统的web 应用程序中,浏览器端通过向服务器端发送请求,然后服务器端根据这个请求发送HTML到浏览器,这个响应将会影响整个的 ...
- Android KitCat 4.4.2 ADB 官方所支持的所有Services格式翻译
在之前的文章中有转帖网上同行制作的ADB协议表格<<adb概览及协议参考>>,但不够详尽,所以这里自己另外基于Android 4.4.2的技术文档重新做一次翻译. HOST S ...
- ASP.NET MVC创建的网站
ASP.NET MVC创建的网站 最近在写一个网站,昨天刚写完,由于要和朋友一起测试,但是他电脑上没有环境,所以希望我在自己电脑上部署一下,让他直接通过浏览器来访问来测试,所以从昨晚到今天上午,通 ...
- [翻译]MEAN.IO与MEAN.JS的前世今生
写在前面: 因为项目要求要学习mean,所以要从搭建环境开始,网上的教程不怎么多,但是感觉方法倒是不少,也没多想,就开始安装,运行起来发现怎么和安装教程中的目录结构不同? 想了好久,也翻看目录半天,总 ...
- SQL点滴31—SQL语句中@@IDENTITY和@@ROWCOUNT区别
原文:SQL点滴31-SQL语句中@@IDENTITY和@@ROWCOUNT区别 SQL语句中@@IDENTITY和@@ROWCOUNT区别 在一条 INSERT.SELECT INTO 或大容量复制 ...
- DirectX (13) 粒子系统
笔者:i_dovelemon 资源:CSDN 日期:2014 / 10 / 16 主题:Point Sprite, Particle System 介绍 在游戏中.非常多的绚丽,灿烂的特效,都能够使用 ...
- 【剑指offer】员工年龄排序
典型的以空间换时间问题,思路非常重要! /* 员工年龄排序 员工可能有几万名,要求时间复杂度为O(n) 思路:员工的年龄必定在一个范围内,比方0-99,那么我们建立一个大小为100的辅助数组,然后遍历 ...