AIDL接口描述语言的使用

本文介绍Android平台上的进程间通信(IPC)机制,重点讲解AIDL(Andorid接口定义语言)的使用方法。通过示例展示如何创建服务端与客户端,实现跨进程调用。

Android进程之间如何通讯呢?在Windows系统中存在IPC管道服务、MailSolt邮槽、消息等方法,在Android平台上提供了一种中间层语言AIDLAndroid接口定义语言(Android Interface Definition Language)。

使用方法:已AidlDemoClient(client)带用AidlDemo(server)中的服务为例子

1.在AidlDemo中建立一个.aidl文件

DemoService.aidl

package com.pekall.aidl;
interface DemoService{
	void write(String content);
}
eclipse会在gen文件夹中生成对应的DemoService.java文件

AIDL语法很简单,可以用来声明一个带一个或多个方法的接口,也可以传递参数和返回值。由于远程调用的需要, 这些参数和返回值并不是任何类型.下面是些AIDL支持的数据类型: 
(1). 不需要import声明的简单Java编程语言类型(int,boolean等) 

(2). String, CharSequence不需要特殊声明

(3). List, Map和Parcelables类型, 这些类型内所包含的数据成员也只能是简单数据类型, String等其他比支持的类型.

(4). 自定义的实体需要实现Parcelable接口


2.写一个类继承DemoService的子类Stub

DemoBinder.java

package com.pekall.aidlDemo;

import android.os.RemoteException;
import android.util.Log;

import com.pekall.aidl.DemoService;


public class DemoBinder extends DemoService.Stub{

	@Override
	public void write(String content) throws RemoteException {
		Log.e("AIDL", content);
	}


}

实例你的方法

3.写一个Service类供其他程序调用

IService.java

package com.pekall.aidlDemo;

import android.app.Service;
import android.content.Intent;
import android.os.IBinder;

public class IService extends Service {
	private DemoBinder binder = new DemoBinder();
	@Override
	public IBinder onBind(Intent intent) {
		return binder;
	}

}

4.在清单文件(AndroidManifest.xml)中定义Service并提供供其他工程调用的隐式意图(内容自定义)

AndroidManifest.xml

<service android:name=".IService">
	<intent-filter>
		<action android:name="com.pekall.aidl.IService"/>
	</intent-filter>
</service>

5.建立客户端程序,并把服务端aidl所在的包和aidl文件共同拷贝到客户端工程

6.写前台程序调用此服务

Client.java

package com.pekall.aidlclient;

import com.pekall.aidl.DemoService;

import android.app.Activity;
import android.content.ComponentName;
import android.content.Intent;
import android.content.ServiceConnection;
import android.os.Bundle;
import android.os.IBinder;
import android.os.RemoteException;
import android.util.Log;

public class Client extends Activity {
	private DemoService demoService ;
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		bindService(new Intent("com.pekall.aidl.IService"), connection, BIND_AUTO_CREATE);
	}
	@Override
	protected void onDestroy() {
		super.onDestroy();
		unbindService(connection);
	}
	
	private ServiceConnection connection = new ServiceConnection() {
		
		@Override
		public void onServiceDisconnected(ComponentName name) {
			demoService = null;
		}
		
		@Override
		public void onServiceConnected(ComponentName name, IBinder service) {
			demoService = DemoService.Stub.asInterface(service);
			try {
				demoService.write("AIDL_DEMO");
			} catch (RemoteException e) {
				Log.e("Client", e.toString());
				e.printStackTrace();
			}
		}
	};
}	

7.先启动服务,在运行客户端,测试。



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值