深入Android架构(从线程到AIDL)_23 活用IBinder接口于近程通信01

1、 在同一进程里活用IBinder接口


议题

1. myActivity对象是谁创建的呢?

2. myService对象是谁创建的呢?

3. 当myService类里有个f1()函数,如何去调用它呢?

4. 必须先取得myService对象的指针,才能调用f1()函数去存取对象的属性(Attribute)值。

5. 那么,该如何才能取得myService对象的指 针呢?

6. 想一想,可以透过myService类的静态(static)属性或函数来取得myService对象的指针吗?

7. 可以透过IBinder接口来取得myService对象的指针吗?
 

活用IBinder接口
  • IBinder接口的重要目的是支持跨进程的远程调用。然而,它也应用于同一进程里的近程调用。
  • 例如,当Activity远程调用Service时,我们常用bindService()函数去绑定Service,取得对方的IBinder接口。
  • 在近程(同一进程内)调用时也可以使用bindService()函数去绑定Service,并取得对方的IBinder接口。
  • IBinder接口的典型实现类是Binder基类,其定义于Binder.java档案里。
  • 近程通信(同一进程里)如何使用IBinder接口呢?
  • 举例说明之。
  • 例如, myActivity和myService两者都执行于同一个进程(process)里,而且myActivity提供一个IS接口,其定义如下:

       interface IS {
                void f1();
                void f2();
        }

       现在, myActivity想要透过此IS接口来调用myService的函数;如下图:

        

2、 目的、议题与方法

  • 目的: myActivity想去直接(近程)调用myService类的函数, 例如IS接口里的f1()函数
  • 议题: 如何取的myService对象的IS接口呢?
  • 方法: 先取得myService对象的IBinder接口
步骤:

Step-1. myActivity透过bindService()函数来绑定(Bind)此myService。
Step-2. myService回传myBinder类的IBinder接口给myActivity。
Step-3. myActivity将IBinder接口转换为myBinder类的接口

Step-4. myActivity调用myBinder类的getService()函数,取得myService的IS接口。
Step-5. 于是, myActivity就能调用IS接口(由myService类实现)的函数了。

在Android 说明文件里,说明道:

第1步 
  • 当Android框架启动myService时,就立即执行:這诞生了myBinder对象。
           private final IBinder mBinder = new myBinder();

第2步
  • 随后,当myActivity调用bindService()时,框架会反向调用到myService的onBind()函数:

              public IBinder onBind(Intent intent)  { return mBinder; }

       其将 myBinder的IBinder接口回传给框架,并由框架调用onServiceConnected()函数,将此接口回传给myActivity。
       

 第3步
  • 由于myActivity与myService在同一个进程里执行, myActivity所获得的就是myBinder的真正接口(不是它的Proxy的);于是,执行:

                myBinder ib = (myBinder) ibinder;

  • 就从接获的IBinder接口转型(casting)为myBinder本身接口了。
     
第4步
  • 接着,执行:

                isv = ib.getService();

  • 这透过myBinder本身接口来调用getService()函数,取得了myService的IS接口。
第5步
  • 最后, myActivity就能透过IS接口来调用myService的f1()或f2()函数了。

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

思忖小下

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值