Android源码学习系列——IntentService

本文分析基于Android9.0

可能有人会好奇,安卓四大组件不是有Service,还需要这个IntentService做什么?

先看这个类中的成员变量

    private volatile Looper mServiceLooper;
    private volatile ServiceHandler mServiceHandler;
    private String mName;
    private boolean mRedelivery;

发现有Looper和ServiceHandler。

熟悉Handler的朋友,到这你可能就大概知道了,IntentService的功能和线程间通信有关了吧。

一个类,要了解它,就看它的成员变量和构造方法开始,接下来看构造方法

public IntentService(String name) {
        super();
        mName = name;
}

构造方法主要是给工作线程起了个名称,调试用的。

而工作线程的创建以及起名字在:

@Override
    public void onCreate() {

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

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

既然有HandlerThread和Looper以及这个ServiceHandler。

那发消息在哪?

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

接收消息在哪?

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

 

public void setIntentRedelivery(boolean enabled) {
        mRedelivery = enabled;
}

这个方法主要是和onStartCommand相关。(IntentService的子类禁止重写此方法)

https://www.cnblogs.com/huazaizai/p/3792847.html

主要是设置类似需求的事情,通常设置在拓展类的构造方法里。

设置mRedelivery=true,则如果在执行完onStartCommand后,服务被异常kill掉,系统会自动重启该服务,并将Intent的值传入。

设置mRedelivery=false,则如果在执行完onStartCommand后,服务被异常kill掉,系统不会自动重启该服务。

进而决定onStartCommand的最终返回值。

 @Override
    public int onStartCommand(@Nullable Intent intent, int flags, int startId) {
        onStart(intent, startId);
        return mRedelivery ? START_REDELIVER_INTENT : START_NOT_STICKY;
 }

 

终止Looper,不再接收发来的Message了。

@Override
    public void onDestroy() {
        mServiceLooper.quit();
    }

因为是startService,所以它很空虚和。。

@Override
    @Nullable
    public IBinder onBind(Intent intent) {
        return null;
}

到这,重头戏才出来——onHandleIntent

@WorkerThread
protected abstract void onHandleIntent(@Nullable Intent intent);

看的很清楚,它在拓展类中扮演的角色是在工作线程。

当耗时任务处理完,它里面有自动停止服务的方法。

最后,请允许我放一大段英文,因为重要的方法,每人理解不同,请你自己理解。

     *This method is invoked on the worker thread with a request to process.
     * Only one Intent is processed at a time, but the processing happens on a worker thread that runs independently from other application logic.
     * So, if this code takes a long time, it will hold up other requests to the same IntentService, but it will not hold up anything else.
     * When all requests have been handled, the IntentService stops itself,so you should not call .

下班了,我要回去了。先这样了。

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值