IntentService源码分析

作用:可执行耗时操作的Service。

优点:一个后台线程是很容易被系统杀死的,优先级非常低。而IntentService是一个服务,不容易被系统杀死。

源码分析:

@Override
    public void onCreate() {
        super.onCreate();
        HandlerThread thread = new HandlerThread("IntentService[" + mName + "]");
        thread.start();   // 开启子线程,初始化Looper

        mServiceLooper = thread.getLooper();
        mServiceHandler = new ServiceHandler(mServiceLooper); // 构建Handler
    }
  • 在IntentService的onCreate()方法中,创建了一个HandlerThread。
  • HandlerThread是一个线程在run()方法中实现了Looper的初始化操作,因此通过thread.getLooper()获取到HandlerThread的looper。
  • 用HandlerThread的looper构建一个ServiceHandler
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);  // 等待所有消息处理完后终止服务,在onDestroy()中退出looper,终止子线程操作
        }
    }
  • ServiceHandler内部通过handleMessage()获取到msg,执行onHandleIntent()的内容。
  • 从代码可见onHandleIntent()是一个抽象方法,在此可进行耗时任务的操作。
  • stopSelf(msg.arg1);在完成任务后关闭服务回调IntentService的onDestroy(),执行mServiceLooper.quit(),从而终止mServiceLooper所在的子线程即我们在onCreate()方法中创建的子线程HandlerThread

另外,只有通过startService()才会触发onStartCommand()生命周期,调用onStart(),完成消息的发送即子线程中任务的转换。

@Override
    public void onStart(@Nullable Intent intent, int startId) {
        Message msg = mServiceHandler.obtainMessage();
        msg.arg1 = startId;
        msg.obj = intent;
        mServiceHandler.sendMessage(msg);
    }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值