Android进程间通信——AIDL使用详解

来源:互联网 发布:开淘宝网店的流程图片 编辑:程序博客网 时间:2024/05/16 17:20

1,AIDL的定义:AIDL是接口定义语言,我们可以通过他跨进程启动另一个程序定义的服务,来进行进程间通信。
2,AIDL出现的意义:在android系统中,每一个程序都运行在自己的进程中,进程之间无法进行通讯,一个进程通常不能访问另一个进程的内存空间,所以要想对话,需要将对象分解成操作系统可以理解的基本单元,并且有序的通过进程边界。通过代码来实现这个数据传输过程是冗长乏味的,Android提供了AIDL工具来处理这项工作。
3,AIDL的使用:需要客户端和服务端,我们先写服务端的部分
(1),创建AIDL文件夹,
这里写图片描述
注意传递的类型只能是基本数据类型和实现Parcelable接口的类型或者aidl本身。除了基本类型都需要import一下全路径。
( 2 ) ,自定义服务
注意包名要和aidl文件一致这里写图片描述
     需要注意的是回调函数不能直接抛异常要用try catch包裹。
    服务需要在manifest里注册,且exported属性改为ture。至此服务端写完了。下面写客户端部分。
客户端部分:
(1),新建一个工程,把服务端aidl文件夹复制过来。注意是文件夹
(2),写一个activity作为客户端,界面就画了一个启动服务的按钮,和显示服务端传来消息的textviewactivty布局
,下面是代码部分的截图这里写图片描述
     其中startService是启动服务,值得注意的是android 5.0之后启动服务必须要显式启动了,否则会抛异常。如果之前是隐式启动,谷歌推荐解决方案是加上服务所在包的包名intent.setPackage(“xxx”),
aidlCallBack是需要传的回调函数。
好了,客户端也写完了,下面看看运行效果:
   点击启动aidl服务按钮
客户端的log日志,
客户端的log日志
服务端的log日志
这里写图片描述

真机运行效果:
这里写图片描述

最后,一个简单的aidl应用的例子就写完了。附上AIDL官方文档介绍的一句话
Note: 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. If you do not need to perform concurrent IPC across different applications, you should create your interface by implementing a Binder or, if you want to perform IPC, but do not need to handle multithreading, implement your interface using a Messenger. Regardless, be sure that you understand Bound Services before implementing an AIDL.

“只有当你允许来自不同的客户端访问你的服务并且需要处理多线程问题时你才必须使用AIDL”,其他情况下你都可以选择其他方法,如使用Messager,广播等。也能跨进程通讯。可见AIDL是处理多线程、多客户端并发访问的。

原创粉丝点击