为什么要使用IntentService?
服务中的代码都是默认运行在主线程当中的,如果直接在服务里去处理一些耗时的逻辑,就很容易出现ANR(Application Not Responding)的情况。所以这个时候就需要用到Android多线程编程技术,应该在服务的每个具体的方法里开启一个子线程,然后在这里去处理那些耗时的逻辑。因此,一个比较标准的服务就可以写成如下形式:
public class MyService extends Service {
@Override
public IBinder onBind(Intent intent) {
return null;
}
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
new Thread(new Runnable() {
@Override
public void run() {
//处理具体的逻辑
stopSelf(); //执行完任务后自行关闭服务
}
}).start();
return super.onStartCommand(intent, flags, startId);
}
}
虽说这种写法并不复杂,但是总会有一些程序员忘记开启线程,或者忘记调用stopSelf()方法。为了可以简单地创建一个异步的、会自动停止的服务,Android专门提供了一个IntentService类,这个类就很好地解决了前面所提到的两种尴尬。
IntentService的用法
public class MyIntentService extends IntentService {
public MyIntentService() {
//调用父类的有参构造函数
super("MyIntentService");
}
@Override
protected void onHandleIntent(Intent intent) {
//处理具体的逻辑
}
@Override
public void onDestroy() {
super.onDestroy();
}
}
这里首先是要提供一个无参的构造函数,并且必须在其内部调用父类的有参构造函数。然后要在子类中去实现onHandleIntent()
这个抽象方法,在这个方法中可以去处理一些具体的逻辑,而且不用担心ANR的问题,因为这个方法已经是在子线程中运行的了。另外根据IntentService的特性,这个服务在运行结束后是会自动停止的。