[android] 采用aidl绑定远程服务
aidl:android 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的接口类,这个类自动实现了进程间的通讯IPC(inter process communication)
上面的MyBinder就不需要继承IBinder类了,直接继承IService的内部类Stub,ISerivice.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拷贝过来,注意包名也要和远程端一致
调用中间人的方法
中间人调用服务的方法
相关文章
- [PHP] laravel框架注意bootstrap/cache
- 《吐血整理》高级系列教程-吃透Fiddler抓包教程(35)-Fiddler如何抓取微信小程序的包-下篇
- 网站在线客服系统源码 | 全渠道在线客服代码下载 (最新版支持外贸商城/H5/小程序/公众号对接)
- 前端vue2+vue-router3+ElementUI+axios综合使用代码教程登录页案例
- 在线客服系统对接微信小程序(客服消息推送)
- 【小程序】同一微信号在微信开发工具上怎么切换小程序
- 【小程序】微信公众号模板消息跳转小程序发送失败:errcode=40013 , errmsg=invalid appid rid:
- 【小程序】微信小程序报错47001 - data format error hint
- 【小程序】微信小程序报错:用户绑定的手机需要进行验证,请在客户端完成短信验证
- 【小程序】微信小程序设置globalData全局数据
- 【小程序】获取手机号报错:getPhoneNumber:fail no permission
- 【小程序】小程序webview不支持打开非业务域名请重新配置
- 【uniapp】uniapp微信小程序开发:启动微信开发者工具提示no such file or directory错误
- 【小程序】uniapp发行微信小程序上传失败Error: Error: {"errCode":-10008,"errMsg":"invalid ip
- 【小程序】如何获取微信小程序代码上传密钥?
- [前端] 前端bootstrap col-xs-6 col-md-3的布局意思
- 解放重复劳动丨华为云IoT API Explorer对接小程序实现系统化应用
- [小程序] 支付宝小程序使用list时提示元素不存在
- [javascript] 支付宝小程序网络GET请求
- [PHP] laravel框架注意bootstrap/cache