Android 关于AIDL你需要知道的一切

本文深入探讨了Android中的AIDL(Android Interface Definition Language),它是实现进程间通信(IPC)的重要工具。首先介绍了Service的启动方式及其生命周期,强调了Service与主线程的关系以及长时间耗时操作可能导致的ANR问题。接着,讨论了Binder作为Android IPC核心的原理和作用。通过AIDL,开发者可以创建远程服务,避免因不同进程而导致的ANR。文中详细阐述了AIDL的使用步骤,包括服务端和客户端的实现,并通过实例展示了如何创建和使用AIDL接口。最后,提到了AIDL使用时需要注意的事项,如避免耗时操作、处理Binder死亡等问题。
摘要由CSDN通过智能技术生成

好的,由于上周拖更,本次带来Android进程通信详解–AIDL,虽然网上关于这个内容的资料丰富且详细,但一千个读者就有一千个哈姆雷特不是嘛,对于任何东西都要有自己的见解。


Service

关于AIDL,Service就是我们不得不提的东西了,它是Android四大组件之一,太基础的东西这里我们就不再赘述,下面还是给出一些我对于Service的认识:

这里写图片描述

上图为Service的生命周期

从图里不难看出,Service有两种启动方式:
①用startservice启动服务,第一次会调用oncreate–>onStartCommand,而第二次就会直接到onStartCommand
②用bindservice启动服务,第一次会调用oncreate–>onBind,后面直接到onBind
注意:
如果即startservice又bindservice了,那么单独stopservice和unBindService都没有效果,必须两个也都执行。

Service和Thread的关系

没有必然关系,service和activity一样运行于主线程,只是他没有view不能被我们所看见。
所以如果我们在service里执行长时间耗时操作是会导致ANR的,这里我就不做演示,大家可以自行检测。
然而,当我们给service注册时,加入process标签,加入:remote属性,这时这个service就成为了远程服务,它就和我们的activity处于截然不同的两个进程中,这个时候再执行耗时操作并不会让我们的程序报ANR,应该两个进程的执行并不会相互影响。与此同时,如果之前我们使用的binder是本地服务的binder,这个时候我们再次bindservice就会导致程序崩溃,是因为service已经是远程服务了,而binder还是本地binder,不同的两个进程自然不能相互调用。这个时候就会需要我们用到android的IPC机制的AIDL了。下文详述。

Binder

Binder是Android中一个很重要且很复杂的概念,它在系统的整体运作中发挥着极其重要的作用,不过我并不打算从深层次分析Binder机制,有两点原因:1是目前网上关于Binder无论从底层到应用层的有关解析文章实在是太多了,2是对Binder机制进行深入底层乃至驱动的分析这一过程相当困难且相当耗时,而且我也没那个实力和精力去解读底层代码(很痛苦)。所以我只给大家给出一些总领性的分析,和几篇关于Binder分析的很好的文章,希望读者们能从这些文章里找到你们想要的答案!

什么是Binder

  1. 直观来说,Binder是Android中的一个类,它继承了IBinder接口
  2. 从IPC角度来说,Binder是Android中的一种跨进程通信方式,Binder还可以理解为一种虚拟的物理设备,它的设备驱动是/dev/binder,该通信方式在Linux中没有
  3. 从Android Framework角度来说,Binder是ServiceManager连接各种Manager(ActivityManager、WindowManager,etc)和相应ManagerService的桥梁
  4. 从Android应用层来说,Binder是客户端和服务端进行通信的媒介,当你bindService的时候,服务端会返回一个包含了服务端业务调用的Binder对象,通过这个Binder对象,客户端就可以获取服务端提供的服务或者数据,这里的服务包括普通服务和基于AIDL的服务
    Android需要建立一套新的IPC机制来满足系统对通信方式,传输性能和安全性的要求,这就是Binder。Binder基于 Client-Server通信模式,传输过程只需一次拷贝,为发送发添加UID/PID身份,既支持实名Binder也支持匿名Binder,安全性高。

Binder的工作机制图(来源:Android开发艺术探索):

这里写图片描述

参考:

  1. http://www.cnblogs.com/innost/archive/2011/01/09/1931456.html
  2. http://blog.csdn.net/universus/article/details/6211589
  3. http://blog.csdn.net/luoshengyang/article/details/6618363
  4. http://blog.csdn.net/huachao1001/article/details/51504469
    书籍:《Android开发艺术探索》
    在android开发中,binder主要用于service中,包括Messenger和AIDL,其中普通的service里面的binder不涉及进程间通信,AIDL则是binder的完美使用,下面带大家一起用小例子分析一下AIDL。

使用

在写出用法之前,必须理清楚几个概念,这对于后文的理解非常重要:
进程:一个程序或一个应用或后台,占有内存空间,是一个执行单元。
线程:CPU调度的最小单元,多个线程可存在于一个进程中。
在安卓应用中,一个应用的不同组件,如果他们运行在不同进程中,那么和它们分别属于两个应用没有本质区别,关于这点需要深刻理解,这也是进程通信的基础。
下文的例子使用的就是activity和service进行通信,给service单独设置了进程:

<service android:name="com.example.dosomeinterestingthings.WxjAidlService"
            android:process=":remote">
</service>

服务端

1、创建一个service用来监听客户端的连接请求。
2、创建AIDL文件将暴露给客户端接口在这个AIDL文件中声明。
3、在service中实现这个AIDL接口即可。

客户端

1、绑定服务端的service。
2、成功后,将服务端返回的Binder对象转成AIDL接口所属的类型,接着就能调用方法了。

AIDL接口的创建

这里给大家抱歉一下,我两个电脑的Android studio都坏了,不能给大家贴AS的创建步骤,待我修复问题后,再补上AS版的,这里先用eclipse讲解过程。(^__^) 嘻嘻……

这里写图片描述

上图为项目结构

创建步骤:
1、 创建com.example.aidl包
2、 在包内创建Book.java、Book.aidl、IWxjAidl.aidl三个文件
3、 Build project(执行这步后才会有gen文件夹里自动生成的IWxjAidl.java这个文件)
注意第三步需要选Eclipse的工具栏的project项的Build project

这里写图片描述

这里写图片描述

Book类:

public class Book implements Parcelable{
   
  • 0
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值