异步服务IntentService

Posted 天耀106

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了异步服务IntentService相关的知识,希望对你有一定的参考价值。

    服务Service虽然是在后台运行,但跟Activity一样都在主线程中,如果后台运行着的服务挂起,用户界面就会卡着不动,俗称死机。后台服务经常要做一些耗时操作,比如批量处理、文件导入、网络访问等,此时不应该影响用户在界面上的操作,而应该开启分线程执行耗时操作。可以通过Thread+Handler机制实现异步处理,也可以通过android封装好的异步服务IntentService处理。

    使用IntentService有两个好处,一个是免去复杂的消息通信流程;另一个是处理完成后无须手工停止服务,开发者可集中精力进行业务逻辑的编码。话虽如此,我们还是有必要了解一下IntentService的具体实现,入了这行一般都要干上许多年,晚学不如早学。处理器对象位于主线程中,分线程通过Handler对象通知主线程,然后主线程执行Handler对象的handleMessage方法刷新界面。反过来也是允许的,即处理器对象位于分线程中,主线程通过handler对象通知分线程,然后分线程执行Handler对象的handleMessage方法进行耗时处理。

    1、创建异步服务时,初始化分线程的Handler对象,注意下面源码的thread.getLooper方法:

@Override
    public void onCreate() 
        super.onCreate();
        HandlerThread thread = new HandlerThread("IntentService[" + mName + "]");
        thread.start();

        mServiceLooper = thread.getLooper();
        mServiceHandler = new ServiceHandler(mServiceLooper);
    

    2、异步服务开始运行时,通过Handler对象将请求数据送给分线程,源码如下:

@Override
    public void onStart(@Nullable Intent intent, int startId) 
        Message msg = mServiceHandler.obtainMessage();
        msg.arg1 = startId;
        msg.obj = intent;
        mServiceHandler.sendMessage(msg);
    

    3、分线程在Handler对象的handleMessage方法中,先通过onHandleIntent方法执行具体的事务处理,再调用stopSelf结束指定标识的服务。源码如下:

private final class ServiceHandler extends Handler 
        public ServiceHandler(Looper looper) 
            super(looper);
        

        @Override
        public void handleMessage(Message msg) 
            onHandleIntent((Intent)msg.obj);
            stopSelf(msg.arg1);
        
    

了解IntentService的实现思想后,使用过程中需要注意以下4点:

(1)增加一个构造方法,并分配内部线程的唯一名称。

(2)onStartCommand方法要调用父类的onStartCommand,因为父类方法会向分线程传递消息。

(3)耗时处理的业务代码要写在onHandleIntent方法中,不可写在onStartCommand方法中。因为onHandleIntent方法位于分线程,而onStartCommand方法位于主线程。

(4)IntentService实现了onStart方法,却未实现onBind方法,意味着异步服务只能用普通方式启停,不能用绑定方式启停。

以上是关于异步服务IntentService的主要内容,如果未能解决你的问题,请参考以下文章

IntentService原理分析

详细剖析IntentService的运作机理

如何在固定时间间隔后使用 IntentService 实现进行轮询?

Android Service为IntentService扩展ResultReceiver,CREATOR如何实现?

IntentService与Service的区别

IntentService源码分析