转载请标明出处:

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. gridcontrol表头设置

    点击Run Disigner进入设计界面,设置颜色字体等信息在Appearance分支下面,设置行为功能,显示区域等在Options分支下面.

  2. Google Python 命名规范

    Google Python命名规范 module_name,  模块 package_name,  包 ClassName,  类 method_name,  方法 ExceptionName,    ...

  3. Hibernate:SQL查询 addScalar()或addEntity()

      Hibernate除了支持HQL查询外,还支持原生SQL查询. 对原生SQL查询执行的控制是通过SQLQuery接口进行的,通过执行Session.createSQLQuery()获取这个接口.该 ...

  4. .NET Framwork 之 托管代码的执行过程

    源代码代码第一次编译形成IL中间语言的托管代码,在运行时被Class Loader装载后进行JIT第二次编译形成托管的本地代码.在执行过程中,它会不断地检查当前我们执行的代码的安全性和规范性. Cla ...

  5. 算法笔记_084:蓝桥杯练习 11-1实现strcmp函数(Java)

    目录 1 问题描述 2 解决方案   1 问题描述 问题描述 自己实现一个比较字符串大小的函数,也即实现strcmp函数.函数:int myStrcmp(char *s1,char *s2) 按照AS ...

  6. Java学习笔记1、常用dos命令

    cd 改变当前目录 sys      制作DOS系统盘 copy 拷贝文件 del 删除文件 deltree 删除目录树 dir 列文件名 diskcopy 制磁盘 edit 文本编辑 format ...

  7. ubuntu错误解决E: Sub-process /usr/bin/dpkg returned an error code (1)

    在用apt-get安装软件时出现了类似于 install-info: No dir file specified; try –help for more information.dpkg:处理 get ...

  8. Linux程序存储结构与进程结构 堆和栈的差别

    摘要:本文主要讲述了Linux系统中.程序存储结构(代码区.数据段和BBS区)与进程的基本结构(代码区.数据段.BBS区.堆和栈).以及堆和栈的差别. Linux程序存储结构与进程结构 1.Linux ...

  9. 利用socket.io+nodejs打造简单聊天室

    代码地址如下:http://www.demodashi.com/demo/11579.html 界面展示: 首先展示demo的结果界面,只是简单消息的发送和接收,包括发送文字和发送图片. ws说明: ...

  10. 随机验证码模块(random)

    1. 生成一个6位数字+字母的验证码 (面试题) import random l = []for i in range(6): alpha = chr(random.randint(65,90)) a ...