作家
登录

Android中的IPC机制

作者: 来源: 2017-05-16 09:16:15 阅读 我要评论

  • asInterface(android.os.IBinder obj)
  • 用于将办事端的Binder对象转换成客户端所须要的AIDL接口的类型对象,这种转换时区分过程的,如不雅客户端和办事端位于同一过程,那么此办法返回的就是办事端的Stub对象本身,不然返回的时体系封装后的Stub.proxy对象。

    • asBinder

    这个办法运行在办事端的Binder线程池中,当客户端提议跨过程请求的时,长途请求会经由过程体系底层封装后交由此办法来处理。该办法的原型为

    大年夜致步调如下:

    • 办事端

    @Override

    public boolean>办事端经由过程code可以肯定客户端请求的目标办法是什么,接着大年夜data中掏出目标办法所须要的参数(如不雅目标办法有参数的话),然后履行目标办法,当目标办法履行完毕后,就向reply中写入返回值(如不雅目标办法有返回值的话),onTransact办法的履行过程就是如许的。须要留意的时,如不雅此办法返回false,那么客户端的请求就会掉败,是以我们可以应用这个特点来做权限验证,毕竟我们也不欲望随便一个过程都能长途调用我们的办事。

    • Proxy#getBookList

    这个办法运行在客户端,当客户端调用此办法时,它的内部实现是如许的:起首创建该办法所须要的的输入型Prcel对象 _data、输出型Prcel对象 _reply和返回值对象List;然后把该办法的参数信息写入 _data中(如不雅有参数的话);接着调用transact办法来提议RPC(长途过程调用)请求,同时当前哨程挂起;然后办事端onTransact办法会被调用,直到RPC过程返回后,当前哨程持续履行,并 _reply中掏出RPC过程的返回结不雅;最后返回 _reply中的数据。

    过程名以 “:”的含义是指要在过程名前面附加上当前的包名,这个过程属于当前应用的私有过程,其他应用弗成以和他跑在同一个过程。

    • com.xxx.xxx

    Proxy#getBookList

    这个办法运行在客户端,它的履行过程和getBookList是一样的,addBook没有返回值,所以他不须要大年夜 _reply中掏出返回值。留意:当客户端提议长途请求时,因为当前哨程会被挂起直至办事器返回数据,所以如不雅一个长途的办法是很耗时的话,那么不克不及再UI线程中提议次长途请求;其次,因为办事端的Binder办法运行在Binder的线程池中,所以Binder办法不管是否耗时都应当采取同步的方法实现,因为它已经运行在一个线程中了。为了更好的解释Binder,下面给出一个工作机制的图:

    接下来,介绍下Binder的两个很重要的办法 linkTodeath 和 unlinkTodeath,如不雅办事端的Binder连接断裂 (称之为 Binder 逝世亡),会导致我们长途调用掉败。更为关键的时,如不雅我们不知道Binder的连接已经断裂,那么客户端的功能就会受到影响。为此我们可以给Binder设置一个逝世亡代劳,当Binder逝世亡时,我们就会收到通知,这个时刻我们就可以给Binder设置一个逝世亡代劳,这个时刻就可以从新提议连接请求大年夜而恢复连接。

    声明一个IBinder.DeathRecipient对象,IBinder.DeathRecipient是一个接口,其内部只有一个binderDied,我们须要实现这个办法,当binder逝世亡的时刻,体系就会回调binderDied办法,然后我们就可以移除之前绑定的binder代劳并从新绑定长途办事:

    1. //烧毁代劳类,重启办事 
    2.  
    3. private IBinder.DeathRecipient mDeathRecipient = new IBinder.DeathRecipient() { 
    4.               @Override 
    5.               public void binderDied() { 
    6.                   Log.w(TAG, "binder: deed"); 
    7.                   mIBinderPool.asBinder().unlinkToDeath(mDeathRecipient, 0); 
    8.                   mIBinderPool = null
    9.                   connectBinderPoolService(); 
    10.               } 
    11.           };  
    1. mIBinderPool = IBinderPool.Stub.asInterface(iBinder); 
    2.                   try { 
    3.                       mIBinderPool.asBinder().linkToDeath(mDeathRecipient,0); 

        推荐阅读

        央行成立金融科技委员会,用人工智能技术加强监管

      中国人平易近银行宣布他们在近期成立了金融科技(FinTech)委员会。金融科技是技巧驱动的金融立异,为金融成长注入了新的活力,也给金融安然带来了新挑衅。中国人平易近银行将组织深刻研究金>>>详细阅读


      本文标题:Android中的IPC机制

      地址:http://www.17bianji.com/lsqh/35226.html

    关键词: 探索发现

    乐购科技部分新闻及文章转载自互联网,供读者交流和学习,若有涉及作者版权等问题请及时与我们联系,以便更正、删除或按规定办理。感谢所有提供资讯的网站,欢迎各类媒体与乐购科技进行文章共享合作。

    网友点评
    自媒体专栏

    评论

    热度

    精彩导读
    栏目ID=71的表不存在(操作类型=0)