编写AIDL文件时,需要注意:

1.接口名和aidl文件名相同。

2.接口和方法前不用加访问权限修饰符 (public、private、protected等,也不能用final、static)。

3.AIDL默认支持的类型包括java基本类型 (int、long、boolean等) 和 (String、List、Map、CharSequence),使用这些类型时不需要import声明。对于List和Map中的元素类型必须是AIDL支持的类型,如果使用自定义类型作为参数或者返回值,自定义类型必须实现Parcelable接口。

4.自定义类型和AIDL生成的其它接口类型,在aidl描述文件中,应该显式import,即便在该类和定义的包在同一个包中。

5.在aidl文件中所有非java基本类型参数必须加上in、out、inout标记,以指明参数是输入参数、输出参数还是输入输出参数。

6.Java原始类型默认的标记为in,不能为其它标记。

StudentQuery-aidl文件:(通讯双方共有)

//因为是接口描述,所以跟接口类似,AIDL
interface StudentQuery{ String queryStudent(int number); // 根据id查询学生名称
}

远程服务端:( 为远程服务隐式在清单文件中添加action :com.sample.student.query)

 public  class StudentQueryService extends Service {

       private String[] names = {"张三", "李四" ,"赵武"};
private IBinder binder = new StudentQueryBinder(); @Overrider
public IBinder onBind (Intent intent) {
return binder;
} private final class StudentQueryBinder extends StudentQuery.Stub { public String queryStudent(int number) throws RemoteException {
return query(number);
}
} private String query (int number) { if (number > 0 && number < 4) {
return names[number - 1];
}
return "没有该学生编号";
}
}

客户端(Activity):

 public class MainActivity extends Activity {

        private StudentQuery studentQuery;
private StudentConnection conn = new StudentConnection(); @Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView (R.layout.main); Intent service = new Intent ("com.sample.student.query");
bindService (service, conn, BIND_AUTO_CREATE);
} // 点击查询
public void queryStudent(View view) {
try {
studentQuery.queryStudent(0);
} catch (RemoteException e) {
e.printStackTrace();
}
} private final class StudentConnection implements ServiceConnection { public void onServiceConnected (ComponentName name, IBinder service) {
// asInterface转换代理对象为接口类型。
studentQuery = StudentQuery.Stub.asInterface(service);
} public void onServiceDisconnected (ComponentName name) {
studentQuery = null;
}
} @Override
protected void onDestroy() {
// 销毁
unbindService(conn);
super.onDestroy();
}
}

进程间传递自定义类型参数:

1)自定义类型必须实现Parcelable接口,并且实现Parcelable接口的writeToParcel方法:

 public void writeToParcel (Parcel dest, int flags)

2)自定义类型中必须含有一个名称为CREATOR的静态成员,该成员对象要求实现Parcelable.Createor接口及其方法。

3)创建一个aidl文件声明你的自定义类型。

Parcelable接口的作用:

实现了Parcelable接口的实例可以将自身的状态信息(状态信息通常指的是各成员变量的值)写入Parcel,也可以从Parcel中恢复其状态,Parcel用来完成数据的序列化传递。

AIDL通讯方式:

在Java中不支持跨进程内存共享的。在JavaEE中,采用RMI通过序列化传递对象。

AIDL是一种接口定义语言,用于约束两个进程间的通讯规则,供编译器生成代码,实现Android设备上的两个进程间通讯(IPC),AIDL的IPC机制和EJB所采用的CORBA很类似,进程间的通信信息,首先会被转换成AIDL协议消息,然后发送给对方,对方收到AIDL协议消息后再转换成响应的对象,由于进程之间的通信信息学需要双向转换,所以android采用代理类在背后实现了信息的双向转换,代理类由android编译器生成。

Android AIDL 进行进程间通讯(IPC)的更多相关文章

  1. High Performance Networking in Google Chrome 进程间通讯(IPC) 多进程资源加载

    小结: 1. 小文件存储于一个文件中: 在内部,磁盘缓存(disk cache)实现了它自己的一组数据结构, 它们被存储在一个单独的缓存目录里.其中有索引文件(在浏览器启动时加载到内存中),数据文件( ...

  2. QSharedMemory共享内存实现进程间通讯(IPC)及禁止程序多开

    版权声明:若无来源注明,Techie亮博客文章均为原创. 转载请以链接形式标明本文标题和地址: 本文标题:QSharedMemory共享内存实现进程间通讯(IPC)及禁止程序多开     本文地址:h ...

  3. 服务 远程服务 AIDL 进程间通讯 IPC

    Activity aidl接口文件 package com.bqt.aidlservice;  interface IBinderInterface {     /* 更改文件后缀为[.aidl]去掉 ...

  4. 服务 进程间通讯 IPC AIDL Parcelable 简介

    1.IBinder和Binder是什么鬼? 我们来看看官方文档怎么说: 中文翻译:  IBinder是远程对象的基本接口,是为了高性能而设计的轻量级远程调用机制的核心部分. 但他不仅用于远程调用,也用 ...

  5. 进程间通讯IPC的几种方式总结

    Linux进程间的通讯 Unix发展做出重大贡献的两大主力AT&T的贝尔实验室及BSD(加州大学伯克利分校的伯克利软件发布中心)在进程间通信方面的侧重点有所不同.前者对Unix早期的进程间通信 ...

  6. 服务 远程服务 AIDL 进程间通讯 IPC 深化

    示例 aidl接口文件 package com.bqt.aidlservice.aidl; parcelable Person;  package com.bqt.aidlservice.aidl; ...

  7. 一篇文章了解相见恨晚的 Android Binder 进程间通讯机制【转】

    本文转载自:https://blog.csdn.net/freekiteyu/article/details/70082302 Android-Binder进程间通讯机制 概述 最近在学习Binder ...

  8. Android Binder 进程间通讯机制梳理

    什么是 Binder ? Binder是Android系统中进程间通讯(IPC)的一种方式,也是Android系统中最重要的特性之一.Binder的设计采用了面向对象的思想,在Binder通信模型的四 ...

  9. Python-互斥锁 进程间通讯

    3.守护进程(**) 主进程创建守护进程 其一:守护进程会在主进程代码执行结束后就终止 其二:守护进程内无法再开启子进程,否则抛出异常: AssertionError: daemonic proces ...

随机推荐

  1. 二、JavaScript语言--JS实践--商城分类导航效果

    商城类导航菜单制作(以京东为例--竖向列表横向伸缩) 可以用两种方式来实现:用CSS实现和用JS实现 方法一:用CSS实现(要点:使用hover) <!DOCTYPE html PUBLIC & ...

  2. -A 解决数据库表太多,预读表时间很长

    Reading table information for completion of table and column names You can turn off this feature to ...

  3. LeetCode之Binary Tree Level Order Traversal 层序遍历二叉树

    Binary Tree Level Order Traversal 题目描述: Given a binary tree, return the level order traversal of its ...

  4. Delphi中的接口和抽象类

    参考:http://blog.csdn.net/xinzheng_wang/article/details/6058643 接口:Interface Delphi中接口中的关键字Interface,但 ...

  5. C# SMTP邮件发送 分类: C# 2014-07-13 19:10 333人阅读 评论(1) 收藏

    邮件发送在网站应用程序中经常会用到,包括您现在看到的博客,在添加评论后,系统会自动发送邮件通知到我邮箱的,把系统发送邮件的功能整理了下,做了一个客户端Demo,希望对有需要的童鞋有所帮助: 核心代码: ...

  6. Linux光纖卡配置,磁盤掛載,多路徑設置

    Linux光纖卡配置 1.首先根據光纖卡類型加載對應的驅動.我這裡常用的是QLogic和Brocade光纖卡 [root@rhcsasm2 host3]# lspci | grep Fibre   - ...

  7. ThinkPHP中getField( )和field( )

    做数据库查询的时候,比较经常用到这两个,总是查手册,记不住,现在把它总结下,希望以后用的时候不查手册了. 不管是用select 查询数据集,还是用find 查询数据,常配合连贯操作where.fiel ...

  8. python生成RSS(PyRSS2Gen)

    既然能够用python解析rss,那么也顺带研究下生成rss. 其实很简单,只是生成一个比较特殊点的xml文档而已. 这里我使用了PyRss2Gen,用法很简单,看代码就知道了,如下: import ...

  9. 【转】从RGB色转为灰度色算法

    ----本文摘自作者ZYL910的博客 一.基础  对于彩色转灰度,有一个很著名的心理学公式: Gray = R*0.299 + G*0.587 + B*0.114 二.整数算法 而实际应用时,希望避 ...

  10. android MPAndroidChart饼图实现图例后加数字或文本(定制图例)

    转载请注明:http://blog.csdn.net/ly20116/article/details/50905789 MPAndroidChart是一个非常优秀的开源图表库,MPAndroidCha ...