关闭

android AIDL

标签: androidaidl
430人阅读 评论(0) 收藏 举报
分类:

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







0
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:16298次
    • 积分:317
    • 等级:
    • 排名:千里之外
    • 原创:16篇
    • 转载:3篇
    • 译文:0篇
    • 评论:0条
    文章分类