Android AIDL 进行进程间通讯(IPC)
编写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)的更多相关文章
- High Performance Networking in Google Chrome 进程间通讯(IPC) 多进程资源加载
小结: 1. 小文件存储于一个文件中: 在内部,磁盘缓存(disk cache)实现了它自己的一组数据结构, 它们被存储在一个单独的缓存目录里.其中有索引文件(在浏览器启动时加载到内存中),数据文件( ...
- QSharedMemory共享内存实现进程间通讯(IPC)及禁止程序多开
版权声明:若无来源注明,Techie亮博客文章均为原创. 转载请以链接形式标明本文标题和地址: 本文标题:QSharedMemory共享内存实现进程间通讯(IPC)及禁止程序多开 本文地址:h ...
- 服务 远程服务 AIDL 进程间通讯 IPC
Activity aidl接口文件 package com.bqt.aidlservice; interface IBinderInterface { /* 更改文件后缀为[.aidl]去掉 ...
- 服务 进程间通讯 IPC AIDL Parcelable 简介
1.IBinder和Binder是什么鬼? 我们来看看官方文档怎么说: 中文翻译: IBinder是远程对象的基本接口,是为了高性能而设计的轻量级远程调用机制的核心部分. 但他不仅用于远程调用,也用 ...
- 进程间通讯IPC的几种方式总结
Linux进程间的通讯 Unix发展做出重大贡献的两大主力AT&T的贝尔实验室及BSD(加州大学伯克利分校的伯克利软件发布中心)在进程间通信方面的侧重点有所不同.前者对Unix早期的进程间通信 ...
- 服务 远程服务 AIDL 进程间通讯 IPC 深化
示例 aidl接口文件 package com.bqt.aidlservice.aidl; parcelable Person; package com.bqt.aidlservice.aidl; ...
- 一篇文章了解相见恨晚的 Android Binder 进程间通讯机制【转】
本文转载自:https://blog.csdn.net/freekiteyu/article/details/70082302 Android-Binder进程间通讯机制 概述 最近在学习Binder ...
- Android Binder 进程间通讯机制梳理
什么是 Binder ? Binder是Android系统中进程间通讯(IPC)的一种方式,也是Android系统中最重要的特性之一.Binder的设计采用了面向对象的思想,在Binder通信模型的四 ...
- Python-互斥锁 进程间通讯
3.守护进程(**) 主进程创建守护进程 其一:守护进程会在主进程代码执行结束后就终止 其二:守护进程内无法再开启子进程,否则抛出异常: AssertionError: daemonic proces ...
随机推荐
- AFNetworking请求设置请求头
NSString *url = @"INPUT URL HERE"; AFHTTPRequestOperationManager *manager = [AFHTTPRequest ...
- 关于plsql连接oracle数据库session失效时间设置
http://bbs.csdn.net/topics/350152441 http://www.linuxidc.com/Linux/2015-09/123286.htm
- 无废话ExtJs 入门教程四[表单:FormPanel]
无废话ExtJs 入门教程四[表单:FormPanel] extjs技术交流,欢迎加群(201926085) 继上一节内容,我们在窗体里加了个表单.如下所示代码区的第28行位置,items:form. ...
- maven 依赖查询
该文章源地址:http://xiejianglei163.blog.163.com/blog/static/1247276201362733217604/ 为方便个人使用,转载于此处. http:// ...
- WPF MVVM模式下实现ListView下拉显示更多内容
在手机App中,如果有一个展示信息的列表,通常会展示很少一部分,当用户滑动到列表底部时,再加载更多内容.这样有两个好处,提高程序性能,减少网络流量.这篇博客中,将介绍如何在WPF ListView中实 ...
- PMP 第二章 项目生命周期与组织
1 项目组织机构类型有哪些? 区别是什么? 职能型 矩阵型 项目性 2 什么是事业环境因素? 什么是组织过程资产? 如何区分事业环境因素和组织过程资产? 事业环境因素:事业环境因素指围绕项目或能影 ...
- 深入分析JavaWeb 技术内幕
1,通过浏览器请求一个资源,会发生以下几种过程 1) http的解析过程,包括对于http请求头和响应头中指令(控制用户浏览器的渲染行为和 服务器的执行逻辑)的解析 2)DNS的解析过程(根据域名获取 ...
- FZU Problem 2082 过路费 树链剖分
Problem 2082 过路费 Problem Description 有n座城市,由n-1条路相连通,使得任意两座城市之间可达.每条路有过路费,要交过路费才能通过.每条路的过路费经常会更新, ...
- 【JavaScript】变量定义提升、this指针指向、运算符优先级、原型、继承、全局变量污染、对象属性及原型属性优先级
参考资料http://caibaojian.com/toutiao/5446 1.所有变量声明(var)或者声明函数都会被提升到当前函数顶部 关于函数表达式,js会将代码拆分为两行代码分别执行.这里需 ...
- JQuery学习之jQuery尺寸
1.width()和height()方法: width():设置或返回元素的宽度(不包括内边距,边框或外边距) height():设置或返回元素的高度(不包括内边距,边框或外边距) $("b ...