面试专题(十三):Service 与 IntentService

1.Service 与 IntentService区别:

  • Service不是运行在独立的线程,所以不建议在Service中编写耗时的逻辑和操作,否则会引起ANR。

  • IntentService

    1.可用于执行后台耗时的任务,任务执行后会自动停止。

    2.具有高优先级,适合高优先级的后台任务,且不容易被系统杀死。

    3.可以多次启动,每个耗时操作都会以工作队列的方式在IntentService的onHandleIntent回调方法中执行。

2.IntentService的使用:

面试专题(十三):Service 与 IntentService_第1张图片

3.源码角度看一看

然后我们再来看看源码是怎么实现的:

  • 第一:

    在IntentService的onCreate()中我们可以看到:

    首先是创建了一个HandlerThread线程,然后启动线程。

    然后再通过这个线程里的Looper创建了一个Handler。

    所以这个ServiceHandler是在子线程中执行的。【所以IntentService可用于执行后台耗时的任务】
    面试专题(十三):Service 与 IntentService_第2张图片

  • 第二:

    在onStart()的时候会通过这个Handler去发送消息;

    紧接着就会进入Handler的handleMessage()方法,

    而这里面就有我们重写的onHandleIntent()方法。

    并且在onHandleIntent()执行完以后会执行stopSelf().【所以任务执行后IntentService可以自动停止】
    面试专题(十三):Service 与 IntentService_第3张图片
    面试专题(十三):Service 与 IntentService_第4张图片

  • 第三:

    IntentService是具有高优先级的,不容易被系统杀死,那这个高优先级肯定是由线程决定的,

    我们可以看到Thread在创建的时候设置的优先级为0,非常的高。
    面试专题(十三):Service 与 IntentService_第5张图片

  • 第四:

    为什么每个耗时操作都会以工作队列的方式在回调方法中执行?

    因为onHandleIntent()实际上就是在Handler中执行的,而我们的Handler就是一个消息队列(底层是单链表)。

你可能感兴趣的:(Android面试大全)