aidl 另一种跨进程访问方式

最近在写一个类似支付宝的sdk,然后遇到问题了,支付包的支付过程就是:第三方集成支付宝sdk,然后第三方app唤起支付宝这个app,然后支付宝app付款,付完之后通知第三方app和第三方的服务器,这里面的问题就是,第三方app唤起支付宝app,两个app之间就是跨进程通信了,我需要把订单信息传到我们的钱包app里面并且还要唤醒它去支付,两个app之间数据共享可以用contentprovider,但这里要唤起来,保险方式就是aidl,先给看我的项目目录:
这里写图片描述

有以下几点需要说明的是:
1、aidl分为2个端,一个是客户端,一个是服务端,但是不管是 哪个端,主动发起的是客户端,被调用的叫服务端,这里第三方app是客户端,钱包app是服务端
2、客户端和服务端所拥有的文件一样,比如:这里aidl文件下有6个文件,4个是aidl的文件,还有2个java文件。这是服务端的代码,那么客户端也要有和服务端目录层级一模一样的这样子的一个文件夹放着这6个文件,总之要记得只要是aidl相关的,客户端服务端的代码层级目录一样,代码一样就可以正常的build,然后在下面目录下生成java文件,看我的(目录不一定要一模一样但是会报错,新手最好保持一模一样免得到处报错又不会调)
这里写图片描述
3、你们肯定很好奇为何有4个aidl文件却对应的java文件生成了2个,那么还有2个去哪儿了呢?因为那2个文件orderinfo.aidl和payresult.aidl是javabean文件,也不单纯是,就是序列化后的javabean文件,看他们的代码如下:
这里写图片描述
看对应java文件
这里写图片描述

对应的payresult也是这样的,至于为何没生成俺也不知,另外2个都是interface文件的aidl,所以生成了,不知是否和这有关,不生成没关系不报错能达到目的就行
4、这里的orderinfo和payresult都是javabean对象用来传递的,客户端app吧订单对象传给服务端app,服务端app吧支付结果payresult对象返回回来,基本数据类型不需要序列号,只要是对象的就得序列号,ecplise里面可以吧aidl和java文件放在同一个目录, 但是在as里面放一起会报错build下生成不了java文件,那么在modle的build.gradle里面配置如下:
这里写图片描述
我猜是让aidl文件夹能放java文件,其实这里不这样配置,你把javabean文件丢在java文件下的任何一目录也行,但是序列化后的javabean的.java文件的目录层级再哪个包下面,那么对于的aidl也要放在aidl 下的对应的目录层级下,就比如下面,目录要对应:
这里写图片描述
5、吧这些了解后除了aidl下的6个文件服务端和客户端一样其他的不一样的就在于,客户端要实现ServiceConnection 接口,而服务端需要写一个服务供客户端调用ExecuteServiceAIDL.Stub实现这个接口就行了源码如下:
我不能把源码弄出来,看这篇博客http://blog.csdn.net/singleton1900/article/details/8434643,运行
里面的demo,多看看就会了。
不会的有疑问的加群234456543,本姑凉亲自教^_^

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
AIDL(Android Interface Definition Language)是一种Android特有的IPC(Inter-Process Communication,进程间通信)机制,可以实现进程通信。以下是使用AIDL实现进程通信的步骤: 1. 定义AIDL接口:在AIDL文件中定义接口和方法,这些接口和方法将在不同进程之间进行调用。例如,定义一个接口IStudentManager和一个方法addStudent()。 2. 实现AIDL接口:在Service中实现AIDL接口,可以在Service中创建一个Binder对象,然后将该对象返回给客户端,客户端可以使用这个Binder对象调用Service中的方法。 3. 绑定Service:在客户端中绑定Service,通过这种方式,客户端可以获取到Service中的Binder对象,然后调用Service中的方法。 4. 调用方法:在客户端中通过Binder对象调用Service中的方法,实现进程通信。 注意事项: 1. 在使用AIDL时,需要在AndroidManifest.xml文件中注册Service。 2. AIDL接口中只能使用基本数据类型和Parcelable类型,不支持其他类型。 3. AIDL接口中定义的方法必须是线程安全的,因为它们可能在不同进程中被调用。 4. AIDL接口中定义的方法必须是只读的,不应该修改传入的参数。 5. AIDL接口中的方法返回值必须是void或者基本数据类型、String、CharSequence、Parcelable类型。 6. AIDL接口中的方法可以抛出RemoteException异常,因为AIDL接口是基于Binder实现的,所以需要处理Binder连接中断的情况。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值