zoukankan      html  css  js  c++  java
  • IntentService与Service的区别

    转自:https://www.cnblogs.com/denluoyia/p/5997452.html

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

    先来看一下IntentService类的源码:

    复制代码
    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); 
     }
    复制代码

    定义一个IntentService的子类:

    复制代码
    public class MIntentService extends 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
        public void onCreate() {
            Log.e("MIntentService--", "onCreate");
            super.onCreate();
        }
    
        @Override
        public int onStartCommand(Intent intent, int flags, int startId) {
            Log.e("MIntentService--", "onStartCommand");
            return super.onStartCommand(intent, flags, startId);
        }
    
        @Override
        protected void onHandleIntent(Intent intent) {
            Log.e("MIntentService--", Thread.currentThread().getName() + "--" + intent.getStringExtra("info") );
            for(int i = 0; i < 100; i++){ //耗时操作
                Log.i("onHandleIntent--",  i + "--" + Thread.currentThread().getName());
            }
        }
    
        @Override
        public void onDestroy() {
            Log.e("MIntentService--", "onDestroy");
            super.onDestroy();
        }
    }
    复制代码

    开启IntentService服务:

     public void intentClick(View v){
            Intent intent = new Intent(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--﹕ onCreate
    10-25 16:54:58.852  27135-27135/com.example.lenovo.myintentservicedemo E/MIntentService--﹕ onStartCommand
    10-25 16:54:58.856  27135-27354/com.example.lenovo.myintentservicedemo E/MIntentService--﹕ IntentService[MIntentService]--good good study
    10-25 16:54:58.879  27135-27135/com.example.lenovo.myintentservicedemo E/MIntentService--﹕ onDestroy

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

  • 相关阅读:
    B.Icebound and Sequence
    Educational Codeforces Round 65 (Rated for Div. 2) D. Bicolored RBS
    Educational Codeforces Round 65 (Rated for Div. 2) C. News Distribution
    Educational Codeforces Round 65 (Rated for Div. 2) B. Lost Numbers
    Educational Codeforces Round 65 (Rated for Div. 2) A. Telephone Number
    Codeforces Round #561 (Div. 2) C. A Tale of Two Lands
    Codeforces Round #561 (Div. 2) B. All the Vowels Please
    Codeforces Round #561 (Div. 2) A. Silent Classroom
    HDU-2119-Matrix(最大匹配)
    读书的感想!
  • 原文地址:https://www.cnblogs.com/dirt2/p/10473659.html
Copyright © 2011-2022 走看看