版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/Kikitious_Du/article/details/78800756
1. IntentService继承自Service
public abstract class IntentService extends Service {
2. Service不是一个单独的进程,它和应用程序在同一个进程中
A Service is not a separate process. The Service object itself does not imply it is running in its own process;
unless otherwise specified, it runs in the same process as the application it is part of.
3. Service也不是一个线程,所以我们要避免在Service中进行耗时的操作
A Service is not a thread.
It is not a means itself to do work off of the main thread
(to avoid Application Not Responding errors).
4. 那怎样在Service中进行耗时操作呢,需要自己在onStart中开启一个线程,那为什么不直接在Activity中开启线程进行耗时操作呢?
这是因为Activity很难对Thread进行控制,当Activity被销毁之后,就没有任何其它的办法可以再重新获取到之前创建的子线程的实例。
而且在一个Activity中创建的子线程,另一个Activity无法对其进行操作。
但是Service就不同了,所有的Activity都可以与Service进行关联,然后可以很方便地操作其中的方法,
即使Activity被销毁了,之后只要重新与Service建立关联,就又能够获取到原有的Service中Binder的实例。
因此,使用Service来处理后台任务,Activity就可以放心地finish,完全不需要担心无法对后台任务进行控制的情况。
5. IntentService使用队列的方式将请求的Intent加入队列,然后开启了一个Worker Thread(工作线程)在处理队列中的Intent,对于异步的startService请求,IntentService会处理完成一个之后再处理第二个,每一个请求都会在一个单独的Worker Thread中处理,不会阻塞应用程序的主线程。
因此,如果我们如果要在Service里面处理一个耗时的操作,可直接用IntentService来代替使用。我们来看一下源码:
public abstract class IntentService extends Service {
private volatile Looper mServiceLooper;
private volatile ServiceHandler mServiceHandler;
private String mName;
private boolean mRedelivery;
private final class ServiceHandler extends Handler {
public ServiceHandler(Looper looper) {
super(looper);
}
@Override
public void handleMessage(Message msg) {
onHandleIntent((Intent)msg.obj);//调用onHandleIntent方法
stopSelf(msg.arg1);
}
}
public IntentService(String name) {
super();
mName = name;
}
public void setIntentRedelivery(boolean enabled) {
mRedelivery = enabled;
}
@Override
public void onCreate() {
super.onCreate();
//开启一个线程
HandlerThread thread = new HandlerThread("IntentService[" + mName + "]");
thread.start();
//获取线程的轮循器
mServiceLooper = thread.getLooper();
mServiceHandler = new ServiceHandler(mServiceLooper);
}
//在调用startService时,执行onStart方法,mServiceHandler发送消息
@Override
public void onStart(@Nullable Intent intent, int startId) {
Message msg = mServiceHandler.obtainMessage();
msg.arg1 = startId;
msg.obj = intent;
mServiceHandler.sendMessage(msg);
}
@Override
public int onStartCommand(@Nullable Intent intent, int flags, int startId) {
onStart(intent, startId);
return mRedelivery ? START_REDELIVER_INTENT : START_NOT_STICKY;
}
@Override
public void onDestroy() {
mServiceLooper.quit();
}
@Override
@Nullable
public IBinder onBind(Intent intent) {
return null;
}
//需要实现的方法
@WorkerThread
protected abstract void onHandleIntent(@Nullable Intent intent);
}
6. 使用IntentService 必须首先继承IntentService并实现onHandleIntent()方法,将耗时的任务放在这个方法执行,其他方面,IntentService和Service一样。
//必须实现 构造函数 和 onHandleIntent方法
public class MyIntentService extends IntentService {
//使用自定义的名称
public MyIntentService() {
super("MyIntentService");
}
public MyIntentService(String name) {
super(name);
}
@Override
protected void onHandleIntent(@Nullable Intent intent) {
}
}
//必须实现 onBind方法
public class MyService extends Service {
@Nullable
@Override
public IBinder onBind(Intent intent) {
return null;
}
}
7. 对于IntentService和Service的使用测试,可以查看Service与IntentService的比较
参考链接: