IntentService是一种特殊的Service,它继承了Service。
IntentService是一个抽象类,因此必须创建它的子类才能使用IntentService。IntentService可用于执行后台耗时的任务,当任务执行后它会自动停止,同时由于IntentService是服务的原因,这也导致它的优先级比单纯的线程要高很多,所以IntentService比较适合执行一些高优先级的后台任务,因为它优先级高,不容易被系统杀死。在实现上,IntentService封装了HandlerThread和Handler,这一点可以从它的onCreate方法中看出来,如下所示:
@Override
public void onCreate() {
// TODO: It would be nice to have an option to hold a partial wakelock
// during processing, and to have a static startService(Context, Intent)
// method that would launch the service & hand off a wakelock.
super.onCreate();
HandlerThread thread = new HandlerThread("IntentService[" + mName + "]");
thread.start();
mServiceLooper = thread.getLooper();
mServiceHandler = new ServiceHandler(mServiceLooper);
}
当IntentService被第一次启动时,它的onCreate方法会被调用,onCreate方法会被创建一个HandlerThread,然后使用它的Looper来构造一个Handler对象mServiceHandler ,这样通过mServiceHandler 发送的消息最终都会在HandlerThread中执行,从这个角度来看,IntentService也可以用于执行后台任务。
每次启动IntentService,它的onStartCommand方法就会调用一次,IntentService在onStartCommand中处理每个后台任务的Intent。
下面通过一个示例来说明IntentService的工作方法,首先派生一个IntentService的子类,代码如下:
public class LocalIntentService extends IntentService {
private static final String TAG = "LocalIntentService";
public LocalIntentService() {
super(TAG);
}
@Override
protected void onHandleIntent(Intent intent) {
String tasks = intent.getStringExtra("task");
Log.d(TAG, "receive task :" + tasks);
SystemClock.sleep(3000);
if ("task2".equals(tasks)) {
Log.e(TAG, "handle task" + tasks);
}
}
@Override
public void onDestroy() {
Log.e(TAG, "service destroyed");
super.onDestroy();
}
}
这里对LocalIntentService 的实现做一个简单的说明。在onHandleIntent方法中会从参数中解析出后台任务的标识,即task字段所代表的内容,然后根据不同的任务标识来执行具体的后台任务。这里为了简单起见,直接通过 SystemClock.sleep(3000)来休眠3000毫秒从而模拟一种耗时的后台任务,另外为了验证IntentService的停止时机,这里在onDestroy()中打印了一句日志。LocalIntentService 实现完成了以后,就可以在外界请求执行后台任务了。
下面的代码中先后发起了3个后台任务的请求:
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Intent service = new Intent(this, LocalIntentService.class);
service.putExtra("task", "task1");
startService(service);
service.putExtra("task", "task2");
startService(service);
service.putExtra("task", "task3");
startService(service);
}
}
LocalIntentService 是Service类,属于四大组件,需要在AndroidManifest中进行注册。
运行程序,观察日志,如下所示:
从上面的日志可以看出,三个后台任务是排队执行的,它们的执行顺序就是它们发起请求时的顺序,即task1、task2、task3。另外一点就是当task3执行完毕后,LocalIntentService 才真正地停止。从日志中可以看出LocalIntentService 执行了onDestroy(),这也意味着服务正在停止。