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;相当于安装了支付插件,安装完成后如图所示;


接着,我们需要开发商城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;
	@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();
		}
	}
}

将应用程序发布到模拟器上运行,点击支付按钮,出现如下界面;


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

源码下载 点击打开链接
时间: 2024-09-30 17:33:01

Android IPC通信以及AIDL技术运用的相关文章

android IPC通信(下)-AIDL

android IPC通信(上)-sharedUserId&&Messenger android IPC通信(中)-ContentProvider&&Socket 这篇我们将会着重介绍AIDL的使用方式和原理,要介绍AIDL先要简单介绍一下Binder,而且Messenger,ContentProvider和AIDL的最底层都是使用的Binder. Binder 直观来说,Binder是Android中的一个类,它实现了IBinder接口.从IPC角度来说,Binder是A

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

看了一本书,上面有一章解说了IPC(Inter-Process Communication,进程间通信)通信.决定结合曾经的一篇博客android 两个应用之间的通信与调用和自己的理解来好好整理总结一下这块的知识.因为内容较多,这部分会分上中下三篇博客来细致分析解说,第一篇上篇要解说的是sharedUserId和Messenger的使用方式. android IPC通信(中)-ContentProvider&&Socket android IPC通信(下)-AIDL sharedUserI

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

IPC的一些基本概念,Serializable接口,Parcelable接口,已经Binder.此核心为最后的IBookManager.java类!!! Serializable接口,Parcelable接口都是可以完成对象的序列化过程. 序列化 (Serialization)将对象的状态信息转换为可以存储或传输的形式的过程.在序列化期间,对象将其当前状态写入到临时或持久性存储区.以后,可以通过从存储区中读取或反序列化对象的状态,重新创建该对象. 两者均可以实现序列化并且都可以用于Intent数

【Android - IPC】之AIDL简介

参考资料: 1.<Android开发艺术探索>第二章2.4.4 2.Android AIDL Binder框架解析:http://blog.csdn.net/lmj623565791/article/details/38461079 3.你真的理解AIDL中的in.out.inoutm么:http://www.open-open.com/lib/view/open1469494342021.html 4.慕课网<AIDL-小白成长记> 1. AIDL简介 Android系统规定:每

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

IPC通讯方式的优缺点: IPC通讯方式的对比 名称 优点 缺点 适用场景 Bundle 简单易用 只能传输Bundle支持的数据类型 四大组件的进程通信 文件共享 简单易用 不适合高并发场景,并无法做到进程间即时通讯. 无并发访问情形,交换简单的数据是实时性不高的场景. AIDL 功能强大,支持一对多并发通信,支持实时通信. 使用稍微复杂,需要处理好线程同步. 一对多通信且有RPC需求 Messenger 功能一般,支持一对多串行通信,支持实时通信. 不能很好处理高并发情形,不支持RPC,数据

Android IPC通信机制之一

IPC:Intent-process Communication,跨进程通信. 在一个应用程序中,可以很方便的开启多进程.开启进程的方式只有一种,只能在AndroidMenifest中为四大组件指定 Android:process属性. 在非常规情况下,也可以通过JNI在native层去fork一个新的进程. <activity android:name=".MainActivity" android:label="@string/app_name" andr

Android进程通信:AIDL入门实例

AIDL即 Android Interface Definition Language.原因:On Android, one process cannot normally access thememory of another process. 也就是说AIDL用于android进程间通信,下面就记录一下第一个aidl的demo. 官方文档也给出了基本的使用方法,如下图: 1. 在android项目的src相关包下创建一个aidl文件 IRemoteService.aidl: package

Android IPC机制(三):浅谈Binder的使用

一.前言 在上一篇博客Android IPC机制(二):AIDL的基本用法中,笔者讲述了安卓进程间通讯的一个主要方式.利用AIDL进行通讯.并介绍了AIDL的基本用法. 事实上AIDL方式利用了Binder来进行跨进程通讯.Binder是Android中的一种跨进程通讯方式.其底层实现原理比較复杂.限于笔者水平,不能展开详谈.所以这篇文章主要谈谈以AIDL为例,谈谈Binder的用法. 二.原理 上一篇文章中创建了一个IMyAidl.aidl文件,即接口文件,随即编译了该文件.生成了一个.jav

android 远程Service以及AIDL的跨进程通信

在Android中,Service是运行在主线程中的,如果在Service中处理一些耗时的操作,就会导致程序出现ANR. 但如果将本地的Service转换成一个远程的Service,就不会出现这样的问题了. 转换成远程Service非常简单,只需要在注册Service的时候将他的android:process的属性制定成 :remote就可以了. 重新运行项目,你会发现,不会出现ANR了. 为什么将MyService转换成远程Service后就不会导致程序ANR了呢?这是由于,使用了远程Serv