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

时间: 2024-12-29 23:09:58

Android中的跨进程调用技术AIDL的相关文章

Android中的跨进程通信方法实例及特点分析(一):AIDL Service

转载请注明出处:http://blog.csdn.net/bettarwang/article/details/40947481 最近有一个需求就是往程序中加入大数据的采集点,但是因为我们的Android程序包含两个进程,所以涉及到跨进程通信的问题.现将Android中的跨进程通信方式总结如下. Android中有4种跨进程通信方式,分别是利用AIDL Service.ContentProvider.Broadcast.Activity实现. 1.利用AIDL Service实现跨进程通信 这是

Android学习笔记二十六.跨进程调用Service(AIDL Service)

跨进程调用Service(AIDL Service) 一.AIDL Service 1.什么是AIDL Service? AIDL,即Android Interface Definition Language.是Android用于定义远程接口,AIDL接口定义语言的语法比较简单,这种接口定义语言并不是真正的编程语言,它只是定义两个进程之间的通信接口.AIDL的语法与Java接口很相似,但存在如下几点差异: (1)AIDL定义接口的源代码必须以.aidl结尾; (2)AIDL接口中用到数据类型,除

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

1.ContentProvider简单介绍 在Android中有些数据(如通讯录.音频.视频文件等)是要供非常多应用程序使用的.为了更好地对外提供数据,Android系统给我们提供了Content Provider使用,通过它能够訪问上面所说的数据.比如非常多音乐播放器中的扫描功能事实上就用到了Content Provider功能(当然,也有的播放器是自己去实现更底层的功能). 这种优点是统一管理,比方添加了某个音频文件,底层就会将这种变化通知Content Provider.从而当应用程序訪问

跨进程调用Service(AIDL Service)

1.什么是aidl:aidl是 Android Interface definition language的缩写,一看就明白,它是一种android内部进程通信接口的描述语言,通过它我们可以定义进程间的通信接口 icp:interprocess communication :内部进程通信 2.既然aidl可以定义并实现进程通信,那么我们怎么使用它呢?文档/android-sdk/docs/guide/developing/tools/aidl.html中对步骤作了详细描述: --1.Create

如何处理Android中的防缓冲区溢出技术

[51CTO专稿]本文将具体介绍Android中的防缓冲区溢出技术的来龙去脉. 1.什么是ASLR? ASLR(Address space layout randomization)是一种针对缓冲区溢出的安全保护技术,通过对堆.栈.共享库映射等线性区布局的随机化.通过添加攻击者预測目的地址的难度.防止攻击者直接定位攻击代码位置,达到阻止溢出攻击的目的.通常情况下.黑客会利用某个特定函数或库驻存在特定内存位置的这一事实.通过在操纵堆或其它内存错误时调用该函数来发动攻击.ASLR则可以避免这样的情况

怎样处理Android中的防缓冲区溢出技术

[51CTO专稿]本文将详细介绍Android中的防缓冲区溢出技术的来龙去脉. 1.什么是ASLR? ASLR(Address space layout randomization)是一种针对缓冲区溢出的安全保护技术,通过对堆.栈.共享库映射等线性区布局的随机化,通过增加攻击者预测目的地址的难度,防止攻击者直接定位攻击代码位置,达到阻止溢出攻击的目的.通常情况下,黑客会利用某个特定函数或库驻存在特定内存位置的这一事实,通过在操纵堆或其他内存错误时调用该函数来发动攻击.ASLR则能够避免这种情况,

Eclipse 中java跨工程调用类

在Eclipse中,有时候需要跨工程调用其他工程中的方法.如下面有两个Java Project : 如果要在A工程中调用B工程中的类,可以将B工程添加到A工程中: A---- >Build Path---- >Configure Build Path---- >Java Build Path 选择Projects 这样在项目A中的类就可以直接import B项目中的类啦. Eclipse 中java跨工程调用类

Android跨进程访问(AIDL服务)

我将AndroidAIDL的学习知识总结一下和大家共享 在Android开发中,AIDL主要是用来跨进程访问. Android系统中的进程之间不能共享内存,因此,需要提供一些机制在不同进程之间进行数据通信,一般是和Service服务组件一起使用来实现. 1.创建调用AIDL服务 建立AIDL服务的步骤: 第一步:在Eclipse的Android工程的Java源文件目录中建立一个扩展名为aidl的文件,改文件的语法类似于Java代码,但稍有不同. 第二步:如果aidl文件的内容是正确的,ADT会在

Abdroid---44---使用AIDL Service 实现跨进程调用Service

 为了实现跨进程通信(interprocess communication 简称 IPC),Android提供了AIDL Service. AIDL 是一种IDL语言,用于生成可以在Android设备上两个进程之间进行通信的代码 如果在一个进程中药调用另一个进程中对象的操作,就可以使用AIDL生成可序列化的参数. AIDL是面向接口的 与绑定本地Service不同的是,本地Service的onBind方法会直接把IBinder对象本身传给客户端的ServiceConnection 的onSe