首先我们了解一下 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. 初识google多语言通信框架gRPC系列(四)C++中使用gRPC

    我的这几篇文章都是使用gRPC的example,不是直接编译example,而是新建一个项目,从添加依赖,编译example代码,执行example.这样做可以为我们创建自己的项目提供借鉴.如果对gR ...

  2. Android开发调节屏幕亮度

    在播放器,我们经常看到这样的设计,即,在用户的特定部分将能够滑动屏幕向上或向下调整屏幕的亮度,上下滑动的某一部分将能够调整播放音量.并以滑动的进程可以进行调整,以玩. 如今,我不得不说一下亮度调节. ...

  3. Android 基于Netty接收和发送推送解决方案的消息字符串(三)

    在上一篇文章中<Android 基于Netty的消息推送方案之概念和工作原理(二)> .我们介绍过一些关于Netty的概念和工作原理的内容,今天我们先来介绍一个叫做ChannelBuffe ...

  4. 【原创】纯OO:从设计到编码写一个FlappyBird (六)

    第五部分请看这里 终于到了最后一个部分了! 这里使用SimpleJudge类来实现Judge接口. 首先是SimpleJudge需要的实例变量: 0.final LinkedList<Pilla ...

  5. PHPSingleton模式的例子

    在这篇文章中PHPSingleton模式的解释不一定好!仅举它的一个例子.其目的是为了让自己通过一个例子来加深对Singleton模式的理解!这里,以供参考! 单例:能够简单的理解是通过一个类,仅仅能 ...

  6. maven学习系列(一)—maven安装和基本设置

    maven下载和配置 第一步:下载apache-maven-2.3.2-bin.zip并解压到D:\tools,下载地址http://maven.apache.org/download.cgi 第二步 ...

  7. Dubbo与Zookeeper、SpringMVC整合和使用(负载均衡、容错)(转)

    互联网的发展,网站应用的规模不断扩大,常规的垂直应用架构已无法应对,分布式服务架构以及流动计算架构势在必行,Dubbo是一个分布式服务框架,在这种情况下诞生的.现在核心业务抽取出来,作为独立的服务,使 ...

  8. Visual Studio 连接不上NuGet 官方程序包源的解决办法

    修改dns 即可

  9. Windows 8实例教程系列 - 开篇

    原文:Windows 8实例教程系列 - 开篇 2012年10月26日,微软发布Windows 8操作系统以及自主品牌平板电脑Surface,Windows作为世界上最流行的操作系统,发布一周内,下载 ...

  10. 解决无法切换到jenkins用户的问题

    su - jenkins一直有效,今天在centos发现无效,原因是 /etc/password文件里的/bin/bash被yum安装的时候变成了/bin/false. 改动后就能够了. ubuntu ...