Android IPC通信以及AIDL技术运用

来源:互联网 发布:淘宝大学ps教程 编辑:程序博客网 时间:2024/06/05 00:45
首先我们了解一下 IPC和AIDL
IPC:进程间通信
AIDL:Android Interface Definition Language,即Android接口定义语言。为什么使用:Android系统中的进程之间不能共享内存,因此,需要提供一些机制在不同进程之间进行数据通信。为了使其他的应用程序也可以访问本应用程序提供的服务,Android系统采用了远程过程调用(Remote Procedure Call,RPC)方式来实现。与很多其他的基于RPC的解决方案一样,Android使用一种接口定义语言(Interface Definition Language,IDL)来公开服务的接口。我们知道4个Android应用程序组件中的3个(Activity、BroadcastReceiver和ContentProvider)都可以进行跨进程访问,另外一个Android应用程序组件Service同样可以。因此,可以将这种可以跨进程访问的服务称为AIDL(Android Interface Definition Language)服务。
说了那么久还是有些抽象,那么就举一个小例子,可能不太合适,但是仅作为帮助理解使用;
既现在有一个用户要在京东商城购买东西,但是在付款的时候需要调用支付插件(就支付宝ba ),支付宝肯定不会把核心付款的代码给你,于是支付宝只能给你一个方法
int pay(int money);
这里面有需要传递的参数(价格),返回是否付款成功的返回值 ,让用户在京东商城即可付款。
现在开发这个需求 ,首先定义一个接口供京东商城调用,此文件名为PayInterface.aidl
package com.example.alipay;   interface PayInterface {int pay(int money);}
然后我定义自己的实现方法,开启服务,接收京东商城用户调用;
package com.example.alipay;   import com.example.alipay.PayInterface.Stub;import android.app.Service;import android.content.Intent;import android.os.Binder;import android.os.IBinder;import android.os.RemoteException;public class AliPayService extends Service{@Overridepublic void onCreate() {System.out.println("开启远程支付服务");super.onCreate();}@Overridepublic IBinder onBind(Intent intent) {return new MyIBinder();}@Overridepublic boolean onUnbind(Intent intent) {return super.onUnbind(intent);}@Overridepublic void onDestroy() {super.onDestroy();}private class MyIBinder extends Stub{@Overridepublic int pay(int money) throws RemoteException {if(money == 200)return 1;return 0;}}}

MyIBinder extends Stub
这个类,用户在商城付款时绑定服务返回的对象,stub是PayInterface.aidl文件定义完成后后自动生成的JAVA类,在该类中实现了自己的支付核心代码,然后再主程序安装此app;相当于安装了支付插件,安装完成后如图所示;
接着,我们需要开发商城app,调用远程支付服务,首先将PayInterface.aidl(相当于支付宝给你的开发API,)复制到Android工程下,
这里应注意包名和aidl中定义包名完全一致,复制完成后自动生成
PayInterface.java文件,然后我们在应用中调用远程支付功能;
package com.example.consumer;import com.example.alipay.PayInterface;import android.os.Bundle;import android.os.IBinder;import android.os.RemoteException;import android.app.Activity;import android.content.ComponentName;import android.content.Intent;import android.content.ServiceConnection;import android.view.Menu;import android.view.View;import android.widget.Toast;public class MainActivity extends Activity {private PayInterface pi;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);Intent intent = new Intent("com.taobao.alipay");ServiceConnection conn = new ServiceConnection() {@Overridepublic void onServiceDisconnected(ComponentName name) {}@Overridepublic void onServiceConnected(ComponentName name, IBinder service) {pi = PayInterface.Stub.asInterface(service);}};bindService(intent, conn , BIND_ADJUST_WITH_ACTIVITY);}public void pay(View v) throws RemoteException{int result = pi.pay(200);if(result == 1){Toast.makeText(getApplicationContext(), "支付成功", 0).show();} else {Toast.makeText(getApplicationContext(), "支付失败", 0).show();}}}
将应用程序发布到模拟器上运行,点击支付按钮,出现如下界面;

调用成功,这大致算是一个远程服务的例子吧,希望能让大家更清晰的明白aidl的引用。
源码下载 点击打开链接
3 0
原创粉丝点击