14.1.2. 实现Service
14.1.2.实现Service
同Android中的其它Service一样,LogService也必须以系统中的Service类为基类。但不同在于,在这里我们忽略了onCreate()、onStartCommand()、onDestroy()几个方法,却提供了onBind()方法的实现。远程Service中的方法开始于客户端发出的请求,在客户端看来,这被称作“绑定(bind)到Service”。而对服务端而言,就是在这时触发Service类的onBind()方法。
在远程Service的实现中,onBind()方法需要返回一个IBinder对象表示远程Service的一个实现。为实现IBinder,我们可以继承自动生成的ILogervice.Stub类。同时在里面提供我们自定义的AIDL方法,也就是几个log()方法。
例 14.3. LogService.java
package com.marakana.logservice;
import android.app.Service;
import android.content.Intent;
import android.os.IBinder;
import android.os.RemoteException;
import android.util.Log;
public class LogService extends Service { //
@Override
public IBinder onBind(Intent intent) { //
final String version = intent.getExtras().getString("version");
return new ILogService.Stub() { //
public void log_d(String tag, String message) throws RemoteException { //
Log.d(tag, message + " version: " + version);
}
public void log(Message msg) throws RemoteException { //
Log.d(msg.getTag(), msg.getText());
}
};
}
}
- LogService以Android框架的Service为基类。前面已经见过不少Service,但这里与众不同。
- 它是个BoundService,因此必须提供onBind()的实现,使之返回一个IBinder的实例。参数是客户端传来的Intent,里面包含一些字符串信息。在客户端的实现部分,我们将介绍在Intent中附带少量数据并传递给远程Service的方法。
- IBinder的实例由ILogService.Stub()方法生成,它是自动生成的stub文件中的一个辅助方法,位置在/gen/com/marakana/logservice/LogService.java。
- log_d()是个简单的方法,它取两个字符串作参数,并记录日志。简单地调用系统的Log.d()即可。
- 还有一个log()方法,它取可序列化的Message对象做参数。在此提取出Tag与消息内容,调用Android框架的Log.d()方法。
现在我们已经实现了Java的Service部分,接下来实现可序列化的Message对象。