当前位置: 首页 > 编程日记 > 正文

Android应用中通过AIDL机制实现进程间的通讯实例

Android中,每个应用程序都有自己的进程,当需要在不同的进程之间传递对象时,该如何实现呢?显然,Java中是不支持跨进程内存共享的,因此要传递对象,需要把对象解析成操作系统能够理解的数据格式,以达到跨界对象访问的目的。在Android中,则采用AIDL(Android Interface Definition Language :接口定义语言)方式实现。

AIDL (Android Interface Definition Language)是一种IDL 语言,用于生成可以在Android设备上两个进程之间进行进程间通信(IPC)的代码。如果在一个进程中(例如Activity)要调用另一个进程中(例如Service)对象的操作,就可以使用AIDL生成可序列化的参数。

AIDL IPC机制是面向接口的,它是使用代理类在客户端和实现端传递数据。

使用AIDL实现IPC

使用AIDL实现IPC服务的步骤是:

1. 创建.aidl文件-该文件(YourInterface.aidl)定义了客户端可用的方法和数据的接口。

2. makefile文件中加入.aidl文件-Eclipse中的ADT插件提供管理功能)Android包括名为AIDL的编译器,位于tools/文件夹。

3. 实现接口-AIDL编译器从AIDL接口文件中利用Java语言创建接口,该接口有一个继承的命名为Stub的内部抽象类(并且实现了一些IPC调用的附加方法),要做的就是创建一个继承于YourInterface.Stub的类并且实现在.aidl文件中声明的方法。

4. 向客户端公开接口-如果是编写服务,应该继承Service并且重载Service.onBind(Intent) 以返回实现了接口的对象实例

创建.aidl文件

AIDL使用简单的语法来声明接口,描述其方法以及方法的参数和返回值。这些参数和返回值可以是任何类型,甚至是其他AIDL生成的接口。重要的是必须导入所有非内置类型,哪怕是这些类型是在与接口相同的包中。下面是AIDL能支持的数据类型:

1.Java编程语言的主要类型 (int, boolean 不需要 import 语句。

2.以下的类 (不需要import 语句):

String

List -列表中的所有元素必须是在此列出的类型,包括其他AIDL生成的接口和可打包类型。List可以像一般的类(例如List<String>)那样使用,另一边接收的具体类一般是一个ArrayList,这些方法会使用List接口。

Map - Map中的所有元素必须是在此列出的类型,包括其他AIDL生成的接口和可打包类型。一般的maps(例如Map<String,Integer>)不被支持,另一边接收的具体类一般是一个HashMap,这些方法会使用Map接口。

CharSequence -该类是被TextView和其他控件对象使用的字符序列。

3.通常引引用方式传递的其他AIDL生成的接口,必须要import 语句声明

4.实现了Parcelable protocol 以及按值传递的自定义类,必须要import 语句声明。

通过对上面的基本了解,下面我就以一个具体的实例来说明Android中如何通过AIDL机制来实现两个进程中实现通讯:(情景假设:例如A应用通过服务Service方式向B应用提供通过书籍编号来查询书籍名称的服务)

A应用程序结构图如下:


通过上面的结构图可以看到,在A应用程序中创建一个 aidl 的接口,然后系统在 gen 目录下自动生成相应的 java 文件。

其中 IBook.aidl 文件的源码:

[html] view plaincopy
  1. package com.andyidea.aidl;  
  2.   
  3. interface IBook {  
  4.       
  5.     String queryBook(int bookNo);  
  6.   
  7. }  

其中 BookService.java 类中的源码如下:

[html] view plaincopy
  1. package com.andyidea.service;  
  2.   
  3. import com.andyidea.aidl.IBook;  
  4.   
  5. import android.app.Service;  
  6. import android.content.Intent;  
  7. import android.os.IBinder;  
  8. import android.os.RemoteException;  
  9.   
  10. /**  
  11.  * 查询书籍的服务  
  12.  * @author Andy  
  13.  *  
  14.  */  
  15. public class BookService extends Service {  
  16.       
  17.     private String[] bookNames = {"Java编程思想","设计模式","Android开发设计"};   
  18.       
  19.     private IBinder mIBinder = new BookBinder();  
  20.   
  21.     @Override  
  22.     public IBinder onBind(Intent intent) {  
  23.         // TODO Auto-generated method stub  
  24.         return mIBinder;  
  25.     }  
  26.       
  27.     /**  
  28.      * 服务中交互的方法  
  29.      * @param bookNo  
  30.      * @return  
  31.      */  
  32.     public String queryBookName(int bookNo){  
  33.         if(bookNo > 0 && bookNo <= bookNames.length){  
  34.             return bookNames[bookNo-1];  
  35.         }  
  36.         return null;  
  37.     }  
  38.       
  39.     private class BookBinder extends IBook.Stub{  
  40.   
  41.         @Override  
  42.         public String queryBook(int bookNo) throws RemoteException {  
  43.             return queryBookName(bookNo);  
  44.         }  
  45.           
  46.     }  
  47.   
  48. }  
同时别忘了在 Manifest.xml中配置该服务对象(标红色的部分),建议采用隐式方式激活该服务,适合不同的进程的意图。

[html] view plaincopy
  1. <?xml version="1.0" encoding="utf-8"?>  
  2. <manifest xmlns:android="http://schemas.android.com/apk/res/android"  
  3.     package="com.andyidea.service"  
  4.     android:versionCode="1"  
  5.     android:versionName="1.0" >  
  6.   
  7.     <uses-sdk android:minSdkVersion="8" />  
  8.   
  9.     <application  
  10.         android:icon="@drawable/ic_launcher"  
  11.         android:label="@string/app_name" >  
  12.           
  13. <span style="color:#ff0000;">        <service android:name=".BookService">  
  14.             <intent-filter>  
  15.                 <action android:name="com.andyidea.aidl.bookservice"/>  
  16.             </intent-filter>  
  17.         </service></span>  
  18.     </application>  
  19.   
  20. </manifest>  
以上我们已经实现了A应用程序提供服务的功能,下面我们来实现B应用(或者其它需要用到A应用提供服务的应用程序)

B应用程序结构图如下:


我们看到B应用程序也要和服务端同样的 .aidl 文件,我们可以从A应用程序中把该 aidl 文件中拷贝过来就是了,呵。由于B应用中 .aidl 文件和 A应用中的 .aidl 文件源码一样,我在这里就不列出来了。

其中AIDLClientDemoActivity.java源码如下:【注:其中该客户端类要通过 bindService 方式来启动另外一个进程的服务,这样才能实现和服务进行交互。如果通过startService方式来启动服务,则不能与服务进行交互】

[html] view plaincopy
  1. package com.andyidea.client;  
  2.   
  3. import android.app.Activity;  
  4. import android.content.ComponentName;  
  5. import android.content.Intent;  
  6. import android.content.ServiceConnection;  
  7. import android.os.Bundle;  
  8. import android.os.IBinder;  
  9. import android.os.RemoteException;  
  10. import android.view.View;  
  11. import android.widget.Button;  
  12. import android.widget.EditText;  
  13. import android.widget.TextView;  
  14.   
  15. import com.andyidea.aidl.IBook;  
  16.   
  17. public class AIDLClientDemoActivity extends Activity {  
  18.       
  19.     private EditText numberText;  
  20.     private TextView resultView;  
  21.     private Button query;  
  22.     private IBook bookQuery;  
  23.     private BookConnection bookConn = new BookConnection();  
  24.       
  25.     /** Called when the activity is first created. */  
  26.     @Override  
  27.     public void onCreate(Bundle savedInstanceState) {  
  28.         super.onCreate(savedInstanceState);  
  29.         setContentView(R.layout.main);  
  30.           
  31.         numberText = (EditText) this.findViewById(R.id.number);  
  32.         resultView = (TextView) this.findViewById(R.id.resultView);  
  33.         query = (Button)findViewById(R.id.query);  
  34.           
  35.         Intent service = new Intent("com.andyidea.aidl.bookservice");  
  36.         bindService(service, bookConn, BIND_AUTO_CREATE);  
  37.           
  38.         query.setOnClickListener(new View.OnClickListener() {  
  39.               
  40.             @Override  
  41.             public void onClick(View v) {  
  42.                 String number = numberText.getText().toString();  
  43.                 int num = Integer.valueOf(number);  
  44.                 try {  
  45.                     resultView.setText(bookQuery.queryBook(num));  
  46.                 } catch (RemoteException e) {  
  47.                     e.printStackTrace();  
  48.                 }  
  49.             }  
  50.         });  
  51.     }  
  52.       
  53.     @Override  
  54.     protected void onDestroy() {  
  55.         unbindService(bookConn);  
  56.         super.onDestroy();  
  57.     }  
  58.       
  59.     private final class BookConnection implements ServiceConnection{  
  60.   
  61.         @Override  
  62.         public void onServiceConnected(ComponentName name, IBinder service) {  
  63.             // TODO Auto-generated method stub  
  64.             bookQuery = IBook.Stub.asInterface(service);  
  65.         }  
  66.   
  67.         @Override  
  68.         public void onServiceDisconnected(ComponentName name) {  
  69.             // TODO Auto-generated method stub  
  70.             bookQuery = null;  
  71.         }  
  72.           
  73.     }  
  74. }  
其中界面布局文件 main.xml 源码:

[html] view plaincopy
  1. <?xml version="1.0" encoding="utf-8"?>  
  2. <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"  
  3.     android:layout_width="fill_parent"  
  4.     android:layout_height="fill_parent"  
  5.     android:orientation="vertical" >  
  6.   
  7.     <TextView  
  8.         android:layout_width="fill_parent"  
  9.         android:layout_height="wrap_content"  
  10.         android:text="书籍编号" />  
  11.     <EditText   
  12.         android:id="@+id/number"  
  13.         android:layout_width="fill_parent"  
  14.         android:layout_height="wrap_content"/>  
  15.     <Button  
  16.         android:id="@+id/query"  
  17.         android:layout_width="wrap_content"  
  18.         android:layout_height="wrap_content"  
  19.         android:text="查询"/>  
  20.     <TextView   
  21.         android:id="@+id/resultView"  
  22.         android:layout_width="fill_parent"  
  23.         android:layout_height="wrap_content"/>  
  24. </LinearLayout>  
至此,我们已经完成了B应用程序的代码实现部分,我们要先把A应用程序部署到机器上,然后我们再运行B应用程序。下面我们通过截图来看下程序运行的结果:

通过上面的截图,我们输入书籍编号 1,就可以查询出相应的书籍名称,到此,我们就可以了解了 Android应用中如何通过AIDL机制实现两个进程的通讯。


转载于:https://www.cnblogs.com/ansionchen/archive/2012/07/03/3019206.html

相关文章:

06 Scratch等级考试(一级)模拟题

Scratch竞赛交流群已成立&#xff08;适合6至18周岁的青少年&#xff09;&#xff0c;公众号后台回复【Scratch】&#xff0c;即可进入。如果加入了之前的社群不需要重复加入。 微信后台回复“资料下载”可获取以往学习的材料&#xff08;视频、代码、文档&#xff09;。 这是第…

区分BundleVersion和BundleShortVersionString

区分BundleVersion和BundleShortVersionString最近遇到了关于检查更新的版本问题了。问题出在了Info.Plist配置中的两个字段&#xff0c;BundleVersion和BundleShortVersionString。搞了两年的开发&#xff0c;第一次看到还有另一个字段的版本。由于版本检测升级的问题&#xf…

UI设计培训技术分享:配色秘籍

设计中颜色的使用是一个非常值得关注的问题&#xff0c;同样的构图、版式&#xff0c;但是不同的颜色搭配给人的感觉就完全不一样&#xff0c;色彩的冷暖&#xff0c;明暗变化琳琅满目&#xff0c;表达不同的氛围与情绪&#xff0c;对于新手设计来讲&#xff0c;配色是个不容小…

安全的Web主机iptables防火墙脚本

下面以自己的Web服务器举例说明之&#xff0c;系统的默认策略是INPUT为DROP&#xff0c;OUTPUT、FORWARD链为ACCEPT&#xff0c;DROP设置得比较宽松&#xff0c;因为我们知道出去的数据包比较安全&#xff1b;为了验证脚本的通用性&#xff0c;我特的查看了服务器的内核及iptab…

用户至上-阿里马马篇

最近经常在阿里巴巴的平台里活动&#xff0c;突然发现&#xff0c;支付宝病了。 当用户生成一单交易后&#xff0c;需要用支付宝支付时&#xff0c;如何保证是用户本人在操作呢&#xff1f; 当初&#xff0c;支付宝是国内第一家很好地解决这个问题的。 解决的途径主要是&#x…

【复盘】小朋友的奇思妙想

Scratch竞赛交流群已成立&#xff08;适合6至18周岁的青少年&#xff09;&#xff0c;公众号后台回复【Scratch】&#xff0c;即可进入。如果加入了之前的社群不需要重复加入。 微信后台回复“资料下载”可获取以往学习的材料&#xff08;视频、代码、文档&#xff09;。 上周日…

UI设计培训技术分享:搞定萌萌哒可爱图标

UI设计要学到的东西有很多&#xff0c;那么关于图标设计就是其中的一种&#xff0c;很多企业比较忠于萌萌哒的可爱图标&#xff0c;那么如何搞定萌萌哒可爱图标呢?来看看下面UI设计培训技术分享教程。 UI设计培训技术分享&#xff1a;搞定萌萌哒可爱图标 萌萌哒的图标制作有三…

远程处理Remoting

日程 ?应用程序域 ?Remoting和原理 ?编程式和管理式配置实例 用应用程序域 操作系统和运行库环境通常会在应用程序间提供某种形式的隔离。例如&#xff0c;Microsoft Windows 使用进程来隔离应用程序。为确保在一个应用程序中运行的代码不会对其他不相关的应用程序产生不良影…

Datawhale组队学习周报(第002周)

Datawhale组队学习周报&#xff08;第002周&#xff09; &#xff08;一&#xff09;当下 本周&#xff08;02月22日~02月28日&#xff09;&#xff0c;我们正在进行5门开源内容的组队学习。一共建立了6个学习群&#xff0c;参与人数1080人。到目前为止&#xff0c;有4门课开…

LVS(Linux Virtual Server)三种负载均衡模型和十种调度的简单介绍

LVS(Linux Virtual Server)三种负载均衡模型和十种调度的简单介绍 LVS (Linux Virtual Server) LVS&#xff08;Linux Virtual Server&#xff09;其实就是针对高可伸缩、高可用网络服务的需求&#xff0c;给出了基于IP层和基于内容请求分发的负载平衡调度解决方法&#xff0c;…

UI设计培训分享:设计当中的颜色运用

参加UI设计培训的同学应该都知道&#xff0c;颜色的搭配是学习UI设计非常重要的一步&#xff0c;颜色跟其他的东西一样&#xff0c;适量才会运用得当&#xff0c;如果在你的配色计划中坚持使用马克思三原色的话&#xff0c;你会得到更好的配色结果&#xff0c;为一个项目配色时…

《重构-改善既有代码的设计》读书笔记(二)

12、Lazy Class – 冗赘类 对于几乎没有用的类&#xff0c;运用inline class 将其功能移动。去除这些不值得维护的类。 13、Speculative Generality – 夸夸其谈未来性 对于你现在用不到&#xff0c;觉得总有一天会用到的代码&#xff0c;要警惕。用不上的装置总会挡我们的路&a…

css属性选择符的应用

注释&#xff1a;Internet Explorer 7 &#xff08;以及更高版本&#xff09;在规定了 !DOCTYPE 的情况下支持属性选择器。IE6 及更低的版本不支持属性选择器。 [title]{color:red;}  //为带有 title 属性的所有元素设置样式&#xff1a; [title"website"]{color:r…

【青少年编程】【答疑】控制Scratch异步代码的执行顺序

问题 几天前&#xff0c;我写了一篇图文 对「等待&#xff08;0&#xff09;秒」的理解&#xff0c;发现可以利用「等待&#xff08;0&#xff09;秒」这个积木块来解决Scratch中异步代码的执行顺序问题&#xff0c;即点击绿旗后可以控制多个角色中响应该事件的代码的顺序。 …

UI设计培训分享:学习UI设计有哪些技巧

互联网时代的快速发展&#xff0c;UI设计这个行业在互联网有着一席之地&#xff0c;越来越多的人都想要参加UI设计培训班学习&#xff0c;那么对于初学者来说&#xff0c;学习UI设计有哪些技巧呢?来看看下面的详细介绍吧。 学习UI设计有哪些技巧? 1、基础软件操作 UI设计培训…

07 Scratch等级考试(一级)模拟题

Scratch竞赛交流群已成立&#xff08;适合6至18周岁的青少年&#xff09;&#xff0c;公众号后台回复【Scratch】&#xff0c;即可进入。如果加入了之前的社群不需要重复加入。 微信后台回复“资料下载”可获取以往学习的材料&#xff08;视频、代码、文档&#xff09;。 这是第…

遮罩层+软键盘

一&#xff0e;清关里边申请清关 上传图片由于本身就是布局用的图片&#xff0c;微信手机长按会出现保存收藏该图片。 解决方法&#xff1a;添加同级元素充当遮罩层。设置样式&#xff0c;把点击事件从设置的上传图片中移除即可。 1&#xff09;<!-- 图片遮罩层 --> <…

UI培训技术分享:设计大神都在用的10种技法!

越来越多的人开始学习UI设计&#xff0c;想要进群到UI设计这个行业&#xff0c;本期小编为大家介绍的UI培训教程就是关于设计师会经常用到的一些技巧&#xff0c;帮助大家后期的工作中的应用。 UI培训技术分享&#xff1a;设计大神都在用的10种技法! 1.将图片融入背景来使用 同…

正则表达式限制输入整数或小数

string pattern "^\d{1,7}(?:\.\d{0,2}$|$)"; //这是一个格式匹配字符串 其中的含义可以参考http://hi.baidu.com/%D6%C2%D0%F9%B8%F3/blog/item/9060fe35f84f872370cf6c83.html。如果调用以下代码&#xff0c;可以匹配整数位最多为7位&#xff0c;小数位最多为2位…

QC配置邮件服务器(Mail Dir)

http://blog.sina.com.cn/s/blog_5007d1b10100m8cm.html 本文转自hblxp32151CTO博客&#xff0c;原文链接&#xff1a;http://blog.51cto.com/starpoint/584056&#xff0c;如需转载请自行联系原作者

Datawhale组队学习周报(第003周)

&#xff08;一&#xff09;当下 本周&#xff08;03月01日~03月07日&#xff09;&#xff0c;我们组织的5门组队学习的课程中有3门已经结营&#xff0c;2门仍在进行中。 1. CV实践-布匹疵点智能识别&#xff08;异常检测&#xff09; 已经结营&#xff0c;优秀队长与优秀学…

软件测试培训分享:如何才能选择到靠谱的培训学校

软件测试这个行业在近几年是非常的吃香的&#xff0c;职业需求也是非常大的&#xff0c;很多小伙伴都想寻找一个合适的软件测试培训机构进行系统学习&#xff0c;那么如何才能选择到靠谱的培训学校呢?来看看下面的详细介绍。 如何才能选择到靠谱的软件测试培训学校?一般可从以…

《统一沟通-微软-实战》-5-部署-SharePoint Server 2010

1. 登录-SP2010 2. 查看-计算机名 3. 查看-IP 4. 加域 5. 上网 安装 SharePoint Server 2010 若要安装和配置 SharePoint Server 2010&#xff0c;请按照以下步骤执行&#xff1a; 1. 运行 Microsoft SharePoint 产品准备工具&#xff0c;该工具安装使用 SharePoint Server 所需…

JQuery 给DOM控件绑定和移除事件的方法

绑定事件&#xff1a; Method 1$("#myElement").click( function() {alert($(this).text());}); Method 2 $("#myElement").bind(click, function() {alert($(this).text());}); 第一种看起来要方便一些&#xff0c;但它有一个局限&#xff0c;即DOM元素必…

【组队学习】【23期】Datawhale集成学习(上)

集成学习&#xff08;上&#xff09; 开源内容&#xff1a;https://github.com/datawhalechina/team-learning-data-mining/tree/master/IntegratedLearning 基本信息 贡献人员&#xff1a;李祖贤、薛传雨、赵可、杨毅远、陈琰钰学习周期&#xff1a;14天学习形式&#xff1…

APP测试和传统软件测试有什么区别?

软件测试从字面意思我们就知道它主要是做软件产品方面的测试&#xff0c;尤其是APP这块&#xff0c;那么很多人就问了APP测试和传统软件测试有什么区别?来看看下面的详细介绍。 软件测试培训分享&#xff1a;APP测试和传统软件测试有什么区别?移动APP的特点使得它与传统软件在…

C6678-SRIO和Virtex6-FPGA

设计的板子到了SRIO调试阶段了&#xff0c;在板子上&#xff0c;一片V6和两片6678通过4XSRIO互联&#xff0c;中间没有Switch&#xff0c;总算搞定了相互之间的通信。首先&#xff0c;感谢Ti论坛提供的SRIO程序范例&#xff0c;但是其硬件平台是EVM板&#xff0c;更多的只能用于…

【组队学习】【23期】Datawhale编程实践(区块链)

编程实践&#xff08;区块链&#xff09; 开源内容&#xff1a;https://github.com/datawhalechina/team-learning-program/tree/master/Blockchain 基本信息 贡献人员&#xff1a;陈锴、孙子涵、李岳昆、易远哲学习周期&#xff1a;12天学习形式&#xff1a;根据教程主线进…

bootstrap模态框显示控制

默认模态框弹出后&#xff0c;点击背景蒙层部分弹框会消失&#xff0c;如要解决&#xff0c;需要在模态框属性中加 aria-hidden"true" data-backdrop"static"属性即可&#xff1b; 转载于:https://www.cnblogs.com/jiangze-blog/p/7844639.html

什么是Python?主要运用哪些方面?

人工智能领域少不了Python的相助&#xff0c;这也是目前Python技术在人工领域的好前景所致&#xff0c;近几年&#xff0c;想要学习Python技术的人越来越多&#xff0c;很多人都想知道什么是Python?主要运用哪些方面?来看看下面的详细介绍。 什么是Python?主要运用哪些方面?…