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
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 15 @Override 16 public void onDestroy() { 17 // TODO Auto-generated method stub 18 super.onDestroy(); 19 } 20 21 22 @Override 23 public IBinder onBind(Intent arg0) { 24 // TODO Auto-generated method stub 25 return mBinder; 26 } 27 28 29 public class MyBinder extends ICalculate.Stub 30 { 31 32 @Override 33 public double doCalculate(double a, double b) throws RemoteException { 34 // TODO Auto-generated method stub 35 return a+b; 36 } 37 38 } 39 40 }
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 17 } 18 };
1 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 4 Button btnPlus; 5 EditText et1; 6 EditText et2; 7 TextView tvResult; 8 9 10 ICalculate mBinder; 11 12 ServiceConnection mCon=new ServiceConnection() { 13 14 @Override 15 public void onServiceDisconnected(ComponentName arg0) { 16 // TODO Auto-generated method stub 17 18 } 19 20 @Override 21 public void onServiceConnected(ComponentName arg0, IBinder arg1) { 22 mBinder=ICalculate.Stub.asInterface(arg1); 23 24 25 26 } 27 }; 28 29 30 @Override 31 protected void onCreate(Bundle savedInstanceState) { 32 super.onCreate(savedInstanceState); 33 setContentView(R.layout.activity_main); 34 35 36 btnPlus=(Button) findViewById(R.id.btnPlus); 37 et1=(EditText) findViewById(R.id.et1); 38 et2=(EditText) findViewById(R.id.et2); 39 tvResult=(TextView) findViewById(R.id.tvResult); 40 41 btnPlus.setOnClickListener(new OnClickListener() { 42 43 @Override 44 public void onClick(View arg0) { 45 46 if(mBinder==null) 47 { 48 return; 49 } 50 51 String num1=et1.getText().toString(); 52 String num2=et2.getText().toString(); 53 54 if(TextUtils.isEmpty(num1)||TextUtils.isEmpty(num2)) 55 { 56 return; 57 } 58 59 double d1=Double.parseDouble(num1); 60 double d2=Double.parseDouble(num2); 61 62 double total=-1; 63 64 Log.i("MainActivity", "onClick() d1="+d1+" d2"+d2); 65 66 67 try { 68 total=mBinder.doCalculate(d1, d2); 69 } catch (RemoteException e) { 70 // TODO Auto-generated catch block 71 e.printStackTrace(); 72 } 73 74 75 tvResult.setText("结果:"+total); 76 77 78 } 79 }); 80 81 Intent intent=new Intent("com.example.calculate.ICalculate"); 82 83 bindService(intent, mCon, Context.BIND_AUTO_CREATE); 84 85 } 86 87 88 89 @Override 90 protected void onDestroy() { 91 // TODO Auto-generated method stub 92 super.onDestroy(); 93 unbindService(mCon); 94 } 95 96 97 98 99 }
注:bindService后记得unbindService
Android中的跨进程调用技术AIDL相关推荐
- Android中的跨进程回调
在Android应用程序开发中,可能会遇到跨进程回调问题,比如,调用一个服务,但服务是异步的,服务完成后,需要给客户一个通知,这时就需要用到跨进程回调了.跨进程回调本质上用到了Binder机制,其过程 ...
- Android中的跨进程通信方法实例及特点分析(二):ContentProvider
1.ContentProvider简单介绍 在Android中有些数据(如通讯录.音频.视频文件等)是要供非常多应用程序使用的.为了更好地对外提供数据,Android系统给我们提供了Content P ...
- IPCInvoker,Android跨进程调用如此简单
一个APP为什么需要多条进程? 如果一条进程能够拥有足够多的资源,且不会被系统kill掉的话,让程序运行在一条进程上是最好的选择.但是系统资源是按进程来分配的,每条进程资源分配是有个上限的,而且当我们 ...
- Android ContentProvider支持跨进程数据共享与互斥、同步 杂谈
在开发中,假如,A.B进程有部分信息需要同步,这个时候怎么处理呢?设想这么一个场景,有个业务复杂的Activity非常占用内存,并引发OOM,所以,想要把这个Activity放到单独进程,以保证OOM ...
- 四大组件之Service(三)-Service的跨进程调用
更新时间 修改意见 2016-08-02 陈敏 第4节 远程调用 之前提到过:如果站在Service与触发Service运行的那个组件的角度,根据它们的关系进行分类,有两种:本地Service,远程S ...
- 跨进程访问(AIDL服务)
我们都知道Service的主要的作用是后台运行和跨进程访问. 关于Service后台运行请查看鄙人的另外一篇文章Service基础 本篇博文主要探讨的是跨进程访问~ 什么是AIDL Android系统 ...
- 微信小游戏直播在Android端的跨进程渲染推流实践
本文由微信开发团队工程师"virwu"分享. 1.引言 近期,微信小游戏支持了视频号一键开播,将微信升级到最新版本,打开腾讯系小游戏(如跳一跳.欢乐斗地主等),在右上角菜单就可以看 ...
- Android中的防缓冲区溢出技术
Android系统提供了非常严格的多层次的安全保护措施,包括代码.为了防止恶意用户采用恶意软件进行缓冲区溢出***或者进行"越狱"操作,自Android 4.0版本之后,内核就引入 ...
- Android开发之跨进程通信-广播跨进程实现方法(附源码)
真的特别简单,简单概述下android的四大组件都可以跨进程. Activity,广播,服务,内容提供者都可以 先看下跨进程传递数据的效果图 下面是两个APP用于模拟跨进程 再看下跨进程效果,AIDL ...
最新文章
- R语言使用ggplot2包使用geom_dotplot函数绘制分组点图(自定义分组颜色、主题)实战(dot plot)
- java web服务与配置,Java Web远端服务器的配置与部署
- 就地电子数据展示与保留
- 横线-文字-横线的html-css布局
- 浅谈ASP.NET框架
- 前端学习(872):注册事件兼容性处理
- 从P560小型机B181201B故障代码识别手把手详解
- 微信支持环信_环信客户互动云v5.39已发布:支持微信小程序接入
- B站在美上市 A站却为融资心塞
- 钢材规格解读的软件_钢结构常用设计软件的总结与分析
- 基于FPGA的图像比例缩放
- 嵌入式系统的开发概述(三星s5p6818系统为例)
- 错过校招_我们在用户测试中容易错过的事情
- 大数据小结(1-4)
- 如何思考产品价值定位?
- STM8S自学笔记之利用库函数点亮一个LED
- 香港中文大学教授、麻省理工牛人林达华解说现代数学体系
- 平面漩涡Shader
- permgen spac_SPAC是AV初创企业的未来
- Java求200内素数质数及其之和
热门文章
- Revit Family API 添加几何实体
- 学习iptables
- 分布式大数据引擎Presto和Apache Spark
- android job service,服务保活那些事(Job Service ,JobScheduler)
- cmake使用教(一)多目录下多个文件的构建
- Javascript第二章break和continue、二重循环及for和while的区别第五课
- python get函数 i_Python高阶技巧,你 GET了吗?
- mysql导入报错1071_导入sql文件报错:1071 Specified key was too long; max key length is 767 bytes...
- oracle sql core目录,oracle11g数据库常见故障处理.ppt
- 使用NodeJS将文件或图像上传到服务器