14.1.2. 实现Service

优质
小牛编辑
131浏览
2023-12-01

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());

}

};

}

}

  1. LogService以Android框架的Service为基类。前面已经见过不少Service,但这里与众不同。
  2. 它是个BoundService,因此必须提供onBind()的实现,使之返回一个IBinder的实例。参数是客户端传来的Intent,里面包含一些字符串信息。在客户端的实现部分,我们将介绍在Intent中附带少量数据并传递给远程Service的方法。
  3. IBinder的实例由ILogService.Stub()方法生成,它是自动生成的stub文件中的一个辅助方法,位置在/gen/com/marakana/logservice/LogService.java。
  4. log_d()是个简单的方法,它取两个字符串作参数,并记录日志。简单地调用系统的Log.d()即可。
  5. 还有一个log()方法,它取可序列化的Message对象做参数。在此提取出Tag与消息内容,调用Android框架的Log.d()方法。

现在我们已经实现了Java的Service部分,接下来实现可序列化的Message对象。