Android IntentService

Posted linghu_java

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Android IntentService相关的知识,希望对你有一定的参考价值。

概述

IntentService继承了Service并且是一个抽象类,使用它必须创建它的子类。IntentService可执行后台耗时的任务,当任务结束时它会自动停止。由于IntentService是一种服务,所以它的优先级会比普通线程的高,适合执行一些高优先级的后台任务,因为高优先级不容易被系统杀死。

工作原理

IntentService封装了HandlerThread和Handler,在onCreate方法中创建HandlerThread和Handler,并把handler和HandlerThread的Looper关联起来

 public void onCreate() {
        super.onCreate();
        HandlerThread thread = new HandlerThread("IntentService[" + mName + "]");
        thread.start();

        mServiceLooper = thread.getLooper();
        mServiceHandler = new ServiceHandler(mServiceLooper);
    }

每一次启动IntentService,onStartCommand方法会被调用,处理每个后台任务的Intent.

    public int onStartCommand(Intent intent, int flags, int startId) {
        onStart(intent, startId);
        return mRedelivery ? START_REDELIVER_INTENT : START_NOT_STICKY;
    }

上面代码可以知道,onStartCommand又调用了onStart(intent, startId)

    public void onStart(Intent intent, int startId) {
        Message msg = mServiceHandler.obtainMessage();
        msg.arg1 = startId;
        msg.obj = intent;
        mServiceHandler.sendMessage(msg);
    }

onStart方法通过mServiceHandler把Intent对象发送出去,这个Intent对象跟外界的startService(intent)中的intent是一致的

我们看看ServiceHandler这个内部类

private final class ServiceHandler extends Handler {
        public ServiceHandler(Looper looper) {
            super(looper);
        }

        @Override
        public void handleMessage(Message msg) {
            onHandleIntent((Intent)msg.obj);
            stopSelf(msg.arg1);
        }
    }

handleMessage方法调用了onHandleIntent((Intent)msg.obj)。onHandleIntent是个抽象方法,我们需要在IntentService的子类重写它,所以在这里我们可以进行耗时任务的执行。通过不同的intent参数,我们就可以进行不同的后台任务处理了。onHandleIntent方法执行完毕后调用stopSelf(int startId)自动停止任务,之所以调用stopSelf(int startId)而不是stopSelf(),是因为stopSelf()会马上停止任务,但这时可能会有其他任务还没处理,stopSelf(int startId)会等待所有任务处理之后再停止任务。
由于IntentService内部是通过handler的形式发送消息处理任务的,Looepr是按顺序处理消息的,所以IntentService也是按启动顺序执行后台任务。

通过以上的分析,我们知道IntentService的使用重点在于重写onHandleIntent方法,对不同的intent对象进行不同的处理,启动IntentService时对intent传入参数,通过这些参数作为标识就可以进行不同任务的处理


以上是关于Android IntentService的主要内容,如果未能解决你的问题,请参考以下文章

在android中使用IntentService从服务器下载文件

从 IntentService 迁移到 Android O 的 JobIntentService

Android16.4 IntentService类

android 中IntentService的使用场景

Android 多线程之IntentService 完全详解

Android IntentService