AIDL Service用于在不同进程间进行数据交换,即所谓的跨进程通信(interprocess communication,简称IPC)
与绑定本地Service不同的是,本地Service的onBind()方法会直接把IBinder对象本身传给客户端的ServiceConnection的onServiceConnected()方法的第二个参数。但远程Service的onBind()方法只是将IBinder对象的代理传给客户端的ServiceConnection的onServiceConnected()方法的第二个参数
1、创建AIDL接口文件
AIDL的语法与Java接口很相似,但是有几点要求:
(1) AIDL定义的接口文件必须以.aidl结尾
(2) AIDL接口中用到的数据类型,除了基本类型、String、List、Map、CharSequence之外,其他类型都需要导入包,即使在同一个包中也需要导入
新建客户端工程,创建IBook.aidl文件:
package com.example.testaidlservice;
interface IBook {
String getName();
int getPageCount();
}
定义好IBook.aidl接口文件后,ADT工具会自动在gen目录下生成一个IBook.java文件,在java文件里包含一个Stub内部类,该内部类实现了IBinder、IBook两个接口,因此可作为Service的onBind()方法的返回值,这个Stub类将会作为远程Service的回调类
2、定义远程Service类
新建类BookService.java继承Service类
public class BookService extends Service {
private BookBinder bookBinder;
private String bookName = "Android开发艺术探索";
private int pageCount = 524;
public class BookBinder extends Stub {
@Override
public String getName() throws RemoteException {
// TODO Auto-generated method stub
return bookName;
}
@Override
public int getPageCount() throws RemoteException {
// TODO Auto-generated method stub
return pageCount;
}
}
@Override
public void onCreate() {
// TODO Auto-generated method stub
super.onCreate();
bookBinder = new BookBinder();
}
@Override
public IBinder onBind(Intent intent) {
// TODO Auto-generated method stub
return bookBinder;
}
}
3、在AndroidManifest.xml中配置该Service
<service android:name="com.example.testaidlservice.BookService">
<intent-filter >
<action android:name="com.example.testaidlservice.BOOK_SERVICE"/>
</intent-filter>
</service>
配置好以后,就可以在客户端调用远程Service了,Service端目录结构:
4、客户端访问AIDL Service
AIDL接口定义了两个进程之间的通信接口,所以客户端也需要用到AIDL接口。所以在创建客户端后,要将Service端的AIDL接口文件复制到客户端,复制后ADT工具会生成相应的接口文件
客户端绑定到远程Service需要两步:
(1)创建ServiceConnection对象
(2)调用Context的bindService()方法绑定远程Service
客户端界面布局:
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:paddingBottom="@dimen/activity_vertical_margin"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
tools:context="com.example.testaidlservice.MainActivity" >
<Button