Android Binder机制(一)

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

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

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

android.app.ContextImpl:

 
  1.  
  2.  
    public Object getSystemService(String name) {
  3.  
    return SystemServiceRegistry.getSystemService(this, name);
  4.  
    }

android.app.SystemServiceRegistry:

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

 
  1.  
    static {
  2.  
    registerService(Context.ACCESSIBILITY_SERVICE, AccessibilityManager.class,
  3.  
    new CachedServiceFetcher<AccessibilityManager>() {
  4.  
  5.  
    public AccessibilityManager createService(ContextImpl ctx) {
  6.  
    return AccessibilityManager.getInstance(ctx);
  7.  
    }});
  8.  
     
  9.  
    registerService(Context.CAPTIONING_SERVICE, CaptioningManager.class,
  10.  
    new CachedServiceFetcher<CaptioningManager>() {
  11.  
  12.  
    public CaptioningManager createService(ContextImpl ctx) {
  13.  
    return new CaptioningManager(ctx);
  14.  
    }});
  15.  
     
  16.  
    registerService(Context.ACCOUNT_SERVICE, AccountManager.class,
  17.  
    new CachedServiceFetcher<AccountManager>() {
  18.  
  19.  
    public AccountManager createService(ContextImpl ctx) {
  20.  
    IBinder b = ServiceManager.getService(Context.ACCOUNT_SERVICE);
  21.  
    IAccountManager service = IAccountManager.Stub.asInterface(b);
  22.  
    return new AccountManager(ctx, service);
  23.  
    }});
  24.  
    ....

ServiceManager、ServiceManagerNative:

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

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

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

xxx.Stub.asInterface(binder):

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

返回系统服务:

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

2.客户端之间

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

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

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章