转载请标明出处:

http://blog.csdn.net/sinat_15877283/article/details/51026711

本文出自: 【温利东的博客】

近期在看 @任玉刚 大神编写的《android开发艺术探索》。让我受益良多,以此来巩固一下我的学习成果。以下我将从一下几个方面写一下我对AIDL的一些简单认识。

AIDL 简单概念

什么是AIDL呢?AIDL的Android官方定义例如以下:

AIDL (Android Interface Definition Language) is similar to other IDLs you might have worked with. It allows you to define the programming interface that both the client and service agree upon in order to communicate with each other using interprocess communication (IPC). On Android, one process cannot normally access the memory of another process. So to talk, they need to decompose their objects into primitives that the operating system can understand, and marshall the objects across that boundary for you. The code to do that marshalling is tedious to write, so Android handles it for you with AIDL.

AIDL(Android Interface Definition Language,Android 接口定义语言) Android系统平台的接口定义语言与您可能已经使用过的其它IDLs接口定义语言类似。

程序猿能够利用AIDL自己定义编程接口。在client和服务端之间实现进程间通信(IPC)。在Android平台上。一个进程通常不能訪问另外一个进程的内存空间,因此,Android平台将这些跨进程訪问的对象分解成操作系统能够识别的简单对象, 而且为跨应用訪问而特殊编排和整理这些对象。

用于编排和整理这些对象的代码编写起来很冗长,所以Android的AIDL提供了相关工具来自己主动生成这些代码供程序猿使用。

AIDL的作用

假设在一个进程中(比如Activity)要调用还有一个进程中(比如Service)对象的操作,就能够使用AIDL生成可序列化的參数。

AIDL IPC机制是面向接口的。像COM或Corba一样,可是更加轻量级。

它是使用代理类在client和实现端传递数据。

AIDL的使用场合

仅仅有你同意client从不同的应用程序为了进程间的通信而去訪问你的service,以及想在你的service处理多线程。假设不须要进行不同应用程序间的并发通信(IPC)。you should create your interface by implementing a Binder;或者你想进行IPC。但不须要处理多线程的,则implement your interface using a Messenger

參考:IPC、Binder、AIDL与Intent之间差别与联系

AIDL的使用

服务端

首先要创建一个Service用来监听client的连接请求。然后创建一个AIDL文件,将暴露给client的接口在这个AIDL文件里说明,最后在Service中实现这个AIDL接口就可以。

client

要做的事情:绑定服务端的Service,绑定成功后,将服务端返回的Binder对象转化成AIDL接口所属的类型,接下来就能够调用AIDL中的方法了。

详细AIDL的用法我也就不在又一次造轮子了,请參考使用AIDL

须要掌握的知识点

  • binder的基本使用与原理
  • Service的基本使用:Android 中的 Service 全面总结
  • AIDL支持的数据类型
    • 基本数据类型(int、long、char、boolean、double等)
    • String和CharSequence
    • List:仅仅支持ArrayList。里面每一个元素都必须被AIDL支持;
    • Map:仅仅支持HaspMap。里面每一个元素都必须被AIDL支持,包含key和value;
    • Parcelable:全部实现了Parcelable接口的对象
    • AIDL:全部AIDL接口本身也能够在AIDL文件里使用
  • CopyOnWriteArrayList (支持并发读写)
  • RemoteCallBackListb(删除跨进程listener的接口)
  • 怎样开启多进程:http://blog.csdn.net/sinat_15877283/article/details/50824639

注意点

  • AIDL包结构须要在服务端和client保持一致

  • Parcelable对象必须要有同名的AIDL文件

  • 应该增加权限验证

    默认情况下,我们的远程服务不论什么人都能够连接,但这应该不是我们愿意看到的,所以我们必须给服务增加权限验证功能,权限认证失败则无法调用服务中的方法。

    • Service.onBind方法中进行权限认证
    • Binder.Stub(){ void onTransact() } 方法内进行权限认证
public class XxxService extends Service {
.....
private Binder mBinder = new IBookManager.Stub() {
//在这里能够做权限认证。return false意味着client的调用就会失败
@Override
public boolean onTransact(int code, Parcel data, Parcel reply, int flags) throws RemoteException {
// todo 验证条件
return super.onTransact(code, data, reply, flags);
}
......
}; @Override
public IBinder onBind(Intent intent) {
// todo 验证条件
return mBinder;
}
......
}
  • 注意使用线程。避免ANR程序无响应

最后附上我的demo(临时没有审核通过。有须要的能够先给我留邮箱),

demo内除了简单的实现了client与服务端之间的进程通信。

还增加了服务端对client连接的权限认证,以及有效的解除client对服务端的监听注冊。

參考:http://book.51cto.com/art/201212/374958.htm

http://www.cnblogs.com/over140/archive/2011/03/08/1976890.html

http://blog.csdn.net/singwhatiwanna/article/details/17041691

http://www.cnblogs.com/newcj/archive/2011/05/30/2061370.html

binder: http://blog.csdn.net/cauchyweierstrass/article/details/50701102

android跨进程通信(IPC)——AIDL的更多相关文章

  1. 【朝花夕拾】Android性能篇之(七)Android跨进程通信篇

    前言 只要是面试高级工程师岗位,Android跨进程通信就是最受面试官青睐的知识点之一.Android系统的运行由大量相互独立的进程相互协助来完成的,所以Android进程间通信问题,是做好Andro ...

  2. 【Chromium中文文档】跨进程通信 (IPC)

    跨进程通信 (IPC) 转载请注明出处:https://ahangchen.gitbooks.io/chromium_doc_zh/content/zh//General_Architecture/I ...

  3. 【Android跨进程】IPC总结

    前言 IPC是Inter-Process Communication的缩写,含义就是进程间通信或者跨进程通信,是指两个进程之间进行数据交换的过程.两个进程可以是两个独立的app也可以是一个app的两个 ...

  4. Android跨进程通信AIDL服务

    服务(Service)是android系统中非常重要的组件.Service可以脱离应用程序运行.也就是说,应用程序只起到一个启动Service的作用.一但Service被启动,就算应用程序关闭,Ser ...

  5. Android跨进程通信的四种方式

    由于android系统中应用程序之间不能共享内存.因此,在不同应用程序之间交互数据(跨进程通讯)就稍微麻烦一些.在android SDK中提供了4种用于跨进程通讯的方式.这4种方式正好对应于andro ...

  6. android 跨进程通信

    转自:http://www.androidsdn.com/article/show/137 由于android系统中应用程序之间不能共享内存.因此,在不同应用程序之间交互数据(跨进程通讯)就稍微麻烦一 ...

  7. Android跨进程通信广播(Broadcast)

    广播是一种被动跨进程通讯的方式.当某个程序向系统发送广播时,其他的应用程序只能被动地接收广播数据.这就象电台进行广播一样,听众只能被动地收听,而不能主动与电台进行沟通,在应用程序中发送广播比较简单.只 ...

  8. Android跨进程通信访问其他应用程序的Activity

    访问其他应用程序的ActivityActivity既可以在进程内(同一个应用程序)访问,也可以跨进程访问.如果想在同一个应用程序中访问Activity,需要指定Context对象和Activity的C ...

  9. Android跨进程通信Messenger

    一.概述 我们可以在客户端发送一个Message给服务端,在服务端的handler中会接收到客户端的消息,然后进行对应的处理,处理完成后,再将结果等数据封装成Message,发送给客户端,客户端的ha ...

随机推荐

  1. 对REST的理解

    现在标准服务基本都提供REST化的接口了.为了加强对REST的理解,看了这篇文章: http://kb.cnblogs.com/page/186516/ REST架构风格最重要的架构约束有6个: 客户 ...

  2. Java反转单链表

    class Node { private int data; private Node nextNode; public Node(int data) { this.data = data; } pu ...

  3. Log文件太大,手机ROM空间被占满

    客户要装车,进行项目验收了. 今天拿着几台手机去客户处,其中有一台手机从昨天晚上开始就一直开着我们的APP,今天早晨打开手机发现APP没有反应了. 在程序列表中将其杀掉,然后再启动程序,发现程序不能启 ...

  4. redis学习笔记——RDB和AOF持久化一

    为防止数据丢失,需要将 Redis 中的数据从内存中 dump 到磁盘,这就是持久化.Redis 提供两种持久化方式:RDB 和 AOF.Redis 允许两者结合,也允许两者同时关闭. RDB 可以定 ...

  5. projecteuler---->problem=10----Summation of primes

    title: The sum of the primes below 10 is 2 + 3 + 5 + 7 = 17. Find the sum of all the primes below tw ...

  6. 下载论坛源码GBK UTF8 BIG5分别是什么意思

    下载论坛源码GBK UTF8 BIG5分别是什么意思? 提问者:ly1987520 | 浏览次数:4010次 下载论坛源码简体中文GBK 简体中文UTF8 繁体中文BIG5 分别是什么意思?他们的区别 ...

  7. Android应用经典主界面框架之二:仿网易新闻client、CSDN client (Fragment ViewPager)

    另外一种主界面风格则是以网易新闻.凤凰新闻以及新推出的新浪博客(阅读版)为代表.使用ViewPager+Fragment,即ViewPager里适配器里放的不是一般的View.而是Fragment.所 ...

  8. 用开源NGINX-RTMP-MODULE搭建FLASH直播环境

    用开源nginx-rtmp-module搭建flash直播环境 1.将nginx和nginx-rtmp-module的源码包解压PS:nginx-rtmp-module网址https://github ...

  9. gensim自然语言处理(续)

    上一篇,已经实现了如何将一条语句在一个语料库中比较相似度, 发现运行的时候每次都要编译语料库,通过查找资料,可以一次性编译成预料库,存人文件 编译语料库代码 11_k.py import sysimp ...

  10. SpringMVC响应Restful风格请求404

    在学习Springmvc时,使用Restful风格的url,页面提示404错误.为找到原因,编写一个简单的Restful测试用例如下: jsp页面: <a href="user/tes ...