利用Android的 IntentService完成后台异步任务

初学android比较纠结的一点就是service和activity的交互,在service中不能进行耗时的操作,否则会阻塞UI进程,我们可以在service中new一个Thread出来进行耗时的操作,但毕竟有点麻烦。所以android还提供了IntentService类来帮助解决这个问题。

IntentService是继承至Service子类,用于处理异步的请求,你可以通过startService(Intent)来发送你需要的请求。在IntentService中使用了一个ServiceHandler(继承至Handler)来处理接收到的请求。对于每个异步的startService请求,IntentService会处理完成一个之后再处理第二个。每一个请求都会在一个单独的worker thread中处理,不会阻塞应用程序的主线程。

IntentService的特点如下:

(1)它创建了一个独立的工作线程来处理所有的通过onStartCommand()传递给服务的intents。

(2)创建了一个工作队列,来逐个发送intent给onHandleIntent()。

(3)不需要主动调用stopSelft()来结束服务。因为,在所有的intent被处理完后,系统会自动关闭服务。

(4)默认实现的onBind()返回null

(5)默认实现的onStartCommand()的目的是将intent插入到工作队列中。

IntentService是一个基于消息的服务,每次启动该服务并不是马上处理你的工作,而是首先会创建对应的Looper,Handler并且在MessageQueue中添加的附带客户Intent的Message对象,当Looper发现有Message的时候接着得到Intent对象通过在onHandleIntent((Intent)msg.obj)中调用你的处理程序.处理完后即会停止自己的服务.意思是Intent的生命周期跟你的处理的任务是一致的.所以这个类用下载任务中非常好,下载任务结束后服务自身就会结束退出.

使用方法也十分简单,所需要做的就是实现 onHandleIntent() 方法,在该方法内实现你想进行的操作。另外,继承IntentService时,你必须提供一个无参构造函数,且在该构造函数内,你需要调用父类的构造函数

启动服务:

findViewById(R.id.intentService).setOnClickListener(

new OnClickListener() {

@Override

public void onClick(View v) {

startService( new Intent(Main.this,

IntentServiceExm. class));

}

});

IntentService服务:

public class IntentServiceExm extends IntentService {

public IntentServiceExm() {

super(“IntentServiceExm” );

}

@Override

protected void onHandleIntent(Intent intent) {

try {

// 这里模拟耗时操作,睡眠5秒

Thread.sleep(5000);

Log. i(“IntentService”, “in IntentService” );

catch (InterruptedException e) {

e.printStackTrace();

}

}

}

在此特别需要注意的是IntentService是线性处理请求的。如果有多个Intent请求执行,则会被放在工作队列中,依次等待,顺序执行。所以若是想在Service中让多个线程并发的话,就得另想法子,比如本文开头所说的在service中新建多个Thread来解决。