Android多线程之IntentService

版权声明:本文为博主原创文章,未经博主允许不得转载。 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的比较



参考链接:

Service与IntentService的比较

Service和IntentService的区别



猜你喜欢

转载自blog.csdn.net/Kikitious_Du/article/details/78800756