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请求传人该函数来处理其所对应的任务。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

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