zoukankan      html  css  js  c++  java
  • [android] 采用aidl绑定远程服务

    aidlandroid interface definition language 安卓接口定义语言

    在两个不同的应用程序里面使用同一个接口

    使用场景:调用支付宝服务进行支付

    先写远程服务端Serivice

    新建一个AlipayService继承系统Service

    在清单文件里面,添加一个<service>节点,为了能够让别人调用,添加一个隐式意图

    添加一个意图过滤器<intent-filter>节点,新加一个动作节点<action>设置名称属性android:name=”com.xxx.alipay”

    重写方法

    onBind()

    onUnbind()

    onCreate()

    onDestroy()

    定义一个接口IService,添加一个想要暴露的方法

    定义一个内部类MyBinder继承系统的IBinder类实现一个自己的接口比如:IService类,实现上面接口的方法,里面调用AlipayService中的方法

    onBind()方法里面返回上面的IBinder对象,远程服务就做好了

    在这里使用aidl来定义一个接口,直接把我们上面的IService.java接口改成IService.aidl,此时会报语法错误,因为aidl里的所有类和方法都是公共的,因此我们把里面的public访问修饰符全都去掉,此时会看到gen目录下面自动生成了一个IService.java的接口类,这个类自动实现了进程间的通讯IPCinter process communication

    上面的MyBinder就不需要继承IBinder类了,直接继承IService的内部类StubISerivice.Stub

    这时远程的代码才真正完成

    客户端的代码里

    获取Intent对象,通过new出来

    调用Intent对象的setAction()方法,参数:上面远程端定义的意图过滤器动作

    调用bindService(intent,conn,flags)方法,绑定服务,参数:Intent对象,ServiceConnection对象,BIND_AUTO_CREATE

    创建一个内部类MyConn实现ServiceConnection类,实现以下方法

    onServiceConnected(CompontName name,IBinder service)

    在这个方法里面需要强转IBinder对象到IService,这里不是自动的强转而是应该用它的api来转,IService.Stub.asInterface(service)方法来向下转类型

    因为IBinder对象是远程的,因此需要把远程端代码里面定义的IService.aidl拷贝过来,注意包名也要和远程端一致

    调用中间人的方法

    中间人调用服务的方法

  • 相关阅读:
    线程池:
    C#:实现托盘
    Linux内核 TCP/IP、Socket参数调优
    redis配置文件redis.conf参数说明
    redis安装与参数说明
    巧用linux服务器的/dev/shm/,如果合理使用,可以避开磁盘IO不给力,提高网站访问速度。
    mkdir:批量创建文件夹
    linux下的shell运算(加、减、乘、除)
    Linux查看文件编码格式及文件编码转换
    解决vi/vim中粘贴会在行首多很多缩进和空格的问题
  • 原文地址:https://www.cnblogs.com/taoshihan/p/5342835.html
Copyright © 2011-2022 走看看