android之Service(2)IntentService

简介

Started Service 默认运行在主线程中,如果在Service运行一些耗时的操作,很容易就会出现ANR(Application Not Responding)问题。可以通过在onStartCommand()方法中开启一个子线程处理耗时逻辑,但是这种必须通过stopSelf()stopService()停止Service。下面介绍IntentService处理耗时操作,且IntentService能够减少代码量。

IntentService是异步的自动停止的Service,IntentService是Service类的子类。启动IntentService的方式和启动Service一样。IntentService在onCreate()方法中通过HandlerThread类单独开启一个工作线程来处理所有Intent请求对象(通过startService的方式发送过来的)所对应的任务,这样以免事务处理阻塞主线程。同时,当任务执行完后,IntentService会自动销毁,而不需要我们去手动控制,因此当需要完成一次性的完成的任务时采用IntentService。另外,可以启动IntentService多次,而每一个耗时操作会以工作队列的方式在IntentService的onHandleIntent()回调方法中执行,并且,每次只会执行一个工作线程,执行完第一个再执行第二个。所有请求都在一个单线程中,不会阻塞应用程序的主线程(UI Thread),同一时间只处理一个请求。

IntentService在处理事务时,还是采用的Handler方式,创建一个名叫ServiceHandler的内部Handler,并把它直接绑定到HandlerThread所对应的子线程。 ServiceHandler把处理一个intent所对应的事务都封装到抽象方法onHandleIntent()中,因此需要实现onHandleIntent(),在里面根据Intent的不同进行不同的事务处理。另外,IntentService默认实现了onBind()方法,返回值为null。

启动IntentService

启动IntentService和启动Service一样通过Context类中的startService()方法启动,IntentService 也属于Started Service,同样需要注册。

MyIntentService.java代码如下:

package com.sywyg.servicetest;

import android.app.IntentService;
import android.content.Intent;
import android.util.Log;

/**
 * IntentService练习
 *@author sywyg
 *@since 2015/5/4
 */

public class MyIntentService extends IntentService {
    /**
     *该无参构造器是必须的,且必须调用父类有参构造器
     */
    public MyIntentService() {
        super("MyIntentService");
    }
    /**
     *父类方法中通过HandlerThread类单独开启一个工作线程
     */
    @Override
    public void onCreate() {
        super.onCreate();
        Log.d("result","onCreate...");
    }

    /**
     * 实现父类抽象方法,
     * 该方法每次执行时会在一个单独的工作线程中来完成工作任务,
     * 任务结束后该IntentService自动停止。无论开启多少次,每次执行一个工作线程。
     * @param intent 对应启动该IntentService的组件传递的Intent对象
     */
    @Override
    protected void onHandleIntent(Intent intent) {

        for (int i = 0;i<3;i++){
            Log.d("result","当前线程:" + Thread.currentThread().getName() + "-" + i);
            try {
                Thread.sleep(1*1000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    }

    @Override
    public void onDestroy() {
        super.onDestroy();
        Log.d("result","onDestroy...");
    }
}

注:

  • 必须有无参构造器,同时调用父类有参构造器。IntentService的实例化是系统来完成的,而且系统是用参数为0的构造器来实例化IntentService的。
  • IntentService需实现父类的抽象方法onHandleIntent(),需要完成的业务逻辑在该方法中完成。另外,可以启动IntentService多次,而每一个操作会以工作队列的方式在IntentService的onHandleIntent()方法中执行,并且,每次只会执行一个工作线程,执行完第一个再执行第二个,以此类推。
  • 若工作队列中有任务需要完成则IntentService不会销毁,当工作队列为空时IntentService自动销毁。

IntentService有以下特点(来自网络总结):

  1. 它创建了一个独立的工作线程来处理所有的通过onStartCommand()传递给服务的intents。
  2. 创建了一个工作队列,来逐个发送intent给onHandleIntent()。
  3. 不需要主动调用stopSelft()来结束服务。因为,在所有的intent被处理完后,系统会自动关闭服务。
  4. 默认实现的onBind()返回null
  5. 默认实现的onStartCommand()的目的是将intent插入到工作队列中
  6. 继承IntentService的类至少要实现两个方法:构造器和onHandleIntent()。当覆盖IntentService的其它方法时,需通过super调用父类对应的方法。

http://blog.csdn.net/huangbiao86/article/details/7035920
http://www.cnblogs.com/lwbqqyumidi/p/4181185.html
http://blog.csdn.net/guolin_blog/article/details/11952435

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值