Android Framework实战开发-binder通信常见(oneway,in,out,inout)元素介绍及binder双向通信的实现

csdn在线学习课程,课程咨询答疑和新课信息:QQ交流群:422901085进行课程讨论

android跨进程通信实战视频课程(加群获取优惠)

aidl的一些关键字:

1、oneway介绍

oneway 关键字用于修饰远程调用的行为,被oneway修饰了的方法不可以有返回值,也不可以有带out或inout的参数。
使用oneway时,远程调用不会阻塞;它只是发送事务数据并立即返回。接口的实现最终接收此调用时,是以正常远程调用形式将其作为来自 Binder 线程池的常规调用进行接收。

2、in,out,inout介绍

in、out、inout表示跨进程通信中数据的流向(基本数据类型默认是in,非基本数据类型可以使用其它数据流向out、inout)。

in 表示数据只能由客户端流向服务端。(表现为服务端修改此参数,不会影响客户端的对象)

out 表示数据只能由服务端流向客户端。(表现为服务端收到的参数是空对象,并且服务端修改对象后客户端会同步变动)

inout 则表示数据可在服务端与客户端之间双向流通。(表现为服务端能接收到客户端传来的完整对象,并且服务端修改对象后客户端会同步变动)

注意如果aidl中发现对象类型参数可以不带in,out,inout任何一个,那么它一定属于默认in类型,而且也不能强制给其加上out或inout
具体这里可以看google官方文档的原话:
https://developer.android.google.cn/guide/components/aidl#Create

When defining your service interface, be aware that:

Methods can take zero or more parameters, and return a value or void.
All non-primitive parameters require a directional tag indicating which way the data goes. Either in, out, or inout (see the example below).
Primitives, String, IBinder, and AIDL-generated interfaces are in by default, and cannot be otherwise.

Primitives, String, IBinder, and AIDL-generated interfaces are in by default —这句就说明了元数据类型,String ,IBinder,还有AIDL生成的接口那默认就是in,不能为其他

3、Binder跨进程双向通信的实现

在这里插入图片描述
这里其实一共只需要分为3步:
1.首先client通过bindService方式获取到了服务端的IServer接口对象,既可以正常调用服务端的接口
2、这里服务端接口是IServer里面有一个setCallback方法,这个方法参数是一个ICallbackClient类型实体接口对象,这个接口对象由客户端进行实现,服务端进行调用
3、服务端在客户端setCallback之后就获取了客户端的ICallbackClient类型的对象,调用改对象的方法就可以与客户端进行通信

4、linktodeath介绍

死亡通知是为了让Bp端(客户端进程)进能知晓Bn端(服务端进程)的生死情况,当Bp端进程死亡后能通知到Bn端。

定义:AppDeathRecipient是继承IBinder::DeathRecipient类,主要需要实现其binderDied()来进行死亡通告。
注册:binder->linkToDeath(AppDeathRecipient)是为了将AppDeathRecipient死亡通知注册到Binder上。
Bp端只需要覆写binderDied()方法,实现一些后尾清除类的工作,则在Bn端死掉后,会回调binderDied()进行相应处理。

 @Override
        public void setCallback(IChangeCallback callback) throws RemoteException {
            mCallBack = callback;
            //监听客户端的进程是否死了
            mCallBack.asBinder().linkToDeath(new DeathRecipient() {
                @Override
                public void binderDied() {
                    Log.i("test","linkToDeath binderDied");
                }
            },0);
        }
千里马8年Android系统及应用开发经验,曾担任过美国unokiwi公司移动端技术总监兼架构师,对系统开发,性能优化,应用高级开发有深入的研究,Android开源定制ROM Lineage的贡献者之一,国内首家线下开辟培训Android Framework课程,拥有2年的Android系统培训经验。成为腾讯课堂专业负责android framework课程分享第一人,致力于提高国内android Framework水平Android Framework领域内是国内各大手机终端科技公司需要的人才,应用开发者都对Android系统充满着好奇,其中的binder是重中之重,都说无binderAndroid,binde是Android系统的任督二脉。课程水平循序渐进,由中级再到高级,满足各个层次水平的android开发者。1、灵活使用binder跨进程通信,在app端对它的任何api方法等使用自如2、可以单独分析android系统源码中任何binder部分,分析再也没有难度3、掌握binder驱动本质原理,及对应binder驱动怎么进行跨进程通信,及内存等拷贝方式数据等4、对binder从上层的java app端一直到最底层的内核binder驱动,都可以顺利理通5、针对系统开发过程中遇到的binder报错等分析方法,及binder bug案例学习6、针对面试官任何的binder问题都可以对答自如7、socket这种跨进程通信实战使用8、针对android源码中使用的socket源码轻松掌握9、android系统源码中最常见的socketpair中双向跨进程通信10、使用socket实现一个可以让app执行shell命令的程序
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

千里马学框架

帮助你了,就请我喝杯咖啡

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值