什么是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. win7+theano with GPU enabled

    要做卷积神经网络的一些东西,所以要装theano,网上很多Theano安装教程版本较老,而各安装包更新很快,参考价值有限.走了很多弯路才装好,把这个过程记录下来,希望对大家有帮助~ ~ 我的配置:wi ...

  2. SQL Server 存储(5/8):理解IAM 页

    在以前的文章里,我们讨论了数据页,GAM和SGAM,还有PFS页.今天我们一起来讨论下索引分配映射(Index Allocation Map:IAM)页. 在SQL Server 2005和以后的版本 ...

  3. Django之Form、CSRF、cookie和session

    Django是一个大而全的web框架,为我们提供了很多实用的功能,本文主要介绍Form.CSRF.cookie和session 一.Form 在web页面中form表单是重要的组成部分,为了数据安全和 ...

  4. Navigation Drawer的使用及遇到的问题

    ActionBar的问题 Navigation View是Android Support Library中的一个新的组件,该组件提供类似于Sliding Menu的抽屉功能,在张兴业的博客中有讲解到具 ...

  5. SQL Server时间粒度系列----第6节基于当前日的小时数和分钟数与mysql unix_timestamp和from_unixtime的mssql实现

    本文目录列表: 1.基于当前日的小时数和分钟数2.mysql unix_timestamp和from_unixtime的mssql实现 3.总结语 4.参考清单列表   基于当前日的小时数和分钟数   ...

  6. JavaScript DOM学习总结(一)

    DOM 什么是DOM?简单地说DOM是一套对文档内容进行抽象和概念化的方法.   W3C给出的DOM定义是这样的:"一个与系统平台和编程语言无关的接口,程序和脚本以通过这个接口动态的访问和修 ...

  7. ECLIPSE ANDROID PROJECT IMPORT SUMMARY

    ECLIPSE ANDROID PROJECT IMPORT SUMMARY======================================Manifest Merging:------- ...

  8. jquery.tmpl.js 模板引擎用法

    1.0 引入: <script src="/js/jquery.tmpl.min.js"></script> 2.0 模板: <script type ...

  9. C#进行Visio二次开发之文件导出及另存Web页面

    在我前面很多关于Visio的开发过程中,介绍了各种Visio的C#开发应用场景,包括对Visio的文档.模具文档.形状.属性数据.各种事件等相关的基础处理,以及Visio本身的整体项目应用,虽然时间过 ...

  10. Java并发编程:CountDownLatch、CyclicBarrier和Semaphore

    Java并发编程:CountDownLatch.CyclicBarrier和Semaphore 在java 1.5中,提供了一些非常有用的辅助类来帮助我们进行并发编程,比如CountDownLatch ...