android开发:IntentService源码解析

安卓四大组价之一Service,普通的Service是运行在主线程中的,一旦我们做什么耗时操作则会出现ANR。android提供了IntentService给我们,它默认会开启一个带有Looper循环的线程执行我们的任务。当我们的任务结束时会尝试关闭我们的service,但是只有当消息队列没有任务时才会关闭成功。
它的底层是靠HandlerThrea实现的,上一篇文章中我们讲解了HandlerThread,其本质上是一个Thread,只不过内部定义了其自身的Looper和MessageQueue。通过Handler绑定looper可以实现线程间的通信
android开发:HandlerThread源码解析

IntentService使用:

public class MyIntentService extends IntentService {
 
    public MyIntentService() {
        super("MyIntentService");
    }
 
    @Override
    protected void onHandleIntent(@Nullable Intent intent) {
        try {
            Thread.sleep(100000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }
}

1.继承IntentService
2.构造函数调用父类的构造函数
3.重写它的onHandleIntent方法

源码分析

构造方法:

77     */
78    public IntentService(String name) {
79        super();
80        mName = name;
81    }

IntentService的构造方法:调用父类的构造方法创建service,初始化mName(mName在创建HandlerThread时用到)

oncreate()方法:

102
103    @Override
104    public void onCreate() {
105        // TODO: It would be nice to have an option to hold a partial wakelock
106        // during processing, and to have a static startService(Context, Intent)
107        // method that would launch the service & hand off a wakelock.
108
109        super.onCreate();
			//创建HandlerThread对象,mName 作为线程的名称
110        HandlerThread thread = new HandlerThread("IntentService[" + mName + "]");
			//开启线程
111        thread.start();
112			//获取线程的HandlerThread的Looper对象
113        mServiceLooper = thread.getLooper();
			//创建Handler对象,并绑定Looper对象
114        mServiceHandler = new ServiceHandler(mServiceLooper);
115    }
116

 private final class ServiceHandler extends Handler {
62        public ServiceHandler(Looper looper) {
63            super(looper);
64        }
65
66        @Override
67        public void handleMessage(Message msg) {
68            onHandleIntent((Intent)msg.obj);
69            stopSelf(msg.arg1);
70        }
71    }

可以看到onreate()创建了HandlerThread对象使用mName 作为参数,HandlerThread内部会创建Looper和MessageQueue。然后创建ServiceHandler对象(ServiceHandler继承Handler)并且绑定Looper对象。

onstart():

130     */
131    @Override
132    public int onStartCommand(@Nullable Intent intent, int flags, int startId) {
133        onStart(intent, startId);
134        return mRedelivery ? START_REDELIVER_INTENT : START_NOT_STICKY;
135    }

116
117    @Override
118    public void onStart(@Nullable Intent intent, int startId) {
119        Message msg = mServiceHandler.obtainMessage();
120        msg.arg1 = startId;
121        msg.obj = intent;
122        mServiceHandler.sendMessage(msg);
123    }

可以看到在onStartCommand()中调用了onstart(),onstart使用Handler发送了消息。handler的handleMessage()就会接收到消息,然后执行 onHandleIntent(),onHandleIntent又是抽象方法。因此我们继承IntentService时只需要重写onHandleIntent()方法即可。

 private final class ServiceHandler extends Handler {
62        public ServiceHandler(Looper looper) {
63            super(looper);
64        }
65
66        @Override
67        public void handleMessage(Message msg) {
68            onHandleIntent((Intent)msg.obj);
			//每次执行完任务都尝试关闭service,当MessageQueue没有消息时service关闭成功
69            stopSelf(msg.arg1);
70        }
71    }

总结:

1.IntentService是一个service,也是一个抽象类;
2.IntentService内部封装这一个HandlerThread,HandlerThread又维护着Looper与消息队列,通过创建Handler对象和HandlerThread的Lopper绑定,就可以实现不断的向HandlerThread发送消息执行任务。
3.每次IntentService后台任务执行完成之后都会尝试关闭自身,但是当且仅当IntentService消息队列中最后一个消息被执行完成之后才会真正的stop自身;
4.真正执行任务是在handler的handleMessage()方法中,handleMessage又调用onHandlerIntent(),因此用户需要实现onHandlerIntent()

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值