博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
IntentService与Service的区别
阅读量:6379 次
发布时间:2019-06-23

本文共 2736 字,大约阅读时间需要 9 分钟。

转自:

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

转载于:https://www.cnblogs.com/dirt2/p/10473659.html

你可能感兴趣的文章
WEB前端开发的思考与感悟
查看>>
微信自动跳转浏览器打开APP(APK)下载链接
查看>>
==与===的区别
查看>>
不同工具查看代码分支diff的差异
查看>>
白话Java I/O模型
查看>>
上传一张照片,让算法告诉你是否患有抑郁症
查看>>
VR厂商唯晶科技获2800万C+轮融资,曾开发过游戏《圣女之歌》
查看>>
Countly 19.02.1 发布,实时移动和 web 分析报告平台
查看>>
TCP连接中time_wait在开发中的影响-搜人以鱼不如授之以渔
查看>>
Oracle数据库机出新帮助不同规模企业迈向云端
查看>>
前端通信:ajax设计方案(六)--- 全局配置、请求格式拓展和优化、请求二进制类型、浏览器错误搜集以及npm打包发布...
查看>>
微服务分布式企业框架 Springmvc+mybatis+shiro+Dubbo+ZooKeeper+Redis+KafKa
查看>>
被《时代周刊》选为年度最佳发明,PS VR靠的竟然是价格
查看>>
通用唯一标识码UUID的介绍及使用。
查看>>
spring笔记--依赖注入之针对不同类型变量的几种注入方式
查看>>
Ajax的简单学习
查看>>
为npm配置taobao源
查看>>
管理邮件用户
查看>>
导出DC数据以便以介质方式安装另一台域控制器
查看>>
Hibernate学习(八):检索方式
查看>>