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 ...
随机推荐
- HTTPS协议说明
HTTPS协议说明 基本现在最安全的网络连接就是使用https了,http协议有几个不安全的地方: 传输信息是明文的. -- http的传输信息是明文的,基本网络劫持下就束手就擒了. 不能防止篡改. ...
- 可显示Android设备选择列表,并进入指定Android设备Console的Shell脚本
如果PC上连接多部Android设备(包括Android模拟器),在进入Console时还需要使用adb -s deviceid shell.比较麻烦,本文为此编写了一个Shell脚本文件(需要在Li ...
- 【原创】Kakfa utils源代码分析(三)
Kafka utils包最后一篇~~~ 十五.ShutdownableThread.scala 可关闭的线程抽象类! 继承自Thread同时还接收一个boolean变量isInterruptible表 ...
- “Win10 UAP 开发系列”之主题模式切换
微软动作真是快,本来想写WP8.1RT系列,结果刚整理了一点就出Win10 UAP了.不过还好RT到Win10的差别还不算太大.前两天参加了Win10开发极客秀,虽然没获奖,不过在韦恩卑鄙的帮助下顺利 ...
- 为IEnumerable扩展一个ForEach方法
IEnumerable没有一个ForEach方法,我们可以使用C#写一个扩展方法: Source Code: using System; using System.Collections.Generi ...
- QT TableWidget 应用笔记
QT TableWidget应用笔记 分类: QT2013-05-21 16:22 2561人阅读 评论(0) 收藏 举报 1.设置表头及大小 QStringList header; header&l ...
- C#利用浏览按钮获得文件路径和文件夹路径
生成文件夹路径 private void btnChoose_Click(object sender, EventArgs e) { using (OpenFileDialog ...
- html5学习笔记5--API Range对象(二)
Range对象之cloneRange和cloneContents 代码效果如下 首次点击“选择内容“按钮提示如下 接着会显示 最后显示 以下为整个代码 <!DOCTYPE html> &l ...
- ASP.NET MVC中使用Dropzone.js实现图片的批量拖拽上传
说在前面 最近在做一个MVC相册的网站(这里),需要批量上传照片功能,所以就在网上搜相关的插件,偶然机会发现Dropzone.js,试用了一下完全符合我的要求,而且样式挺满意的,于是就在我的项目中使用 ...
- Java面试总结系列之Collections.sort()
面试中被问到,集合类中的排序方法是怎么实现的?没有回答上来,故而总结如下:你知道么? 前提:在eclipse中对于自己的代码可以通过按住Ctrl的同时单击名称跳入相应源码中.但eclipse默认没有添 ...