在介绍IntentService之前,我们都知道不管是何种service都是运行在UI线程中的。我们先要知道service,毕竟IntentService是继承Service的。首先,service一般是使用在我们需要应用在后台时做一些操作。这里就不详细介绍service的用法了。
既然service是完成后台操作,总避免不了处理一些耗时的操作,处理耗时操作在service中只能使用最常规的方法就是开一个线程(new Thread())进行处理,如果有多个操作,还有开启多个子线程或者在一个子线程中同步进行调用。基于这个场景我们先来介绍下IntentService。
IntentService:异步处理服务,新开一个线程:handlerThread在线程中发消息,然后接受处理完成后,会清理线程,并且关掉服务。
IntentService有以下特点:
(1) 它创建了一个独立的工作线程来处理所有的通过onStartCommand()传递给服务的intents。
(2) 创建了一个工作队列,来逐个发送intent给onHandleIntent()。
(3) 不需要主动调用stopSelft()来结束服务。因为,在所有的intent被处理完后,系统会自动关闭服务。
(4) 默认实现的onBind()返回null
(5) 默认实现的onStartCommand()的目的是将intent插入到工作队列中
public class IntentServiceDemo extends IntentService {
public IntentServiceDemo() {
//必须实现父类的构造方法
super("IntentServiceDemo");
}
//提供了一个onBind()方法的默认实现,它返回null
@Override
public IBinder onBind(Intent intent) {
System.out.println("onBind");
return super.onBind(intent);
}
@Override
public void onCreate() {
System.out.println("onCreate");
super.onCreate();
}
@Override
public void onStart(Intent intent, int startId) {
System.out.println("onStart");
super.onStart(intent, startId);
}
//生成一个默认的且与主线程互相独立的工作者线程来执行所有传送至 onStartCommand()的Intent。将intent先传送至 工作队列(onHandleIntent生成的)),然后从工作队列中每次去出一个intent传送给onHandleIntent进行处理。
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
System.out.println("onStartCommand");
return super.onStartCommand(intent, flags, startId);
}
@Override
public void setIntentRedelivery(boolean enabled) {
super.setIntentRedelivery(enabled);
System.out.println("setIntentRedelivery");
}
//生成一个工作队列来传送Intent对象给你的onHandleIntent()方法,同一时刻只传送一个Intent对象,这样一来,不必 //担心多线程的问题。
@Override
protected void onHandleIntent(Intent intent) {
//Intent是从Activity发过来的,携带识别参数,根据参数不同执行不同的任务
String action = intent.getExtras().getString("param");
if (action.equals("oper1")) {
System.out.println("Operation1");
}else if (action.equals("oper2")) {
System.out.println("Operation2");
}
try {
Thread.sleep(2000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
@Override
public void onDestroy() {
System.out.println("onDestroy");
super.onDestroy();
}
}
//开启IntentService的方式跟service是一样的startService(intent);这个intent在onStartCommand中接收,然后生成一个工作队列来传送给onHandleIntent来进行处理,同一线程只能传送一个intent的
//IntentService还有一个stopSelf()方法:在所有的请求(Intent)都被执行完以后会自动停止服务,所以,你不需要自己去调用stopSelf()方法来停止该服务