什么是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

  1. package com.example.calculate;
  2.  
  3. interface ICalculate {
  4. double doCalculate(double a, double b);
  5. }

.aidl编译后会在“gen/包名/”目录中生成ICalculate.java的接口文件

新建一个CalculateService服务,该服务中的MyBinder 实现了ICalculate接口

  1. public class CalculateService extends Service {
  2.  
  3. private MyBinder mBinder;
  4.  
  5. @Override
  6. public void onCreate() {
  7. // TODO Auto-generated method stub
  8. super.onCreate();
  9.  
  10. mBinder = new MyBinder();
  11.  
  12. }
  13.  
  14. @Override
  15. public void onDestroy() {
  16. // TODO Auto-generated method stub
  17. super.onDestroy();
  18. }
  19.  
  20. @Override
  21. public IBinder onBind(Intent arg0) {
  22. // TODO Auto-generated method stub
  23. return mBinder;
  24. }
  25.  
  26. public class MyBinder extends ICalculate.Stub
  27. {
  28.  
  29. @Override
  30. public double doCalculate(double a, double b) throws RemoteException {
  31. // TODO Auto-generated method stub
  32. return a+b;
  33. }
  34.  
  35. }
  36.  
  37. }

AndroidManifest.xml中声明Service

  1. <service
  2. android:name="com.example.aidlserver.CalculateService"
  3. android:enabled="true" >
  4. <intent-filter>
  5. <action android:name="com.example.calculate.ICalculate" />
  6. </intent-filter>
  7. </service>

② AIDLClient

将AIDLServer中的com.example.calculate包拷入AIDLClient(跨进程调用必须包相同)

使用bindService方法来调用CalculateService服务

  1. ICalculate mBinder;
  2.  
  3. ServiceConnection mCon=new ServiceConnection() {
  4.  
  5. @Override
  6. public void onServiceDisconnected(ComponentName arg0) {
  7. // TODO Auto-generated method stub
  8.  
  9. }
  10.  
  11. @Override
  12. public void onServiceConnected(ComponentName arg0, IBinder arg1) {
  13. mBinder=ICalculate.Stub.asInterface(arg1);
  14.  
  15. }
  16. };

Intent intent=new Intent("com.example.calculate.ICalculate");

bindService(intent, mCon, Context.BIND_AUTO_CREATE);

MainActivity.java代码如下:

  1. public class MainActivity extends ActionBarActivity {
  2.  
  3. Button btnPlus;
  4. EditText et1;
  5. EditText et2;
  6. TextView tvResult;
  7.  
  8. ICalculate mBinder;
  9.  
  10. ServiceConnection mCon=new ServiceConnection() {
  11.  
  12. @Override
  13. public void onServiceDisconnected(ComponentName arg0) {
  14. // TODO Auto-generated method stub
  15.  
  16. }
  17.  
  18. @Override
  19. public void onServiceConnected(ComponentName arg0, IBinder arg1) {
  20. mBinder=ICalculate.Stub.asInterface(arg1);
  21.  
  22. }
  23. };
  24.  
  25. @Override
  26. protected void onCreate(Bundle savedInstanceState) {
  27. super.onCreate(savedInstanceState);
  28. setContentView(R.layout.activity_main);
  29.  
  30. btnPlus=(Button) findViewById(R.id.btnPlus);
  31. et1=(EditText) findViewById(R.id.et1);
  32. et2=(EditText) findViewById(R.id.et2);
  33. tvResult=(TextView) findViewById(R.id.tvResult);
  34.  
  35. btnPlus.setOnClickListener(new OnClickListener() {
  36.  
  37. @Override
  38. public void onClick(View arg0) {
  39.  
  40. if(mBinder==null)
  41. {
  42. return;
  43. }
  44.  
  45. String num1=et1.getText().toString();
  46. String num2=et2.getText().toString();
  47.  
  48. if(TextUtils.isEmpty(num1)||TextUtils.isEmpty(num2))
  49. {
  50. return;
  51. }
  52.  
  53. double d1=Double.parseDouble(num1);
  54. double d2=Double.parseDouble(num2);
  55.  
  56. double total=-1;
  57.  
  58. Log.i("MainActivity", "onClick() d1="+d1+" d2"+d2);
  59.  
  60. try {
  61. total=mBinder.doCalculate(d1, d2);
  62. } catch (RemoteException e) {
  63. // TODO Auto-generated catch block
  64. e.printStackTrace();
  65. }
  66.  
  67. tvResult.setText("结果:"+total);
  68.  
  69. }
  70. });
  71.  
  72. Intent intent=new Intent("com.example.calculate.ICalculate");
  73.  
  74. bindService(intent, mCon, Context.BIND_AUTO_CREATE);
  75.  
  76. }
  77.  
  78. @Override
  79. protected void onDestroy() {
  80. // TODO Auto-generated method stub
  81. super.onDestroy();
  82. unbindService(mCon);
  83. }
  84.  
  85. }

注: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. velocity的一些用法

    velocity模板其实就是java不分语法的翻译,用到的属性还是java的方法,get,set,等 1.截取部分字段substring 原始字符串:$!ag.tagValue,也许很长,前端页面展示 ...

  2. Elasticsearch 数据搜索篇·【入门级干货】

    ES即简单又复杂,你可以快速的实现全文检索,又需要了解复杂的REST API.本篇就通过一些简单的搜索命令,帮助你理解ES的相关应用.虽然不能让你理解ES的原理设计,但是可以帮助你理解ES,探寻更多的 ...

  3. 语义化HTML:ul、ol和dl

    一.语义化元素   1. ul标签 W3C草案: The ul element represents an unordered list of items; that is, a list in wh ...

  4. 大话immutable.js

    为啥要用immutable.js呢.毫不夸张的说.有了immutable.js(当然也有其他实现库)..才能将react的性能发挥到极致!要是各位看官用过一段时间的react,而没有用immutabl ...

  5. 使用CSS3对链接颜色与下划线进行优化

    效果: 代码: <!DOCTYPE html> <html lang="en"> <head> <meta charset="U ...

  6. WinForm中DataGridView显示更新数据--人性版

    using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; usin ...

  7. c#中高效的excel导入sqlserver的方法

    将oledb读取的excel数据快速插入的sqlserver中,很多人通过循环来拼接sql,这样做不但容易出错而且效率低下,最好的办法是使用bcp,也就是System.Data.SqlClient.S ...

  8. CodeSnippet.info整体技术构架

    CodeSnippet.info整体架构 服务器端 Asp.NET MVC5 考察过MVC6,但是现在MVC6还不成熟,技术上不稳定,很多资料也比较少. 所以网站暂时使用MVC5.当然网站的大部分业务 ...

  9. Android网页浏览器的开发

    Android网页浏览器的核心Widget是包含了WebKit的WebView. 首先,布局文件activity_main.xml: <LinearLayout xmlns:android=&q ...

  10. 第 24 章 CSS3 变形效果[下]

    学习要点: 1.3D 变形简介 2.transform-style 3.perspective 4.3D 变形属性 主讲教师:李炎恢 本章主要探讨 HTML5 中 CSS3 的变形效果,主要接着上节课 ...