Lazy loaded image
技术分享
🗒️Android中AIDL的使用详解,如何发起回调?
字数 928阅读时长 3 分钟
2020-8-5
2023-10-13
type
status
date
slug
summary
tags
category
icon
password
这是百度面试官问的一个问题,当时没答上来。我们知道AIDL底层是基于Binder机制通信的,而Binder本身是C/S架构的。Activity写个AIDL接口可以实现跟Service的通信,那么Service如何主动回调或者主动推送消息到Activity呢?

定义通信接口

这个接口是Activity发数据给Service用的,addPerson会在Service中的List中新增一个数据,getPersonList返回Person列表。registerCallback注册回调对象,等一会儿会说。
IPersonCallBack.aidl这个接口是Service主动回调Activity用的,用于获取Activity中的时间。
在AndroidManifest中定义service为另一个进程,并指明action
定义完成后,在AS中build一下,编译器会自动为我们生成binder抽象对象,当然你也可以自己写。
notion image
IPerson是个interface继承于IInterface
notion image
内部包含我刚才在AIDL里面声明的四个方法。
notion image
还有三个内部静态类Default,Stub和Proxy。其中Stub交给服务方实现,Proxy交给客户端持有。Proxy主要是怎么往内核空间写数据和拿数据,Default是默认实现,基本不用。
notion image

实现具体方法

编译器为我们生成的IPerson.java文件中有个Stub()内部静态类,这是个抽象类,具体实现需要我们自己去写。RemoteCallbackList是一个回调对象列表,可以把Service想象成一个服务器,多个Activity为客户端。Service在建立连接的时候保存了客户端的回调对象。
Activity中实现客户端的回调函数和开启新线程不断让Service增加Person并拿回数据显示在TextView上。

运行结果

Activity客户端结果
notion image
Service服务端结果
notion image
上一篇
WebP,Jpeg,Png格式图片的编解码区别
下一篇
JNI在Android中的实践NDK:Hello World

评论
Loading...