android中的AIDL

来源:互联网 发布:微信支付php 完整源码 编辑:程序博客网 时间:2024/05/22 15:23

1.AIDL(接口定义语言)

不同进程之间进行通信,访问服务中的方法

服务端:

  1)声明一个接口,将其后缀名改为aidl,不用声明为public类型,它默认就是public,若为私有,怎么能实现不同进程之前通信

        interface SInterface {
               void CC();

        }

   2)在Service类中定义类SS并继承Binder,实现SInterface接口

class SS extends Binder implements SInterface{

        @Override
        public void CC() {
            put();
            
        }

        @Override
        public IBinder asBinder() {
            // TODO Auto-generated method stub
            return null;
        }    
    }

注意:此时接口SInterface被改为后缀名为aidl,按理说应该不存在此接口了,但是去查看gen文件夹下的目录,会发现此时存在一个接口SInterface,这是我们去查看SInterface的源码会发现有一个类已经代替我们实现了继承Binder和SInterface接口了,这个类是Stub,所以我们只需继承Stub即可

class SS extends Stub{
        @Override
        public void CC() {
            put();           
        }
    }

     上述代码简介明了

在onBinder()方法中返回SS实例

客户端:

1)复制服务端的aidl文件到客户端(相同包名)

2)用binderService启动服务bindService(intent, conn, BIND_AUTO_CREATE);

conn的实现:

class Conn implements ServiceConnection{

        @Override
        public void onServiceConnected(ComponentName arg0, IBinder arg1) {
            
            si=Stub.asInterface(arg1);
        }

        @Override
        public void onServiceDisconnected(ComponentName arg0)

        }
        
    }

依然在gen目录下有SInterface接口,Stub同时继承了Binder和实现了SInterface接口,所以用Stub来接收传递回来的接口实例,用此实例即可访问服务中的方法

2.Binder连接池

当多个业务模块需要通信时,需要创建多个Service,Service本身是一种资源,Service过多会使程序看起来很重量级,因此可以将所有的AIDL放在同一个Service中去管理,每个业务模块创建自己的AIDL接口并实现此接口,各个模块之间是不能有耦合的,所有的实现细节要单独开来然后向服务端提供自己的唯一标示和其对应的Binder对象。对于服务端来说,只需要一个queryBinder接口,每个接口能根据模块特征返回相应的Binder对象,不同的模块拿到Binder对象后就可以进行远程方法调用



0 0