前言:本系列仅介绍基本大体的使用步骤,而不对每个步骤进行细致的讲解。读者可作为已经对相关内容有所了解后的快速查阅。
Service组件与Activity以IBinder为媒介进行通信。
Service组件的实现步骤如下:
public IBinder onBind(Intent t)
函数,提供服务接口。AndroidMenifest中添加:
<service
android:name="com.starjade.cst.homework5.ZYService"
android:process=":remote"
android:exported="true" >
<intent-filter>
<category android:name="android.intent.category.DEFAULT" />
<action android:name="com.starjade.cst.homework5.ZYService" />
</intent-filter>
</service>
IBinder是Service组件与Activity组件进行通信的接口。Service组件需要返回一个IBinder对象来提供服务接口。要达到这个目的需要如下几步;
例如想要提供一个比较两数大小的服务,则可以这样实现MyBind类:
public class MyBind extends Binder{
public int compare(int a, int b){
a = a > b ? a:b;
return a;
}
};
Activity组件是实际使用服务的对象。Activity的基本使用无需多言,仅仅介绍其与Service相关部分。实现步骤如下:
this.startService(intentService)
启用Service组件this.bindService(intentService,serviceConection,BIND_AUTO_CREATE)
将Activity组件与Service组件绑定,使得Activity组件能够使用Service组件。bindService函数参数1:Service组件的intent对象,参数2:ServiceConnection对象,参数3:绑定方式
ServiceConnection对象的作用在于提供了绑定的回调函数,Activity组件可以通过它获得IBinder对象。代码示例如下:
private MyService.MyBinder myBinder;
private ServiceConnection connection = new ServiceConnection() {
@Override
public void onServiceDisconnected(ComponentName name) {
}
@Override
public void onServiceConnected(ComponentName name, IBinder service) {
myBinder = (MyService.MyBinder) service;
myBinder.startDownload();
}
};
获得IBinder对象后,那么就可以通过该对象调用Service提供的服务了。
很多情况下Service组件会提供给其他应用的Activity组件使用。
AIDL(Android Interface Definition Language)提供一个进程间通信的接口。
多应用Service组件使用与单应用内Service的使用的主要区别就在于AIDL的使用。
定义接口文件
举例:
interface IAIDLServerService {
Person getPerson(); //服务方法
Gender getGender();
}
private IAIDLServerService.Stub mBinder = new Stub() {
//实现服务方法
public Person getPerson() throws RemoteException {
Person person = new Person();
person.setName("Snail");
person.setAge(27);
return person;
}
public Gender getGender() throws RemoteException {
return new Gender("male");
}
};
@Override
public IBinder onBind(Intent intent) {
return mBinder; //输出IBlinder对象
}
Client端的操作步骤与单应用情况下Activity组件的实现方式十分接近,区别在于:
例子:
private IAIDLServerService mIaidlServerService = null; //接口类的对象
private ServiceConnection mConnection = new ServiceConnection() {
public void onServiceDisconnected(ComponentName name) {
mIaidlServerService = null;
}
public void onServiceConnected(ComponentName name, IBinder service) {
mIaidlServerService = IAIDLServerService.Stub.asInterface(service); //获取接口类对象
}
};
public void printPersonInfo(){
try {
Person person = mIaidlServerService.getPerson();
String str = "姓名:" + person.getName() + "\n" + "年龄:"
+ person.getAge();
mAIDLView.setText(str);
} catch (RemoteException e) {
e.printStackTrace();
}
}