Android探索之AIDL实现进程间通信
前言:
前面总结了程序间共享数据,可以使用ContentProvider也可以使用SharedPreference,那么进程间怎么共享内存呢?Android系统中的进程之间不能共享内存,因此,需要提供一些机制在不同进程之间进行数据通信。
为了使其他的应用程序也可以访问本应用程序提供的服务,Android系统采用了远程过程调用(Remote Procedure Call,RPC)方式来实现。与很多其他的基于RPC的解决方案一样,Android使用一种接口定义语言(Interface Definition Language,IDL)来公开服务的接口。我们知道4个Android应用程序组件中的3个(Activity、BroadcastReceiver和ContentProvider)都可以进行跨进程访问,另外一个Android应用程序组件Service同样可以。因此,可以将这种可以跨进程访问的服务称为AIDL(Android Interface Definition Language)服务。
接下来实战一下具体实现:
1.)首先新建一个aidl文件
interface ITestInterface {
//获取进程ID
int getProcessId();
//处理字符串
String dealString( String srcString);
//字符串追加
String appendString( String srcString);
void addPerson(in Person person);
List<Person> getPersons();
}
aidl语法解说:
- 声明函数基本和Java一致,可以传参和返回值,参数和返回值
- 参数和返回值 Java编程语言的基本数据类型 (int, long, char, boolean等),String和CharSequence,集合接口类型List和Map、其他AIDL接口类型、实现Parcelable接口的自定义对象
- 方向指示 在使用aidl传输数据时,对于非基本数据类型,也不是String和CharSequence类型的,(即Parcelable类型)需要有方向指示,包括in、out和inout。
- AIDL只支持接口方法,不能公开static变量。
2.)服务端实现接口
private final ITestInterface.Stub mBinder = new ITestInterface.Stub() {
public int getProcessId(){
Log.e("TestService","TestService Thread: " + Thread.currentThread().getName());
Log.e("TestService","TestService getProcessId()");
return android.os.Process.myPid();
}
//处理字符串
public String dealString( String srcString)
{
return srcString+srcString;
}
//字符串追加
public String appendString( String srcString)
{
return srcString+srcString;
}
3.)客户端获取接口
private ServiceConnection connection = new ServiceConnection() {
@Override
public void onServiceDisconnected(ComponentName name) {
Log.e("TestService","TestService onServiceDisconnected()");
}
@Override
public void onServiceConnected(ComponentName name, IBinder service) {
iTestInterface = ITestInterface.Stub.asInterface(service);
try {
Log.e("TestService","TestService onServiceConnected()");
int remoteId=iTestInterface.getProcessId();
Log.e("TestService","TestService remoteId---->"+remoteId);
int currentPid = android.os.Process.myPid();
Log.e("TestService","TestService currentPid---->"+currentPid);
Log.e("TestService","TestService dealString---->"+iTestInterface.dealString("Remote Service"));
Log.e("TestService","TestService appendString---->"+iTestInterface.appendString("Remote Service"));
} catch (RemoteException e) {
e.printStackTrace();
}
}
};
4.)通过IPC调用/传递数据
int remoteId=iTestInterface.getProcessId();
Log.e("TestService","TestService remoteId---->"+remoteId);
int currentPid = android.os.Process.myPid();
Log.e("TestService","TestService currentPid---->"+currentPid);
Log.e("TestService","TestService dealString---->"+iTestInterface.dealString("Remote Service"));
Log.e("TestService","TestService appendString---->"+iTestInterface.appendString("Remote Service"));
5.)Service声明以及绑定/解绑
声明:
<service
android:name=".TestService"
android:enabled="true"
android:exported="true"
android:label="remoteService"
android:process=":remote">
<intent-filter android:priority="1000">
<category android:name="android.intent.category.DEFAULT" />
<action android:name="com.whoislcj.testaidl.TestService" />
</intent-filter>
</service>
绑定:
Intent intent = new Intent("com.whoislcj.testaidl.TestService");
intent.setPackage(getPackageName());//这里你需要设置你应用的包名
bindService(intent, connection, Context.BIND_AUTO_CREATE);
解绑:
unbindService(connection);
6.)访问权限同Service一致
Android探索之AIDL实现进程间通信的更多相关文章
- Android探索之旅 | AIDL原理和实例讲解
轉載自http://www.jianshu.com/p/ef86f682a8f9 -- 作者 谢恩铭 转载请注明出处 前言 为使应用程序之间能够彼此通信,Android提供了IPC (Inter Pr ...
- (转载)Android:学习AIDL,这一篇文章就够了(上)
前言 在决定用这个标题之前甚是忐忑,主要是担心自己对AIDL的理解不够深入,到时候大家看了之后说——你这是什么玩意儿,就这么点东西就敢说够了?简直是坐井观天不知所谓——那样就很尴尬了.不过又转念一想, ...
- Android开发之---AIDL
在Android开发中,有时会用到多进程通信,这时,可选的方案为: 1. Bundle :四大组件之间的进程间通信 2. 文件共享 :适合无并发情景 3. Messager : 低并发的一对 ...
- Android 中的AIDL,Parcelable和远程服务
Android 中的AIDL,Parcelable和远程服务 早期在学习期间便接触到AIDL,当时对此的运用也是一撇而过.只到近日在项目中接触到AIDL,才开始仔细深入.AIDL的作用 ...
- Android开发高级进阶——多进程间通信
一. 什么是多进程? 多进程就是多个进程的意思,那么什么是进程呢? 当一个应用在开始运行时,系统会为它创建一个进程,一个应用默认只有一个进程,这个进程(主进程)的名称就是应用的包名. 进程的特点: 进 ...
- Android中的Service与进程间通信(IPC)详解
Service 什么是Service 在后台长期运行的没有界面的组件.其他组件可以启动Service让他在后台运行,或者绑定Service与它进行交互,甚至实现进程间通信(IPC).例如,可以让服务在 ...
- Android:学习AIDL,这一篇文章就够了(下)
前言 上一篇博文介绍了关于AIDL是什么,为什么我们需要AIDL,AIDL的语法以及如何使用AIDL等方面的知识,这一篇博文将顺着上一篇的思路往下走,接着介绍关于AIDL的一些更加深入的知识.强烈建议 ...
- Android service binder aidl 关系
/********************************************************************************** * Android servic ...
- (转载)Android:学习AIDL,这一篇文章就够了(下)
前言 上一篇博文介绍了关于AIDL是什么,为什么我们需要AIDL,AIDL的语法以及如何使用AIDL等方面的知识,这一篇博文将顺着上一篇的思路往下走,接着介绍关于AIDL的一些更加深入的知识.强烈建议 ...
随机推荐
- IE6/7下空div占用空间的问题
最近注意力没在前端上面,工作碰到这样一个问题,下意识的写了句 font-size:0;line-height:0;哪知道引发了更大的bug.后来插入数据进去的时候都不显示了..再后来百度一番找到,原来 ...
- 第一个shell脚本
打开文本编辑器,新建一个文件,扩展名为sh(sh代表shell),扩展名并不影响脚本执行,见名知意就好. #!/bin/bash echo "Hello World !" &quo ...
- Node.js:OS模块
os模块,可以用来获取操作系统相关的信息和机器物理信息,例如操作系统平台,内核,cpu架构,内存,cpu,网卡等信息. 使用如下所示: const os = require('os'); var de ...
- MFC中如何画带实心箭头的直线
工作中遇到话流程图的项目,需要画带箭头的直线,经过摸索,解决:思路如下: (1) 两个点(p1,p2)确定一个直线,以直线的一个端点(假设p2)为原点,设定一个角度 (2)以P2为原点得到向量P2P1 ...
- javascript 判断参数类型大全
js 判断类型的在开发中是很常用的,因为js 是弱类型的语言,var 可以接受任何形式的类型,但是在真正的开发中,我们需要根据不同类型做不同的处理,所以这个是必须的精通. 首先需要知道 typeof这 ...
- maven依赖查询地址
http://search.maven.org/#search%7Cga%7C1%7C
- SharePoint 2013: A feature with ID has already been installed in this farm
使用Visual Studio 2013创建一个可视web 部件,当右击项目选择"部署"时报错: "Error occurred in deployment step ' ...
- linux系统oracle-ora12505问题解决方案一
说明:(1)Linux版本 Linux version 2.6.32.12-0.7-default (geeko@buildhost) (gcc version 4.3.4 [gcc-4_3-bran ...
- mysql 写入优化
1 主从分离 从表读取,主表可以去掉索引 2 先写入到文件或redis,定时刷新到库 3 用nginx 4 分库 分表 每个库表的数据总量少了 插入会快一点 5 最大限度减少查库的次数 6 一条sql ...
- git图像化界面GUI的使用
GIT学习笔记 一. 基础内容 1.git是一个版本控制软件,与svn类似,特点是分布式管理,不需要中间总的服务器,可以增加很多分支. 2.windows下的git叫msysgit,下载 ...