美文网首页
Service和IntentService的区别

Service和IntentService的区别

作者: 大表哥007 | 来源:发表于2017-06-11 19:09 被阅读1456次

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

    相关文章

      网友评论

          本文标题:Service和IntentService的区别

          本文链接:https://www.haomeiwen.com/subject/gnzhqxtx.html