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接口的作用

1.多个应用程序之间建立共同的服务机制; 2.通过AIDL在不同应用程序之间达到数据的共享和数据相互操作; 3.一句话,主要是用于多应用之间的数据交互(而 在单个应用内或者说该应用如果不需要和其它...
  • androidzhaoxiaogang
  • androidzhaoxiaogang
  • 2013年02月11日 10:37
  • 4963

Android 进阶7:进程通信之 AIDL 的使用

记得 2015 年实习面试,笔试题里就有这道题:请介绍下 AIDL。当时的我是懵逼的,只好老老实实空着。没想到后来面试时面试官大哥嘿嘿一笑说他也没用过这玩意,真是够实诚的。笔试完查了这个知识点,似懂非...
  • u011240877
  • u011240877
  • 2017年05月26日 11:43
  • 5167

Android中AIDL的基本用法

转载自:http://flrito.cc/notes-androidzhong-aidlde-ji-ben-yong-fa/ 早些时候就听说过AIDL,也常在各种Android面试题、教程甚至大...
  • fwt336
  • fwt336
  • 2016年09月19日 16:57
  • 6610

Android开发之AIDL实现原理解析(源代码分享 )

在开始本章之前,先向大家介绍COM的一个概念---------Proxy/Stub结构(代理/存根结构) Android就是在传统的C/S架构中加入了一层,实现IPC。我们下面来详细介 绍一下andr...
  • u013900875
  • u013900875
  • 2014年04月16日 12:53
  • 3346

Android之——AIDL小结

AIDL (Android Interface Definition Language )AIDL 适用于 进程间通信,并且与Service端多个线程并发的情况,如果只是单个线程 可以使用 Messe...
  • l1028386804
  • l1028386804
  • 2015年07月26日 21:21
  • 2218

[Android]AIDL详解【上】

AIDL是一个缩写,全称是Android Interface Definition Language,也就是Android接口定义语言。是的,首先我们知道的第一点就是:AIDL是一种语言。既然是一种语...
  • qq3965470
  • qq3965470
  • 2016年09月26日 17:01
  • 2314

AndroidStudio 使用AIDL

这个标题不是很好,因为Android Studio是一个IDE,AIDL是一种IPC通信机制。本质上没有任何的关联。但是大家都懂得,这是一个在Android Studio中写的一个AIDL的小DEMO...
  • DucklikeJAVA
  • DucklikeJAVA
  • 2016年06月01日 21:33
  • 11984

一个android中AIDL的简单例子

跨进程间的通信: 关于IPC应该不用多介绍了,Android系统中的进程之间不能共享内存,那么如果两个不同的应用程序之间需要通讯怎么办呢?比如公司的一个项目要更新,产品的需求是依附于当前项目开发一个插...
  • jingwen3699
  • jingwen3699
  • 2016年11月29日 21:22
  • 1903

跨应用的aidl异步回调

问题出现 最近工作遇到的问题,之前通过绑定系统签名包服务调用静默安装接口,同步获取到结果,最后将结果返回到服务器。 但是新的android系统版本出来后,静默安装接口无效了,后来找到了一个新的方...
  • MaoDunTi
  • MaoDunTi
  • 2016年09月26日 17:49
  • 1436

Android远程接口之AIDL——Parcelable、in、out、inout简例

AIDL简义 Android中的数据传输、方法调用等,常见的是集中在应用程序内的Activity之间,如Activity-A传递到Activity-B。 这样的数据传输、方法等都是在一个应用程序间...
  • yangzhaomuma
  • yangzhaomuma
  • 2016年01月25日 00:21
  • 6761
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:android AIDL
举报原因:
原因补充:

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