Android中的Binder(二)

本文详细介绍了AIDL(Android Interface Definition Language),一种用于定义接口的Android工具,解决Binder通信中的函数标识和参数顺序问题。通过AIDL,开发者可以专注于业务逻辑,而无需手动处理通信细节。示例展示了AIDL如何工作,包括生成的Stub类和Proxy代理类的角色,解释了为什么在远程调用中需要代理类。
摘要由CSDN通过智能技术生成

前言:回顾一下上一篇博文,上一篇说到,Binder是Android系统中IPC机制的底层依赖,描绘了Binder这种通信架构的基本原理图,并且谈到了使用Binder时需要解决的两个问题。即:1.客户端如何获取Binder对象的引用。2.如何协商服务端的函数标识和参数放入包裹的顺序问题。以便于客户端调用服务时,服务端能识别并提供正确的服务。通过上一篇的介绍,相信大家已经知道了客户端通过Service来获取Binder引用的方式,并且也了解了通过重写服务端Binder的onTransact()方法和客户端Binder的transact()方法来解决上述的第二个问题。对于有经验的程序员,完全可以通过这两种做法来实现IPC通信。于此同时,Google的大神们也为开发者提供了更为方便的AIDL工具,这个工具可以帮我们解决第二个问题,这样,开发者就可以完全专注于业务本身。俗话说:“不做重复的轮子”,既然有这种工具,何乐而不用呢?接下来让我们来走进AIDL。之所以将AIDL放在Binder这里讲,是因为这里着重分析AIDL如何解决Binder通信中的第二个问题。若是这里感觉有点迷糊的话,可以看看上一篇博文《Android中的Binder(一)》


一、什么是AIDL?

AIDL,全称为Android Interface Definition Language,即android接口定义语言。顾名思义,AIDL只是一种定义语言,用它的规范定义的接口,可以被aidl工具识别并生成对应的类。(aidl工具在sdk中,可以自行查看)。相信这样比较抽象,接下来我们通过一个小小的例子来看看aidl如何工作。


二、一个简单的AIDL通信示例

服务端代码,注意与上一篇中的服务端代码进行比较,区别已经在注释中体现出来了。

public class ServerService extends Service {

	/**
	 * 创建服务端binder对象(不用aidl时需要自定义Binder子类,并在Service中返回)
	 * 并且我们不用在服务端自行书写onTransact()方法
	 */
	private Binder serverBinder = new IMyServerService.Stub() {
		@Override
		public void service2(String args) throws RemoteException {
			System.out.println("---service2---:" + args);
		}

		@Override
		public void service1() throws RemoteException {
			System.out.println("---service1---");
		}
	};

	@Override
	public void onCreate() {
		Log.i("DEBUG", "---onCreate()---");
		super.onCreate();
	}

	@Override
	public IBinder onBind(Intent intent) {
		Log.i("DEBUG", "---onBind()---");
		return serverBinder;
	}

	@Override
	public boolean onUnbind(Intent intent) {
		Log.i("DEBUG", "---onUnbind()---");
		return super.onUnbind(intent);
	}

}

aidl接口定义,新建com.example.aidl包,新建IMyServerService接口ÿ
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值