什么是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的更多相关文章

  1. Android中的跨进程通信方法实例及特点分析(一):AIDL Service

    转载请注明出处:http://blog.csdn.net/bettarwang/article/details/40947481 近期有一个需求就是往程序中增加大数据的採集点,可是由于我们的Andro ...

  2. Android中的跨进程通信方法实例及特点分析(二):ContentProvider

    1.ContentProvider简单介绍 在Android中有些数据(如通讯录.音频.视频文件等)是要供非常多应用程序使用的.为了更好地对外提供数据.Android系统给我们提供了Content P ...

  3. 跨进程调用Service(AIDL Service)

    1.什么是aidl:aidl这是 Android Interface definition language的缩写,一看就明确.它是一种android内部进程通信接口的描写叙述语言.通过它我们能够定义 ...

  4. Android四大组件应用系列5——使用AIDL实现跨进程调用Service

    一.问题描述 Android应用程序的四大组件中Activity.BroadcastReceiver.ContentProvider.Service都可以进行跨进程.在上一篇我们通过ContentPr ...

  5. Android四种跨进程通信

    由于android系统中应用程序之间不能共享内存.因此,在不同应用程序之间交互数据(跨进程通讯)就稍微麻烦一些.在android SDK中提供了4种用于跨进程通讯的方式.这4种方式正好对应于andro ...

  6. Android 进阶9:进程通信之 AIDL 解析

    读完本文你将了解: AIDL AIDL 生成文件分析 Stub Proxy AIDL 生成的内容小结 AIDL 的使用回顾 服务端 客户端 小结 手动写个 Binder 首先是定义跨进程接口实现 II ...

  7. 如何处理Android中的防缓冲区溢出技术

    [51CTO专稿]本文将具体介绍Android中的防缓冲区溢出技术的来龙去脉. 1.什么是ASLR? ASLR(Address space layout randomization)是一种针对缓冲区溢 ...

  8. c#中如何跨线程调用windows窗体控件

    c#中如何跨线程调用windows窗体控件?   我们在做winform应用的时候,大部分情况下都会碰到使用多线程控制界面上控件信息的问题.然而我们并不能用传统方法来做这个问题,下面我将详细的介绍.首 ...

  9. Wayland中的跨进程过程调用浅析

    原文地址:http://blog.csdn.net/jinzhuojun/article/details/40264449 Wayland协议主要提供了Client端应用与Server端Composi ...

随机推荐

  1. 服务器程序DEBUG

    服务器程序DEBUG 服务器端设定 Tomcat 默认我们启动Tomcat是使用下边的命令 ./catalina.sh start 如果想DEBUG的话,只需要加一个参数打开JPDA(Java Pla ...

  2. 自制简单实用IoC

    IoC是个好东西,但是为了这个功能而使用类似 Castle 这种大型框架的话,感觉还是不大好 代码是之前写的,一直没详细搞,今天整理了一下,感觉挺实用的. IoC定义接口: using System; ...

  3. JAVA 设计模式 命令模式

    用途 命令模式 (Command) 将一个请求封装为一个对象,从而使你可以用不同的请求对客户进行参数化:对请求排队或请求日志,以及支持可撤销的操作. 命令模式是一种行为型模式. 结构

  4. vim黏贴自动增加tab的毛病

    vim在ctrl + p的时候有可能会自动给你增加了个tab 很是郁闷   解决方法如下: :set noautoindent :set nosmartindent

  5. libqxt编译

    一.说明 编译环境:win10.qt5.6.1-1.vs2013和libqxt源码(从git上下载) libqxt:libqxt 关于libqxt的说明,请到libqxt的官网阅读,说着看图1,图1是 ...

  6. 使用Graphviz绘图(一)

    前言 日常开发或者编写课程论文时,除了代码文档的编写,其中一个很重要的部分就是需要绘制流程图.示意图 绘制流程图有很多工具,一般常见的就有如下几种: Word.PPT等办公软件 Viso以及开源的Di ...

  7. 获取 Chromium 源代码以及环境配置

    一.获取代码 a) 不下载代码,直接浏览,到这里:http://src.chromium.org/viewvc/chrome/ 或者这里:http://code.google.com/p/chromi ...

  8. MySQL日期处理(笔记)

    对于刚学习MySQL的人日期的处理是个大坑. 这里整理了如何处理常见的日期问题. (这只是我在学习过程中关于日期处理方面知识的总结,会有一些错误和片面的地方.) Date 函数 函数 描述 NOW() ...

  9. [moka同学笔记]三、Yii2.0课程笔记(魏曦老师教程)关联字段增加搜索

    关联字段增加搜索 post表关联adminuser表,通过post.author_id  adminuser.id关联,在YII2.0生成搜索,关联字段搜索时,需要输入关联字段author的id才能搜 ...

  10. inflate的基本用法,类似于findviewbyId

    Inflate()作用就是将xml定义的一个布局找出来,但仅仅是找出来而且隐藏的,没有找到的同时并显示功能.最近做的一个项目就是这一点让我迷茫了好几天. android上还有一个与Inflate()类 ...