美文网首页
Service和IntentService的区别

Service和IntentService的区别

作者: GexYY | 来源:发表于2018-07-12 10:38 被阅读0次

    Service相信大家都比较熟悉了,就不重点做阐述解释了.

    IntentService也是继承Service,但是和正常的Service的区别有2点:

    • 主要是用来处理异步请求或者耗时操作,重写onHandleIntent()方法来执行处理
    • 任务执行完毕之后会自动停止,不需要我们手动调用stopSelf()方法来停止,并且如果多次启动IntentService,发起多个任务,每次只会执行一个工作线程,执行完第一个再执行第二个;

    分析IntentService源码:

     @Override
        public void onCreate() {
            // TODO: It would be nice to have an option to hold a partial wakelock
            // during processing, and to have a static startService(Context, Intent)
            // method that would launch the service & hand off a wakelock.
    
            super.onCreate();
            HandlerThread thread = new HandlerThread("IntentService[" + mName + "]");
            thread.start();
    
            mServiceLooper = thread.getLooper();
            mServiceHandler = new ServiceHandler(mServiceLooper);
        }
    

    发现再onCreate()中开启来一个HandlerThread,并创建来ServiceHandler,从而保证当前任务的异步处理和任务的单一处理;

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

    我们看到再onStart()方法中,mServiceHandler发送来执行任务的msg,接下来我们看下mServiceHandler中的接收处理

    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);
            }
        }
    

    可以看到接收到任务后,直接调用onHandlerIntent()方法来处理异步任务,任务结束后自动调用stopSelf()来终止线程
    经常我们的在广播或者Service的接收中要处理相关的耗时操作,建议采用IntentService来优化处理
    到此,通过分析源码,之前说的2个区别都可以很明白的解释了!

    相关文章

      网友评论

          本文标题:Service和IntentService的区别

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