利用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来解决。