简单分析下IntentService 实现

博客着重分析了IntentService的内部实现流程。对比了IntentService和Service,指出IntentService执行完任务会自动停止,多次启动时耗时操作会串行执行。介绍了其内部实现及自行销毁机制,还提及常用场景是在主线程开启服务,在IntentService做异步处理并通知主线程。

我们都知道用IntentService 来处理异步操作非常高效方便,面试中我们也经常会遇到其相关问题,今天着重分析下其内部实现流程。

1、IntentService对比Service

a、IntentService继承Service

b、处理异步操作,Service要通过开启Thread线程去处理,而IntentService内部实现了HandlerThread,而且会帮助其管理looper。

c、当任务执行完后,IntentService 会自动停止,不需要我们去手动结束。

d、如果启动 IntentService 多次,那么每一个耗时操作会以工作队列的方式在 IntentService 的 onHandleIntent 回调方法中执行,依次去执行,使用串行的方式,执行完自动结束。

 2、IntentService 内部实现

 @Override
    public void onCreate() {
        // TODO: It would be nice to have an option to hold a partial wakelock
        // during processing, and to have a static startService(Context, Intent)
        // method that would launch the service & hand off a wakelock.

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

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

我们不难发现 ,其内部实现了HandlerThread,通过handler消息循环机制处理异步操作。

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);
        }
    }

执行完之后自行销毁。 

3、使用场景

//异步处理
@Override
    protected void onHandleIntent(Intent intent) {
        Logout.e("onHandleIntent");
        try {
            Thread.sleep(1000);
            isRunning = true;
            count = 0;
            while (isRunning) {
                count++;
                if (count >= 100) {
                    isRunning = false;
                }
                Thread.sleep(50);
                sendThreadStatus("线程运行中...", count);
            }

        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }

我们平时常用的场景应该是,我们在主线程开启服务,在IntentService 做异步处理,处理完数据通过EventBus通知主线程数据修改。



 

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值