Android中的跨进程调用技术AIDL
什么是AIDL
Android系统中的进程之间不能共享内存,因此,需要提供一些机制在不同进程之间进行数据通信。
为了使其他的应用程序也可以访问本应用程序提供的服务,Android系统采用了远程过程调用(Remote Procedure Call,RPC)方式来实现。
与很多其他的基于RPC的解决方案一样,Android使用一种接口定义语言(Interface Definition Language,IDL)来公开服务的接口。
Android的四大组件中的三个(Activity、BroadcastReceiver和ContentProvider)都可以进行跨进程访问,另外一个Android应用程序组件Service同样可以。因此,可以将这种可以跨进程访问的服务称为AIDL(Android Interface Definition Language)服务。
实现AIDL
建立AIDLServer和AIDLClient项目,如下图:


① AIDLServer
新建一个ICalculate接口,并将文件后缀修改为.aidl
package com.example.calculate;
interface ICalculate {
double doCalculate(double a, double b);
}
.aidl编译后会在“gen/包名/”目录中生成ICalculate.java的接口文件
新建一个CalculateService服务,该服务中的MyBinder 实现了ICalculate接口
public class CalculateService extends Service {
private MyBinder mBinder;
@Override
public void onCreate() {
// TODO Auto-generated method stub
super.onCreate();
mBinder = new MyBinder();
}
@Override
public void onDestroy() {
// TODO Auto-generated method stub
super.onDestroy();
}
@Override
public IBinder onBind(Intent arg0) {
// TODO Auto-generated method stub
return mBinder;
}
public class MyBinder extends ICalculate.Stub
{
@Override
public double doCalculate(double a, double b) throws RemoteException {
// TODO Auto-generated method stub
return a+b;
}
}
}
AndroidManifest.xml中声明Service
<service
android:name="com.example.aidlserver.CalculateService"
android:enabled="true" >
<intent-filter>
<action android:name="com.example.calculate.ICalculate" />
</intent-filter>
</service>
② AIDLClient
将AIDLServer中的com.example.calculate包拷入AIDLClient(跨进程调用必须包相同)
使用bindService方法来调用CalculateService服务
ICalculate mBinder;
ServiceConnection mCon=new ServiceConnection() {
@Override
public void onServiceDisconnected(ComponentName arg0) {
// TODO Auto-generated method stub
}
@Override
public void onServiceConnected(ComponentName arg0, IBinder arg1) {
mBinder=ICalculate.Stub.asInterface(arg1);
}
};
Intent intent=new Intent("com.example.calculate.ICalculate");
bindService(intent, mCon, Context.BIND_AUTO_CREATE);
MainActivity.java代码如下:
public class MainActivity extends ActionBarActivity {
Button btnPlus;
EditText et1;
EditText et2;
TextView tvResult;
ICalculate mBinder;
ServiceConnection mCon=new ServiceConnection() {
@Override
public void onServiceDisconnected(ComponentName arg0) {
// TODO Auto-generated method stub
}
@Override
public void onServiceConnected(ComponentName arg0, IBinder arg1) {
mBinder=ICalculate.Stub.asInterface(arg1);
}
};
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
btnPlus=(Button) findViewById(R.id.btnPlus);
et1=(EditText) findViewById(R.id.et1);
et2=(EditText) findViewById(R.id.et2);
tvResult=(TextView) findViewById(R.id.tvResult);
btnPlus.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View arg0) {
if(mBinder==null)
{
return;
}
String num1=et1.getText().toString();
String num2=et2.getText().toString();
if(TextUtils.isEmpty(num1)||TextUtils.isEmpty(num2))
{
return;
}
double d1=Double.parseDouble(num1);
double d2=Double.parseDouble(num2);
double total=-1;
Log.i("MainActivity", "onClick() d1="+d1+" d2"+d2);
try {
total=mBinder.doCalculate(d1, d2);
} catch (RemoteException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
tvResult.setText("结果:"+total);
}
});
Intent intent=new Intent("com.example.calculate.ICalculate");
bindService(intent, mCon, Context.BIND_AUTO_CREATE);
}
@Override
protected void onDestroy() {
// TODO Auto-generated method stub
super.onDestroy();
unbindService(mCon);
}
}
注:bindService后记得unbindService
Android中的跨进程调用技术AIDL的更多相关文章
- Android中的跨进程通信方法实例及特点分析(一):AIDL Service
转载请注明出处:http://blog.csdn.net/bettarwang/article/details/40947481 近期有一个需求就是往程序中增加大数据的採集点,可是由于我们的Andro ...
- Android中的跨进程通信方法实例及特点分析(二):ContentProvider
1.ContentProvider简单介绍 在Android中有些数据(如通讯录.音频.视频文件等)是要供非常多应用程序使用的.为了更好地对外提供数据.Android系统给我们提供了Content P ...
- 跨进程调用Service(AIDL Service)
1.什么是aidl:aidl这是 Android Interface definition language的缩写,一看就明确.它是一种android内部进程通信接口的描写叙述语言.通过它我们能够定义 ...
- Android四大组件应用系列5——使用AIDL实现跨进程调用Service
一.问题描述 Android应用程序的四大组件中Activity.BroadcastReceiver.ContentProvider.Service都可以进行跨进程.在上一篇我们通过ContentPr ...
- Android四种跨进程通信
由于android系统中应用程序之间不能共享内存.因此,在不同应用程序之间交互数据(跨进程通讯)就稍微麻烦一些.在android SDK中提供了4种用于跨进程通讯的方式.这4种方式正好对应于andro ...
- Android 进阶9:进程通信之 AIDL 解析
读完本文你将了解: AIDL AIDL 生成文件分析 Stub Proxy AIDL 生成的内容小结 AIDL 的使用回顾 服务端 客户端 小结 手动写个 Binder 首先是定义跨进程接口实现 II ...
- 如何处理Android中的防缓冲区溢出技术
[51CTO专稿]本文将具体介绍Android中的防缓冲区溢出技术的来龙去脉. 1.什么是ASLR? ASLR(Address space layout randomization)是一种针对缓冲区溢 ...
- c#中如何跨线程调用windows窗体控件
c#中如何跨线程调用windows窗体控件? 我们在做winform应用的时候,大部分情况下都会碰到使用多线程控制界面上控件信息的问题.然而我们并不能用传统方法来做这个问题,下面我将详细的介绍.首 ...
- Wayland中的跨进程过程调用浅析
原文地址:http://blog.csdn.net/jinzhuojun/article/details/40264449 Wayland协议主要提供了Client端应用与Server端Composi ...
随机推荐
- maven基础知识
1.maven基础知识 1.1maven坐标 maven坐标通常用冒号作为分割符来书写,像这样的格式:groupId:artifactId:packaging:version.项目包含了junit3. ...
- Java魔法堂:JVM的运行模式
一.前言 JVM有Client和Server两种运行模式.不同的模式对应不同的应用场景,而JVM也会有相应的优化.本文将记录JVM模式的信息,以便日后查阅. 二.介绍 在$JAVA_HOME/jre/ ...
- Moon.Orm 5.0(MQL版)及之前版本的开源计划
开源综述:步步开源 Moon.Orm 5.0 (MQL版) 版本维护及下载 (跟踪发布) Moon.Orm 5.0系列文章 Moon.Orm 5.0性能问题,将发言权交给你! 一.5.0目前的情况,步 ...
- Redhat7.2 如何修改主机名(hostname)?
Redhat7.2 在安装的时候,会默认生成主机名:localhost. 那么如何修改成自己想要的自己名? //格式为:用户名@主机名 比如: [root@localhost ~]# 修改成[roo ...
- css3很美的蟠桃动画
查看效果:http://hovertree.com/texiao/css3/26/ 源码下载:http://hovertree.com/h/bjaf/ndhxgfkn.htm 效果图如下: 代码如下: ...
- ISP接口隔离原则
一.定义 不应该强迫客户程序依赖并未使用的方法 二.接口污染 接口污染,在C#.C++这样的静态类型语言中是很常见的.一个接口会被他不需要的方法污染.在接口中假如一个方法只是为了能给它的一个子类带来好 ...
- 删除Android包
Android删除包有很多种方法,其中一种通过Intent删除,代码如下: public boolean unload (String n){ boolean res = true; try{ // ...
- Redis配置集群一(window)
因为接下来的项目要使用到redis作为我们项目的缓存,所以就花了一天时间研究了一下redis的一些用法,因为没转linux虚拟机,所以就决定先研究一下windows版本的redis集群.主要是redi ...
- vim快捷键整理(转载)
一.移动光标 1.左移h.右移l.下移j.上移k2.向下翻页ctrl + f,向上翻页ctrl + b3.向下翻半页ctrl + d,向上翻半页ctrl + u4.移动到行尾$,移动到行首0(数字), ...
- 总结一下工作中用到的Mybatis业务逻辑
1.简单说明. MyBatis 可以使用简单的XML 或注解用于配置和原始映射,将接口和 Java 的 POJO( Plain Old Java Objects,普通的Java 对象)映射成数据库中的 ...