美文网首页
IntentService与Service的区别

IntentService与Service的区别

作者: longmingren123 | 来源:发表于2019-07-31 17:34 被阅读0次

    IntentService是继承并处理异步请求的一个类,在IntentService内有一个工作线程来处理耗时操作,启动IntentService的方式和启动传统的Service一样,同时,当任务执行完后,IntentService会自动停止,而不需要我们手动去控制或stopSelf()。另外,可以启动IntentService多次,而每一个耗时操作会以工作队列的方式在IntentService的onHandleIntent回调方法中执行,并且,每次只会执行一个工作线程,执行完第一个再执行第二个,以此类推。

    先来看一下IntentService类的源码:

    publicvoid 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 =newHandlerThread("IntentService[" + mName + "]");

            thread.start(); //开启一个工作线程        mServiceLooper = thread.getLooper();//单独的消息队列mServiceHandler =new ServiceHandler(mServiceLooper);

    }

    定义一个IntentService的子类:

    publicclassMIntentServiceextends IntentService {

        public MIntentService(){

            super("MIntentService");

        }

        /**    * Creates an IntentService.  Invoked by your subclass's constructor.

        * @param name Used to name the worker thread, important only for debugging.

        */public MIntentService(String name) {

            super(name);

        }

        @Override

        publicvoid onCreate() {

            Log.e("MIntentService--", "onCreate");

            super.onCreate();

        }

        @Override

        publicintonStartCommand(Intent intent,intflags,int startId) {

            Log.e("MIntentService--", "onStartCommand");

            returnsuper.onStartCommand(intent, flags, startId);

        }

        @Override

        protectedvoid onHandleIntent(Intent intent) {

            Log.e("MIntentService--", Thread.currentThread().getName() + "--" + intent.getStringExtra("info") );

            for(inti = 0; i < 100; i++){//耗时操作Log.i("onHandleIntent--",  i + "--" + Thread.currentThread().getName());

            }

        }

        @Override

        publicvoid onDestroy() {

            Log.e("MIntentService--", "onDestroy");

            super.onDestroy();

        }

    }

    开启IntentService服务:

    publicvoid intentClick(View v){

            Intent intent =newIntent(this, MIntentService.class);

            intent.putExtra("info", "good good study");

            startService(intent);

    }

    点击按钮之后输出结果为(过滤log.e):

    10-25 16:54:58.852  27135-27135/com.example.lenovo.myintentservicedemo E/MIntentService--﹕ onCreate10-25 16:54:58.852  27135-27135/com.example.lenovo.myintentservicedemo E/MIntentService--﹕ onStartCommand10-25 16:54:58.856  27135-27354/com.example.lenovo.myintentservicedemo E/MIntentService--﹕IntentService[MIntentService]--good good study10-25 16:54:58.879  27135-27135/com.example.lenovo.myintentservicedemo E/MIntentService--﹕ onDestroy

     Intent服务开启后,执行完onHandleIntent里面的任务就自动销毁结束,通过打印的线程名称可以发现是新开了一个线程来处理耗时操作的,即是耗时操作也可以被这个线程管理和执行,同时不会产生ANR的情况。

    相关文章

      网友评论

          本文标题:IntentService与Service的区别

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