android AIDL

原创 2013年12月02日 15:18:50

android的AIDL就是Android Interface definition language的缩写,用于在android内部进程间通信。

接下来的是简单说明AIDL的使用,在下载地址中,增加了一个跨应用的AIDL通讯调用方式,里面包含了复杂的数据类型的传递。


1、首先创建一个以.aidl为文件结尾的文件。


里面的forActivity.aidl和forAervice.aidl就是两个aidl文件,两个文件代表的意思为:

forAcitivty:由Service进程回调到Activity所在的主进程中;

forService:由Activity的主进程中回调到Service中。


两个类的代码分别为:

package com.example.android.aidl;

interface forActivity{

	void performAction();
}
package com.example.android.aidl;
import com.example.android.aidl.forActivity;
interface forService {
	void registerTestCall(forActivity cb);
	void invokCallBack();
}

当创建完这两个文件后,在gen包下面会自动创建这两个文件对应的java文件。

2、接下来是要实现这两个interface。

实现你定义aidl接口中的内部抽象类Stub,public static abstract class Stub extends android.os.Binder implements com.cao.android.demos.binder.aidl.AIDLService
Stub类继承了Binder,并继承我们在aidl文件中定义的接口,我们需要实现接口方法,下面是我在例子中实现的Stub类:

  private final forService.Stub mBinder = new forService.Stub() {
			@Override
			public void invokCallBack() throws RemoteException
			{
				callback.performAction();
				mHandler.sendEmptyMessageDelayed(2000,10000);
			}
			@Override
			public void registerTestCall(forActivity cb) throws RemoteException
			{
				callback = cb;
				
			}
	        
	    };
这个实现类会放在service中,而定义的mBinder是因为在Service中,会使用onBind方法,将mBinder反馈给接收者。

这个实现的stub是定义在服务端(Service中)。因为在stub中,是在一个独立的线程中,所以在调用UI或者其他地方时,需要使用Handler来传递,不然会出现一个线程异常。

3、怎么在客户端如何调用服务端得aidl描述的接口对象,doc只告诉我们需要实现Service.onBind(Intent)方法,该方法会返回一个IBinder对象到客户端,绑定服务时不是需要一个ServiceConnection对象么,在没有了解aidl用法前一直不知道它是什么作用,其实他就是用来在客户端绑定service时接收service返回的IBinder对象的:

private forService mService;
	private ServiceConnection mServiceConnection = new ServiceConnection() {

		@Override
		public void onServiceDisconnected(ComponentName name) {
			mService = null;
		}

		@Override
		public void onServiceConnected(ComponentName name, IBinder service) {
			mService = forService.Stub.asInterface(service);
			try {
				mService.registerTestCall(mCallBack);
			} catch (RemoteException e) {
			}
		}
	};
mService就是AIDLService对象,具体可以看我后面提供的示例代码,需要注意在客户端需要存一个服务端实现了的aidl接口描述文件,但是客户端只是使用该aidl接口,不需要实现它的Stub类,获取服务端得aidl对象后mService = AIDLService.Stub.asInterface(service);,就可以在客户端使用它了,对mService对象方法的调用不是在客户端执行,而是在服务端执行。

文章参考了:http://blog.csdn.net/stonecao/article/details/6425019

接下来是一个完整的例子:

http://pan.baidu.com/s/1kTE3Vi3

接下来是两个应用间的通信:

service应用:http://pan.baidu.com/s/1mgK75Qo

client应用:http://pan.baidu.com/s/1o6AuboA







相关文章推荐

Android远程服务AIDL的使用以及配合接口回调使用

远程服务的接口回调Android 开发中的一些场景需要用到进程间通信,一般使用AIDL(Android Interface Definition Language)。使用AIDL绑定一个远程服务,远程...

Android AIDL Demo

  • 2016年04月24日 14:52
  • 3.64MB
  • 下载

Android AiDL Demo

  • 2017年04月03日 00:48
  • 54.07MB
  • 下载

基于Socket的TCP长连接(服务端Java+客户端Android),Service配合AIDL实现

最近公司的项目要求加入消息推送功能,由于项目用户量不是很大,推送需求不是很严格,而且是基于内网的推送,所以我舍弃了使用三方的推送服务,自己使用Socket写了推送功能,剪出一个小Demo来跟大家分享一...

android-AIDL手机进程间通讯

  • 2013年11月11日 11:05
  • 91KB
  • 下载

android中aidl的使用

  • 2013年04月23日 16:05
  • 41KB
  • 下载

android-------采用AIDL调用远程服务

AIDL的作用 AIDL(Android Interface Definition Language)它是一种IDL 语言,用于生成可以在Android设备上两个进程之间进行进程间通信(interp...

android studio使用AIDL

  • 2015年03月27日 16:28
  • 9.22MB
  • 下载
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:android AIDL
举报原因:
原因补充:

(最多只允许输入30个字)