美文网首页
Service、IntentService、Thread的区别和

Service、IntentService、Thread的区别和

作者: 小小的coder | 来源:发表于2020-05-18 20:10 被阅读0次

    一、Service的介绍
    Service的官方介绍中比较重要的两点:

    1.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.
    2.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).
    简单翻译一下
    1.Service不是一个单独的进程 ,服务对象本身并不意味着它运行在自己的进程,除非另有规定,它运行在同一进程中作为应用程序的一部分。
    2.Service不是一个线程,所以我们应该避免在Service里面进行耗时的操作。
    重点注意:Service不是一个线程,不能直接处理耗时的操作。

    二、IntentService的用法
    简单说,IntentService是继承于Service并处理异步请求的一个类,在IntentService内有一个工作线程来处理耗时操作,启动IntentService的方式和启动传统Service一样,同时,当任务执行完后,IntentService会自动停止,而不需要我们去手动控制。另外,可以启动IntentService多次,而每一个耗时操作会以工作队列的方式在IntentService的onHandleIntent回调方法中执行,并且,每次只会执行一个工作线程,执行完第一个再执行第二个,以此类推。
    而且,所有请求都在一个单线程中,不会阻塞应用程序的主线程(UI Thread),同一时间只处理一个请求。
    那么,用IntentService有什么好处呢?首先,我们省去了在Service中手动开线程的麻烦,第二,当操作完成时,我们不用手动停止Service。
    IntentService的源码

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

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

    @Override
    public void onStart(Intent intent, int startId) {
    Message msg = mServiceHandler.obtainMessage();
    msg.arg1 = startId;
    msg.obj = intent;
    mServiceHandler.sendMessage(msg);
    }
    这就是IntentService,一个方便我们处理业务流程的类,它是一个Service,但是比Service更智能。

    三、Thread和Service的区别
    Thread:Thread 是程序执行的最小单元,它是分配CPU的基本单位。可以用 Thread 来执行一些异步的操作。
    Service:Service 是android的一种机制,当它运行的时候如果是Local Service,那么对应的Service 是运行在主进程的 main 线程上的。如:onCreate,onStart 这些函数在被系统调用的时候都是在主进程的 main 线程上运行的。如果是Remote Service,那么对应的 Service 则是运行在独立进程的 main 线程上。
    那么为什么我们不直接用Thread而要用Service呢?其实这跟 android 的系统机制有关,我们先拿Thread 来说。Thread 的运行是独立于 Activity 的,也就是说当一个 Activity 被 finish 之后,如果你没有主动停止 Thread 或者 Thread 里的 run 方法没有执行完毕的话,Thread 也会一直执行。因此这里会出现一个问题:当 Activity 被 finish 之后,你不再持有该 Thread 的引用。另一方面,你没有办法在不同的 Activity 中对同一 Thread 进行控制。
    Thread和Service的使用场景:
    1、在应用中,如果是长时间的在后台运行,而且不需要交互的情况下,使用服务。同样是在后台运行,不需要交互的情况下,如果只是完成某个任务,之后就不需要运行,而且可能是多个任务,需要长时间运行的情况下使用线程。
    2、如果任务占用CPU时间多,资源大的情况下,要使用线程。

    链接:https://www.jianshu.com/p/f9d3c3ee5d67

    相关文章

      网友评论

          本文标题:Service、IntentService、Thread的区别和

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