首先我们了解一下 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{ @Override
public void onCreate() {
System.out.println("开启远程支付服务");
super.onCreate();
} @Override
public IBinder onBind(Intent intent) {
return new MyIBinder();
} @Override
public boolean onUnbind(Intent intent) {
return super.onUnbind(intent);
} @Override
public void onDestroy() {
super.onDestroy();
} private class MyIBinder extends Stub{ @Override
public int pay(int money) throws RemoteException {
if(money == 200)
return 1;
return 0;
}
}
}

MyIBinder extends Stub

这个类。用户在商城付款时绑定服务返回的对象,stub是PayInterface.aidl文件定义完毕后后自己主动生成的JAVA类,在该类中实现了自己的支付核心代码,然后再主程序安装此app;相当于安装了支付插件,安装完毕后如图所看到的;



watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvamF2X2ltYmE=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" alt="">
接着,我们须要开发商城app,调用远程支付服务。首先将PayInterface.aidl(相当于支付宝给你的开发API。)拷贝到Androidproject下。
这里应注意包名和aidl中定义包名全然一致,复制完毕后自己主动生成


watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvamF2X2ltYmE=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" alt="">
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;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Intent intent = new Intent("com.taobao.alipay"); ServiceConnection conn = new ServiceConnection() { @Override
public void onServiceDisconnected(ComponentName name) {
} @Override
public 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();
}
}
}

将应用程序公布到模拟器上执行,点击支付button,出现例如以下界面;

watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvamF2X2ltYmE=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" alt="">


调用成功,这大致算是一个远程服务的样例吧,希望能让大家更清晰的明确aidl的引用。

源代码下载 点击打开链接

版权声明:本文博客原创文章。博客,未经同意,不得转载。

Android IPC通信和AIDL技术应用的更多相关文章

  1. android IPC通信(上)-sharedUserId&&Messenger

    看了一本书,上面有一章解说了IPC(Inter-Process Communication,进程间通信)通信.决定结合曾经的一篇博客android 两个应用之间的通信与调用和自己的理解来好好整理总结一 ...

  2. android ipc通信机制之二序列化接口和Binder

    IPC的一些基本概念,Serializable接口,Parcelable接口,以及Binder.此核心为最后的IBookManager.java类!!! Serializable接口,Parcelab ...

  3. 【Android - IPC】之AIDL简介

    参考资料: 1.<Android开发艺术探索>第二章2.4.4 2.Android AIDL Binder框架解析:http://blog.csdn.net/lmj623565791/ar ...

  4. android ipc通信机制之之三,进程通讯方式。

    IPC通讯方式的优缺点: IPC通讯方式的对比 名称 优点 缺点 适用场景 Bundle 简单易用 只能传输Bundle支持的数据类型 四大组件的进程通信 文件共享 简单易用 不适合高并发场景,并无法 ...

  5. Android IPC机制之AIDL

    什么是AIDL AIDL:Android Interface Definition Language,即Android接口定义语言. Android系统中的进程之间不能共享内存,因此,需要提供一些机制 ...

  6. AIDL实现Android IPC

    1.AIDL文本解释 在软件工程中,接口定义语言(IDL)已经成为通用术语,是用来描述软件组件接口的特定语言.在Android中,该IDL被称为Android接口定义语言(AIDL),它是纯文本文件, ...

  7. Android Binder机制详解:手写IPC通信

    想要掌握一样东西,最好的方式就是阅读理解它的源码.想要掌握Android Binder,最好的方式就是写一个AIDL文件,然后查看其生成的代码.本文的思路也是来自于此. 简介 Binder是Andro ...

  8. Android——进程通信/ AIDL/Message相关知识总结贴

    Android多进程通信 http://www.apkbus.com/android-83462-1-1.html Android 跨进程通信(一) http://www.apkbus.com/and ...

  9. Android 进阶9:进程通信之 AIDL 解析

    读完本文你将了解: AIDL AIDL 生成文件分析 Stub Proxy AIDL 生成的内容小结 AIDL 的使用回顾 服务端 客户端 小结 手动写个 Binder 首先是定义跨进程接口实现 II ...

随机推荐

  1. UVA 11427 - Expect the Expected(概率递归预期)

    UVA 11427 - Expect the Expected 题目链接 题意:玩一个游戏.赢的概率p,一个晚上能玩n盘,假设n盘都没赢到总赢的盘数比例大于等于p.以后都不再玩了,假设有到p就结束 思 ...

  2. 加入指数(IOS开发)

    该指数是用来协助查询. 原则上: - 索引的标题是不完全一样的标题显示: - 指数应该具有一定的代表性,它可表示一组数据: - 假设索引列表视图.在一般情况下不再使用扩展视图. (easy指向) 会又 ...

  3. HPUX平台经常使用命令列举

    原创作品,出自 "深蓝的blog" 博客,欢迎转载,转载时请务必注明出处,否则追究版权法律责任. 深蓝的blog:http://blog.csdn.net/huangyanlong ...

  4. 《实验数据的结构化程序设计》 2.4.4Calendar个人意见,寻求指引

    题目大意: 制作一个日历系统,输入年份.一些周年纪念日,及服务要求日期,依据要求日期输出,输出重要程度小于发生日期的周年纪念日. 题目地址: UVA  145 个人见解: 纯模拟,在闰年,输出顺序及输 ...

  5. 怎么样Eclipse IDE for C/C++ Developers正确编译GTK规划?(解决)

    <span style="color: rgb(51, 51, 51); font-family: Arial; font-size: 14px; line-height: 25.99 ...

  6. iterator pattern

    6 迭代器模式总结 迭代器模式是一种使用频率非常高的设计模式,通过引入迭代器可以将数据的遍历功能从聚合对象中分离出来,聚合对象只负责存储数据,而遍历数据由迭代器来完成.由于很多编程语言的类库都已经实现 ...

  7. 【翻译自mos文章】回收 asm磁盘空间的方法

    回收 asm磁盘空间的方法 參考原文: How To Reclaim Asm Disk Space? (Doc ID 351866.1) 适用于: Oracle Database - Enterpri ...

  8. UVA 12103 - Leonardo&#39;s Notebook(数论置换群)

    UVA 12103 - Leonardo's Notebook 题目链接 题意:给定一个字母置换B.求是否存在A使得A^2=B 思路:随意一个长为 L 的置换的k次幂,会把自己分裂成gcd(L,k) ...

  9. Unbound classpath container: &#39;JRE System Library [jdk17060]&#39; in project ***

    项目报告的错误列表 Unbound classpath container: 'JRE System Library [jdk17060]' in project **** 误. 原因是,我升级JDK ...

  10. SecureCRT 6.7.1 RI和谐 皴 补丁 方法

    它之前被使用SecureCRT 6.5.3 版本号,咋看和谐补丁,即使中国版本也可(现在才发现SecureCRT.6.2.0) 可是换为 6.7.1 后就怎么也注冊不了了.. 没办法试了各种办法: 先 ...