Android-Service之绑定服务交互
前言
开篇名义,这篇博客介绍一下Android下使用绑定服务进行时数据交互的几种方法。关于Android下Service的内容,前面两篇博客已经介绍了,不清楚的可以移步过去先看看:Android--Service之基础、Android--Service之提高。
在前面的博客中已经介绍到了,对于Service组件而言,它只有在绑定模式下才可以与客户端进行时交互,这里讲解几个方法进行绑定服务与客户端间的交互方法:
使用IBinder接口
使用Messenger类
使用AIDL
虽然根据官方文档给出了三个方法,其中AIDL涉及的内容超出本博客内容范围,以后有机会在另外介绍,本篇博客只介绍1、2两种方式的数据交互。
?
使用IBinder接口
如果看了之前关于Service博客的人,应该对IBinder接口有所了解,这里简单介绍一下IBinder。
IBinder是远程对象的基本接口,是为高性能而设计的轻量级远程调用机制的核心部分。但它不仅用于远程调用,也可以用于进程内调用。这个接口定义了与远程对象交互的协议,一般不直接实现这个接口,而是从它的实现类Binder中继承。
通过IBinder进行服务的交互一般有两种方式,一种方式是使用IBinder.transact()方法向远端的IBinder对象发送一个发出调用,会回调远端的Binder.onTransact()方法,这个方法传递的数据是Parcel。Parcel是一种缓冲区,除了数据外还有有一些描述它内容的元素,如果查看源码的话会发现,Parcel本质上是一个Serialize,只是它在内存中完成了序列化和反序列化,利用的是连续的内存空间,因此效率会更高,并且AIDL的数据也是通过Parcel来交互的。另外一种方法就是抛弃IBinder中原生的方法,使用自定义的接口方法进行数据交互,这也是Android官方推荐绑定服务的一种数据交互方式。当然,不管是使用transact()给远程服务交互,还是使用自定义的接口交互,都是同步执行的,直到远程服务执行完并返回结果才会继续向下执行。
其他关于适应IBinder服务的内容,在博客Android--Service之基础中已经讲解过了,这里不再累述。下面使用一个例子来演示一下使用自定义接口与服务进行交互的例子。
服务:IBinderSer.java
1 package cn.bgxt.servicebinddatedemo;
2
3 import android.app.Service;
4 import android.content.Intent;
5 import android.os.Binder;
6 import android.os.IBinder;
7 import android.os.Parcel;
8 import android.os.RemoteException;
9 import android.util.Log;
10
11 public class IBinderSer extends Service {
12 private final String TAG="main";
13 private final int MULTIPLE=1024;
14 public final IBinder mBinder=new LocalBinder();
15
16 public class LocalBinder extends Binder{
17 // 在Binder中定义一个自定义的接口用于数据交互
18 // 这里直接把当前的服务传回给宿主
19 public IBinderSer getService(){
20 return IBinderSer.this;
21 }
22 }
23
24 @Override
25 public IBinder onBind(Intent intent) {
26 Log.i(TAG, "The service is binding!");
27 // 绑定服务,把当前服务的IBinder对象的引用传递给宿主
28 return mBinder;
29 }
30
31 public int getMultipleNum(int num){
32 // 定义一个方法 用于数据交互
33 return M