[android] 采用aidl绑定远程服务

本文介绍如何使用Android接口定义语言(AIDL)实现不同应用间的服务通信,包括远程服务端的搭建与客户端调用流程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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

 

调用中间人的方法

中间人调用服务的方法

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值