原文链接: https://my.oschina.net/u/1474965/blog/872847

binder用于android进程间的通讯。客户端程序和系统服务,客户端进程之间,都是通过binder进行进程间通讯的。

1.客户端程序和系统服务

客户端和系统服务通讯的入口:cotext.getSystemService(String name)

android.app.ContextImpl:

    @Override    public Object getSystemService(String name) {        return SystemServiceRegistry.getSystemService(this, name);    }

android.app.SystemServiceRegistry:

静态代码块注册系统服务:

static {        registerService(Context.ACCESSIBILITY_SERVICE, AccessibilityManager.class,                new CachedServiceFetcher() {            @Override            public AccessibilityManager createService(ContextImpl ctx) {                return AccessibilityManager.getInstance(ctx);            }});        registerService(Context.CAPTIONING_SERVICE, CaptioningManager.class,                new CachedServiceFetcher() {            @Override            public CaptioningManager createService(ContextImpl ctx) {                return new CaptioningManager(ctx);            }});        registerService(Context.ACCOUNT_SERVICE, AccountManager.class,                new CachedServiceFetcher() {            @Override            public AccountManager createService(ContextImpl ctx) {                IBinder b = ServiceManager.getService(Context.ACCOUNT_SERVICE);                IAccountManager service = IAccountManager.Stub.asInterface(b);                return new AccountManager(ctx, service);            }});....

ServiceManager、ServiceManagerNative:

serviceManager是管理系统服务的一个工具类。

sServiceManager = ServiceManagerNative                .asInterface(Binder.allowBlocking(BinderInternal.getContextObject()));

getService方法:利用ServiceManagerProxy类通过进程间通讯的方式,获取其他服务在binder驱动中的binder对象mRemote。

xxx.Stub.asInterface(binder):

利用getService获取到的binder对象实例化相应服务的Proxy对象,返回给客户端,供客户端使用。

返回系统服务:

   /**     * Gets a system service from a given context.     */    public static Object getSystemService(ContextImpl ctx, String name) {        ServiceFetcher<?> fetcher = SYSTEM_SERVICE_FETCHERS.get(name);        return fetcher != null ? fetcher.getService(ctx) : null;    }

2.客户端之间

B应用进程调用A应用进程

B bindservice 向AmS请求启动B应用的service。启动service成功后会像AmS返回一个(binder驱动中的mRemote)binder,AmS会以该binder为参数调用ActivityThread类中的ApplicatonThread对象。接着会在ApplicationThread中回调conn接口。最后,B进程可以利用该binder调用A应用提供的功能。

 

转载于:https://my.oschina.net/u/1474965/blog/872847

更多相关文章

  1. Nginx系列教程(二)| 一文带你读懂Nginx的正向与反向代理
  2. RHEL 6 下 DHCP+TFTP+FTP+PXE+Kickstart 实现无人值守安装
  3. Nginx系列教程(六)| 手把手教你搭建 LNMP 架构并部署天空网络电影
  4. 一款霸榜 GitHub 的开源 Linux 资源监视器!
  5. Android(安卓)Socket实例(2)
  6. Android(安卓)请求Root权限代码
  7. Android(安卓)Studio ADB响应失败解决方法
  8. Android各版本系统源代码下载
  9. Android(安卓)RIL 本地代码(c/c++) 和 Java代码部分分析

随机推荐

  1. android上的http
  2. Android入门第十六篇之Style与Theme
  3. Gallery放大缩小
  4. Android拍照实现方式概述
  5. Android的StrictMode
  6. Android(安卓)Studio如何删除module
  7. android中禁止横屏和竖屏切换
  8. Android(安卓)使用RecyclerVeiw加载复杂
  9. Android(安卓)UI开发第二十八篇——Fragm
  10. Unity的春天