美文网首页面试题
IntentService 的使用

IntentService 的使用

作者: wind_sky | 来源:发表于2019-07-31 15:19 被阅读3次

一. 介绍

IntentService 是Service的一个子类,我们知道Service是运行在后台(用户看不见)的,但是当我们创建一个Service时,它实际上是运行在主线程中,主线程中是不能执行耗时任务的,如果我们要在Service中做耗时的任务,就需要在Service中创建一个新的线程。然而IntentService就是包含了一个工作线程的Service。

工作原理:

IntentService 内部包含了一个Handler和Looper,在创建(onCreate)时,IntentService创建了一个HandlerThread,并获取到Thread的Looper来初始化Handler。

HandlerThread thread = new HandlerThread("IntentService[" + mName + "]");
thread.start();

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

在onStart时,通过Handler发送一个Message并将接收到的Intent带过去。

Message msg = mServiceHandler.obtainMessage();
msg.arg1 = startId;
msg.obj = intent;
mServiceHandler.sendMessage(msg);

而Handler是IntentService的一个内部类,接收到Message后调用onHandleIntent方法。

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

这样我们只需要实现onHandleIntent方法就可以了,onHandleIntent中的代码将在工作线程即HandlerThread中执行。

我们可以多次调用startService(intent)来执行任务,因为每次start其实都是通过Handler发送一个消息,所以这些任务也是串行执行的,另外当前执行的任务无法打断,当所有任务执行完毕时,Service将会停止。

注意:在Android 8.0 中,由于后台执行限制,在后台运行的IntentService将受到影响,因此在Android 8.0 之后建议使用JobIntentService 来实现相关功能。

二. 使用

通过上面的原理介绍,我们知道,要想使用IntentService,只需要继承IntentService并实现onHandleIntent方法即可。示例

public class TestIntentService extends IntentService{

    public TestIntentService() {
        super("TestIntentService");
    }

    @Override
    protected void onHandleIntent(@Nullable Intent intent) {

        int res = 0;
        try {
            while (res < 5) {
                res++;

                Thread.sleep(1000);
            }
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        Log.e("--------------", res+"");
    }
}

//使用
Intent intent = new Intent(this, TestIntentService.class);
startService(intent);

相关文章

网友评论

    本文标题:IntentService 的使用

    本文链接:https://www.haomeiwen.com/subject/dbhtdctx.html