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的情况。

  • 相关阅读:
    ffmpeg显示视频
    眼见为实(1):C++基本概念在编译器中的实现
    在Windows系统上实现轻量级的线程间及进程间消息队列
    Intellij IDEA 2017 debug断点调试技巧与总结详解篇
    redis 全局命令 查看所有的键,删除键,检查键是否存在,获取过期时间,键的数据结构类型
    java.security.InvalidKeyException: IOException : Short read of DER length
    RSA解密报错java.security.spec.InvalidKeySpecException的解决办法
    IntelliJ IDEA全局内容搜索和替换
    RSA加密/解密 Decryption error异常解决
    java rsa 解密报:javax.crypto.BadPaddingException: Decryption error
  • 原文地址:https://www.cnblogs.com/dirt2/p/10473659.html
Copyright © 2011-2022 走看看