Service和IntentService的区别

Service的简介:

1:什么是service:

service是后台服务

2:service的作用:

为了保证应用程序被挂到后台后某些组件仍然可以工作

3:service的弊端:

service既不是独立的进程也不是独立的线程,是依赖于主线程的,所以是不建议在service里面做过多的耗时操作的,避免ANR。

IntentService的简介:

1.什么是intentService:

intentService是Service的子类,继承service,拥有service的全部生命周期,包含了service的全部特性;

2.intentService的作用:

在onCreat被执行时内部会开启一个线程,用于解决在后台服务中进行耗时操作;

例如:后台上传图片,批量操作数据库等;

IntentService使用方法:

源码解读


packagecom.shaomin.wsm.intentservice

importandroid.app.Service;

importandroid.content.Intent;

importandroid.os.Handler;

importandroid.os.HandlerThread;

importandroid.os.IBinder;

importandroid.os.Looper;

importandroid.os.Message;

publicabstractclassIntentServiceextendsService{

privatevolatileLoopermServiceLooper;//消息队列

privatevolatileServiceHandlermServiceHandler;

privateStringmName;

privatebooleanmRedelivery;

//构造方法 传入我们创建的Intentservice的名字

publicIntentService(Stringname){

super();

mName=name;

}

//创建一个服务并开启线程得到消息队列并通过handller发送

@Override

publicvoidonCreate(){

super.onCreate();

//创建一个线程对象

HandlerThreadthread=newHandlerThread("IntentService["+mName+"]");

//开启线程

thread.start();

//创建队列,获得Looper对象

mServiceLooper=thread.getLooper();

//创建线程对象

mServiceHandler=newServiceHandler(mServiceLooper);

}

//由onStartCommand中回调onstart通过mServiceHandler发送消息到该handler的handleMessage中去。

//最后handleMessage中回调onHandleIntent(intent)。

@Override

publicvoidonStart(Intentintent,intstartId){

//获得消息对象

Messagemsg=mServiceHandler.obtainMessage();

msg.arg1=startId;

msg.obj=intent;

//发送消息

mServiceHandler.sendMessage(msg);

}

//设置该方法的布尔值(具体用途在onStartCommand中体现)

publicvoidsetIntentRedelivery(booleanenabled){

mRedelivery=enabled;

}

//mRedelivery会根据setIntentRedelivery设置的布尔值返回START_REDELIVER_INTENT or START_NOT_STICKY

//START_NOT_STICKY型服务会直接被关闭

//START_REDELIVER_INTENT 型服务会在可用资源不再吃紧的时候尝试再次启动服务

//当我们的操作不是十分重要的时候,我们可以选择START_NOT_STICKY,这也是IntentService的默认选项

//当我们认为操作十分重要时,则应该选择START_REDELIVER_INTENT 型服务

@Override

publicintonStartCommand(Intentintent,intflags,intstartId){

onStart(intent,startId);

returnmRedelivery?START_REDELIVER_INTENT:START_NOT_STICKY;

}

@Override

publicIBinderonBind(Intentintent){

returnnull;

}

//退出消息队列

@Override

publicvoidonDestroy(){

mServiceLooper.quit();

}

privatefinalclassServiceHandlerextendsHandler{

publicServiceHandler(Looperlooper){

super(looper);

}

//接收handler发送的消息 消息值为int型相当于一个请求的唯一标识。每发送一个请求,会生成一个唯一的标识,然后将请求放入队列,当全部执行完成(最后一个请求也就相当于getLastStartId == startId),

// 或者当前发送的标识是最近发出的那一个(getLastStartId == startId),则会销毁我们的Service.

@Override

publicvoidhandleMessage(Messagemsg){

onHandleIntent((Intent)msg.obj);

/**

* Message 可以传递的参数有:

1. arg1 arg2 整数类型,是setData的低成本替代品。传递简单类型

2. Object 类型 obj

3. what 用户自定义的消息代码,这样接受者可以了解这个消息的信息。每个handler各自包含自己的消息代码,所以不用担心自定义的消息跟其他handlers有冲突。

*/

stopSelf(msg.arg1);

}

}

//重写耗时操作的逻辑,改方法会延伸到继承它的子类中实现

protectedabstractvoidonHandleIntent(Intentintent);

}

IntentService具体方法解读

构造函数

IntentService(String name)创建一个 IntentService.

公用方法

onBind(Intent intent)不需要实现此方法,因为默认实现返回null

onCreate()当服务首次创建时由系统调用。

onDestroy()通知服务不再使用并正在被删除

onStartCommand不需要重写

setIntentRedelivery(boolean enabled) 源码中的体现是根据此方法设置的布尔值来决定onStartCommand 返回START_NOT_STICKY还是START_REDELIVER_INTENT;;;START_NOT_STICKY型服务会直接被关闭,而START_REDELIVER_INTENT 型服务会在可用资源不再吃紧的时候尝试再次启动服务。 由此我们可以发现,当我们的操作不是十分重要的时候,我们可以选择START_NOT_STICKY,这也是IntentService的默认选项,当我们认为操作十分重要时,则应该选择START_REDELIVER_INTENT 型服务

onHandleIntent(Intent intent)该函数用于针对Intent的不同进行不同的事务处理就可以了.执行完所一个Intent请求对象所对应的工作之后,如果没有新的Intent请求达到,则自动停止Service;否则ServiceHandler会取得下一个Intent请求传人该函数来处理其所对应的任务。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,324评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,303评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,192评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,555评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,569评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,566评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,927评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,583评论 0 257
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,827评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,590评论 2 320
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,669评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,365评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,941评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,928评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,159评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,880评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,399评论 2 342

推荐阅读更多精彩内容

  • 多线程的应用 继承Thread类 实现Runnable接口 AsyncTask Handler HandlerTh...
    Mr_不靠谱_先森阅读 697评论 0 1
  • 前言:本文所写的是博主的个人见解,如有错误或者不恰当之处,欢迎私信博主,加以改正!原文链接,demo链接 Serv...
    PassersHowe阅读 1,400评论 0 5
  • 本篇文章是继续上篇android图片压缩上传系列-基础篇文章的续篇。主要目的是:通过Service来执行图片压缩任...
    laogui阅读 4,429评论 5 62
  • [文章内容来自Developers] Service是一个可以在后台执行长时间运行操作而不提供用户界面的应用组件。...
    岳小川阅读 853评论 0 7
  • 按照家里的说法,阴历生日已到,我终于18岁了。总想着写些什么,或多或少的写下曾经零零散散的感觉。题目换了又换,决定...
    爱唱歌的神儿阅读 255评论 0 1