• [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拷贝过来,注意包名也要和远程端一致

    调用中间人的方法

    中间人调用服务的方法

  • 相关阅读:
    FPM
    Docker记录
    阿里云ECS发送企业邮件
    git操作
    vscode+vagrant+xdebug调试
    Spring Security开发安全的REST服务
    559. Maximum Depth of N-ary Tree
    《算法图解》之散列表
    766. Toeplitz Matrix
    893. Groups of Special-Equivalent Strings
  • 原文地址:https://www.cnblogs.com/taoshihan/p/5342835.html
Copyright © 2020-2023  润新知