最近重温了一遍AIDL,以前只是停留在会用的地步,对于其实现机制不太明白,这次又进行了略微深入的了解,但仍局限在应用层,至于其底层Binder的实现机制并不明白。以后用到在进行更深一步的学习。下面进入正文。

什么是AIDL

AIDL是Android Interface Definition Language的简写,即Android接口定义语言。我们知道Android系统为每一个应用开启一个独立的虚拟机,每个应用都运行在各自进程里(默认情况下),彼此之间相互独立,无法共享内存。当一个应用想要访问另一个应用的数据或调用其方法,就要用到Android 系统提供的IPC机制。而AIDL就是Android实现IPC机制的方式之一。除了AIDL,Android还提供了Messenger来实现跨进程通信,不过Messenger是以单线程串行方式(消息队列)来处理来自不同客户端的访问的,并不适合多线程并发访问。当需要提供跨进程以及多线程并发服务时就需要AIDL上场了。谷歌官网如是说:

Using AIDL is necessary only if you allow clients from different applications to access your service for IPC and want to handle multithreading in your service.

从系统层面说,Android其实是通过Binder来实现IPC的,AIDL只是帮助我们自动实现了Binder而已。

AIDL实现步骤

AIDL实现主要分为四步:

  • 创建.aidl文件
  • 服务端实现接口
  • 将接口暴露给客户端
  • 客户端像调用本地方法一样调用远程方法

下面结合代码进行详细分析。

1. 创建.aidl文件

首先在server端编辑.aidl文件。

    package com.example.aidl;    interface MyService{        int ServiceFunctionA();        int ServiceFunctionB();        int ServiceFunctionC();    }

编辑完MyAidl.aidl文件后,Eclipse会自动生成名为MyService.java的接口。(AndroidStudio需要手动编译)。下图展示了MyAidl.java的结构:

要想理解AIDL,捋清通过aidl生成的接口很关键。参照上图,MyService继承自IInterface,内部包含一个名为Stub的内部抽象类以及在.aidl文件中定义的各个抽象方法。其中Stub中又包含一个名为Proxy的内部类。Stub与Proxy都实现了MyService接口,Stub还继承了Binder类,Proxy重写了MyService中的抽象方法。大致就是这样。

2. 服务端实现接口

所有在MySercie接口中定义的抽象方法都需要被实现,实现方法很简单,只需要继承MyService.Stub类并重写其父类MyService中相应方法即可。获得该类实例并通过Service的onBind()方法返回给客户端。这样客户端在调用bindService()方法时就会收到MyService.Stub类实例,也即Binder。

3. 将接口暴露给客户端

客户端通过bindService方式绑定到service时,会在onServiceConnected(ComponentName name, IBinder service)接口处获得来自服务端的Binder类实例。之后通过本地接口方法:

 myService= MyService.Stub.asInterface(service);

关键一步。
当service运行在本地进程时,获得本地MyService实现类,调用本地方法。当service运行在remote进程时,返回MyService代理proxy类,调用proxy类中相应方法。 proxy重写MyService中相应方法,并且最终会调用IBinder.transact()方法。经过系统底层(不知道是怎么传递过去的o(╯□╰)o) 该方法传递至remote server 的onTransact()方法。根据多态性质,remote service会调用在service中已经实现的相应方法。

4. 客户端调用服务端方法

经过以上步骤后,客户端就可以像调用本地方法一样调用远程方法了。

—2016年4月18日23:02:40
—周一
—写于宿舍

更多相关文章

  1. 数字签名的案例说明
  2. Android(安卓)8.1 中Systemui中的常见修改(五)长按Home键唤起Googl
  3. [置顶] Android中AIDL实现进程通信(附源码下载)
  4. android:TextView中的文本链接之--链接的几种方式
  5. 如何将打开res raw目录中的数据库文件?
  6. 安卓MonkeyRunner源码分析之与Android设备通讯方式
  7. Android(安卓)App开发基础篇—实现非阻塞Socket通信
  8. Android(安卓)Bluetooth HID实现详解
  9. Android面试笔试集锦

随机推荐

  1. Android图形图画学习(10)——AlphaBitmap
  2. Android完全隐藏状态栏,毛都不剩的那种!!!
  3. Android Studio App设置Notification通知
  4. 【android】的startActivityForResult
  5. Android控件之ImageButton
  6. Android Audio代码分析22 - AudioEffect:
  7. android 入门学习笔记 BIG5 与 UTF-8互转
  8. Android屏幕中隐藏标题栏和状态栏
  9. Android(安卓)各国语言Values命名规则
  10. ubuntu 上android 源码编译 全过程(二)