Android IPC通信和AIDL技术应用
首先我们了解一下 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技术应用的更多相关文章
- android IPC通信(上)-sharedUserId&&Messenger
看了一本书,上面有一章解说了IPC(Inter-Process Communication,进程间通信)通信.决定结合曾经的一篇博客android 两个应用之间的通信与调用和自己的理解来好好整理总结一 ...
- android ipc通信机制之二序列化接口和Binder
IPC的一些基本概念,Serializable接口,Parcelable接口,以及Binder.此核心为最后的IBookManager.java类!!! Serializable接口,Parcelab ...
- 【Android - IPC】之AIDL简介
参考资料: 1.<Android开发艺术探索>第二章2.4.4 2.Android AIDL Binder框架解析:http://blog.csdn.net/lmj623565791/ar ...
- android ipc通信机制之之三,进程通讯方式。
IPC通讯方式的优缺点: IPC通讯方式的对比 名称 优点 缺点 适用场景 Bundle 简单易用 只能传输Bundle支持的数据类型 四大组件的进程通信 文件共享 简单易用 不适合高并发场景,并无法 ...
- Android IPC机制之AIDL
什么是AIDL AIDL:Android Interface Definition Language,即Android接口定义语言. Android系统中的进程之间不能共享内存,因此,需要提供一些机制 ...
- AIDL实现Android IPC
1.AIDL文本解释 在软件工程中,接口定义语言(IDL)已经成为通用术语,是用来描述软件组件接口的特定语言.在Android中,该IDL被称为Android接口定义语言(AIDL),它是纯文本文件, ...
- Android Binder机制详解:手写IPC通信
想要掌握一样东西,最好的方式就是阅读理解它的源码.想要掌握Android Binder,最好的方式就是写一个AIDL文件,然后查看其生成的代码.本文的思路也是来自于此. 简介 Binder是Andro ...
- Android——进程通信/ AIDL/Message相关知识总结贴
Android多进程通信 http://www.apkbus.com/android-83462-1-1.html Android 跨进程通信(一) http://www.apkbus.com/and ...
- Android 进阶9:进程通信之 AIDL 解析
读完本文你将了解: AIDL AIDL 生成文件分析 Stub Proxy AIDL 生成的内容小结 AIDL 的使用回顾 服务端 客户端 小结 手动写个 Binder 首先是定义跨进程接口实现 II ...
随机推荐
- UVA 11427 - Expect the Expected(概率递归预期)
UVA 11427 - Expect the Expected 题目链接 题意:玩一个游戏.赢的概率p,一个晚上能玩n盘,假设n盘都没赢到总赢的盘数比例大于等于p.以后都不再玩了,假设有到p就结束 思 ...
- 加入指数(IOS开发)
该指数是用来协助查询. 原则上: - 索引的标题是不完全一样的标题显示: - 指数应该具有一定的代表性,它可表示一组数据: - 假设索引列表视图.在一般情况下不再使用扩展视图. (easy指向) 会又 ...
- HPUX平台经常使用命令列举
原创作品,出自 "深蓝的blog" 博客,欢迎转载,转载时请务必注明出处,否则追究版权法律责任. 深蓝的blog:http://blog.csdn.net/huangyanlong ...
- 《实验数据的结构化程序设计》 2.4.4Calendar个人意见,寻求指引
题目大意: 制作一个日历系统,输入年份.一些周年纪念日,及服务要求日期,依据要求日期输出,输出重要程度小于发生日期的周年纪念日. 题目地址: UVA 145 个人见解: 纯模拟,在闰年,输出顺序及输 ...
- 怎么样Eclipse IDE for C/C++ Developers正确编译GTK规划?(解决)
<span style="color: rgb(51, 51, 51); font-family: Arial; font-size: 14px; line-height: 25.99 ...
- iterator pattern
6 迭代器模式总结 迭代器模式是一种使用频率非常高的设计模式,通过引入迭代器可以将数据的遍历功能从聚合对象中分离出来,聚合对象只负责存储数据,而遍历数据由迭代器来完成.由于很多编程语言的类库都已经实现 ...
- 【翻译自mos文章】回收 asm磁盘空间的方法
回收 asm磁盘空间的方法 參考原文: How To Reclaim Asm Disk Space? (Doc ID 351866.1) 适用于: Oracle Database - Enterpri ...
- UVA 12103 - Leonardo's Notebook(数论置换群)
UVA 12103 - Leonardo's Notebook 题目链接 题意:给定一个字母置换B.求是否存在A使得A^2=B 思路:随意一个长为 L 的置换的k次幂,会把自己分裂成gcd(L,k) ...
- Unbound classpath container: 'JRE System Library [jdk17060]' in project ***
项目报告的错误列表 Unbound classpath container: 'JRE System Library [jdk17060]' in project **** 误. 原因是,我升级JDK ...
- SecureCRT 6.7.1 RI和谐 皴 补丁 方法
它之前被使用SecureCRT 6.5.3 版本号,咋看和谐补丁,即使中国版本也可(现在才发现SecureCRT.6.2.0) 可是换为 6.7.1 后就怎么也注冊不了了.. 没办法试了各种办法: 先 ...