To provide binding for service, you must implement the onBind()
method. This method returns anIBinder
object that defines the interface that clients can use to interact with the service.
三种不同的方式,说白了就是通过onBind()返回三种不同类型的IBinder
object。
一、可以返回自定义的Binder(继承自Binder),并且在其中提供public methods that the client can call。
通常情况下,we returns the current Service
instance, or an instance of another class hosted by the service with public methods theclient can call.
private final IBinder mBinder = new LocalBinder();
public class LocalBinder extends Binder {
LocalService getService() {
// Return this instance of LocalService so clients can call public methods
return LocalService.this;
}
}
优点:
1. 使用简单,client在onServiceConnected()拿到Binder之后,可以直接cast到原本的类型,进行使用。
缺点:
1. 必须在同一个进程中使用,因为一般自定义的Binder不会按照IPC的要求实现Binder中的接口,如何支持IPC,请参看AIDL实现的Binder类。
注意:
1. 此种方法调用service的function时,就跟一个普通的函数调用一样,在当前线程执行,而不像IPC那样,service端的function都是在binder thread中执行。
三、使用AIDL,onBind()返回ServiceInterface.Stub mBinder = new ServiceInterface.Stub(){ }。
编译工具会根据.aidl文件生成一个.java文件,里面有AIDL实现的Binder类。例如,我们提供的.aild文件如下:
package com.baidu.test.aidl;
import com.baidu.test.aidl.ClientInterface;
interface ServiceInterface {
void register(ClientInterface client);
void serviceFun();
void invokeClientCallBack();
}
系统帮我们生成的.java文件如下:
package com.baidu.test.aidl;
public interface ServiceInterface extends android.os.IInterface {
public void register(com.baidu.test.aidl.ClientInterface client) throws android.os.RemoteException;
public void serviceFun() throws android.os.RemoteException;
public void invokeClientCallBack() throws android.os.RemoteException;
// ======================== Stub用在service端 ================================
public static abstract class Stub extends android.os.Binder implements com.baidu.test.aidl.ServiceInterface {
private static final java.lang.String DESCRIPTOR = "com.baidu.test.aidl.ServiceInterface";
static final int TRANSACTION_register = (android.os.IBinder.FIRST_CALL_TRANSACTION + 0);
static final int TRANSACTION_serviceFun = (android.os.IBinder.FIRST_CALL_TRANSACTION + 1);
static final int TRANSACTION_invokeClientCallBack = (android.os.IBinder.FIRST_CALL_TRANSACTION + 2);
public Stub() {
// from Binder, Convenience met