什么是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相关推荐

  1. Android中的跨进程回调

    在Android应用程序开发中,可能会遇到跨进程回调问题,比如,调用一个服务,但服务是异步的,服务完成后,需要给客户一个通知,这时就需要用到跨进程回调了.跨进程回调本质上用到了Binder机制,其过程 ...

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

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

  3. IPCInvoker,Android跨进程调用如此简单

    一个APP为什么需要多条进程? 如果一条进程能够拥有足够多的资源,且不会被系统kill掉的话,让程序运行在一条进程上是最好的选择.但是系统资源是按进程来分配的,每条进程资源分配是有个上限的,而且当我们 ...

  4. Android ContentProvider支持跨进程数据共享与互斥、同步 杂谈

    在开发中,假如,A.B进程有部分信息需要同步,这个时候怎么处理呢?设想这么一个场景,有个业务复杂的Activity非常占用内存,并引发OOM,所以,想要把这个Activity放到单独进程,以保证OOM ...

  5. 四大组件之Service(三)-Service的跨进程调用

    更新时间 修改意见 2016-08-02 陈敏 第4节 远程调用 之前提到过:如果站在Service与触发Service运行的那个组件的角度,根据它们的关系进行分类,有两种:本地Service,远程S ...

  6. 跨进程访问(AIDL服务)

    我们都知道Service的主要的作用是后台运行和跨进程访问. 关于Service后台运行请查看鄙人的另外一篇文章Service基础 本篇博文主要探讨的是跨进程访问~ 什么是AIDL Android系统 ...

  7. 微信小游戏直播在Android端的跨进程渲染推流实践

    本文由微信开发团队工程师"virwu"分享. 1.引言 近期,微信小游戏支持了视频号一键开播,将微信升级到最新版本,打开腾讯系小游戏(如跳一跳.欢乐斗地主等),在右上角菜单就可以看 ...

  8. Android中的防缓冲区溢出技术

    Android系统提供了非常严格的多层次的安全保护措施,包括代码.为了防止恶意用户采用恶意软件进行缓冲区溢出***或者进行"越狱"操作,自Android 4.0版本之后,内核就引入 ...

  9. Android开发之跨进程通信-广播跨进程实现方法(附源码)

    真的特别简单,简单概述下android的四大组件都可以跨进程. Activity,广播,服务,内容提供者都可以 先看下跨进程传递数据的效果图 下面是两个APP用于模拟跨进程 再看下跨进程效果,AIDL ...

最新文章

  1. R语言使用ggplot2包使用geom_dotplot函数绘制分组点图(自定义分组颜色、主题)实战(dot plot)
  2. java web服务与配置,Java Web远端服务器的配置与部署
  3. 就地电子数据展示与保留
  4. 横线-文字-横线的html-css布局
  5. 浅谈ASP.NET框架
  6. 前端学习(872):注册事件兼容性处理
  7. 从P560小型机B181201B故障代码识别手把手详解
  8. 微信支持环信_环信客户互动云v5.39已发布:支持微信小程序接入
  9. B站在美上市 A站却为融资心塞
  10. 钢材规格解读的软件_钢结构常用设计软件的总结与分析
  11. 基于FPGA的图像比例缩放
  12. 嵌入式系统的开发概述(三星s5p6818系统为例)
  13. 错过校招_我们在用户测试中容易错过的事情
  14. 大数据小结(1-4)
  15. 如何思考产品价值定位?
  16. STM8S自学笔记之利用库函数点亮一个LED
  17. 香港中文大学教授、麻省理工牛人林达华解说现代数学体系
  18. 平面漩涡Shader
  19. permgen spac_SPAC是AV初创企业的未来
  20. Java求200内素数质数及其之和

热门文章

  1. Revit Family API 添加几何实体
  2. 学习iptables
  3. 分布式大数据引擎Presto和Apache Spark
  4. android job service,服务保活那些事(Job Service ,JobScheduler)
  5. cmake使用教(一)多目录下多个文件的构建
  6. Javascript第二章break和continue、二重循环及for和while的区别第五课
  7. python get函数 i_Python高阶技巧,你 GET了吗?
  8. mysql导入报错1071_导入sql文件报错:1071 Specified key was too long; max key length is 767 bytes...
  9. oracle sql core目录,oracle11g数据库常见故障处理.ppt
  10. 使用NodeJS将文件或图像上传到服务器