深入理解Binder(一),从AIDL谈起
打算写一篇Binder介绍的文章,仔细想想一篇文章貌似很难厘清,于是我打算从AIDL入手,本篇先来简单介绍下AIDL的使用,然后在此基础上我们继续来研究Binder的工作原理。小伙伴们都知道,AIDL(Android Interface definition language)是Android跨进程通信(IPC)的一种方式,另一种常见的跨进程通信方式Messenger就是在AIDL的基础继续封装实现的。那么本篇博客我们就先来介绍一下AIDL的基本用法。
AIDL在使用的过程中分为服务端App和客户端App,我们来分别看一下两个的开发流程:
服务端开发步骤:
1.创建一个aidl文件夹,NEW->FOLDER->AIDL FOLDER
2.创建一个AIDL 文件,两种创建方式:
2.1 创建一个Java接口文件,删掉修饰符,将文件后缀名改为aidl
2.2 NEW->AIDL->AIDL FILE
3.rebuild project,检查是否生成对应的Java文件,app->build->generated->source->aidl->debug->
4.创建一个Service,在Service中定义内部类继承自AIDL所生成的Java类中的Stub类,并实现该类中的方法
5.在清单文件中注册Service,注意添加exported属性和action
客户端开发步骤:
1.将服务端的AIDL文件夹拷贝至客户端的main文件夹下
2.rebuild project,检查是否生成对应的Java文件
3.绑定服务
OK,这里我们就先按照服务端的开发步骤来实现服务端,假设我的服务端要提供一个加法运算,客户端调用这个方法得到两个数的和。OK,那么在服务端首先创建AIDL文件夹,然后创建AIDL文件:
然后编译项目,查看相应的Java类是否生成:
接下来创建Service,并返回一个Binder实例:
public class MyAddService extends Service { @Nullable @Override public IBinder onBind(Intent intent) { return new MyBinder(); } class MyBinder extends IMyAddAidl.Stub { @Override public int add(int a, int b) throws RemoteException { return a + b; } } }
接下来,清单文件注册Service:
<service android:name=".MyAddService" android:exported="true"> <intent-filter> <action android:name="myaddservice" /> </intent-filter> </service>
exported表示将这个服务暴露给第三方应用使用。OK,至此,我们的服务端就开发完成了。接下来我们来看看客户端,首先把服务端的aidl文件连同它的文件夹都先拷贝到客户端,然后编译客户端项目,这个时候AIDL会在客户端生成和服务端一模一样的Java代码,然后我们通过绑定式来启动一个服务,如下:
Intent intent = new Intent("myaddservice"); intent.setPackage("org.sang.aidlhost"); ServiceConnection conn = new ServiceConnection() { @Override public void onServiceConnected(ComponentName name, IBinder service) { mIMyAddAidl = IMyAddAidl.Stub.asInterface(service); } @Override public void onServiceDisconnected(ComponentName name) { } }; boolean b = bindService(intent, conn, Service.BIND_AUTO_CREATE);
然后我们就可以在客户端调用服务端了,调用方式如下:
try { int add = mIMyAddAidl.add(13, 14); Log.d("google.sang", "add: " + add); } catch (RemoteException e) { e.printStackTrace(); }
OK,这就是我们说的AIDL的一个基本使用,可以实现不同App之间的跨进程通信。
OK ,本文就算是一个楔子吧,下篇博客我们再来详细分析为什么客户端能够调通服务端。
Demo下载http://download.csdn.net/detail/u012702547/9646635
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 分享 3 个 .NET 开源的文件压缩处理库,助力快速实现文件压缩解压功能!
· Ollama——大语言模型本地部署的极速利器
· DeepSeek如何颠覆传统软件测试?测试工程师会被淘汰吗?