IntentService源码分析

Hello,大家好,今天和大家分享一下阅读IntentService的源码:


Paste_Image.png

1.首先我们先启动我们需要的IntentService:
通过startService()--来启动我们的IntentService:这里有个细节点要注意就是startService和bindService两者之间Service的生命周期是不一样的。这边我就只介绍startService生命周期了如图:


IntentService源码分析_第1张图片
Paste_Image.png

这边我们需要注意的:1.1当service isstoped的时候该service 将会执行destory方法1.2service它本身也是在主进程进行工作的(Thread.currentThread().getId()),所以耗时操作我们需要单独启动一个thread来完成但是问题来了开启的线程时要是不及时回收则会造成阻塞或者内存泄露,Intentservice实际上就完成了这个操作并帮助我们并释放资源。

2.再来看IntentService中的变量参数:
private volatile Looper mServiceLooper;
private volatile ServiceHandler mServiceHandler;
private String mName;
private boolean mRedelivery;

这边我们可以看出IntentService中有我们比较熟悉的Looper和ServiceHandler(继承了Handler)到这边我们应该猜测到了,IntentService是不是通过Handler来发送消息并在handleMessage中进行耗时操作的处理的了?我们继续往下看咯~


Paste_Image.png

3.先看Oncreate中的方法:


IntentService源码分析_第2张图片
Paste_Image.png

3.1初始化了一个HandlerThread(该类是个进程类并创建了一个Looper,Looper同时又创建了message queue队列)3.2在给mServiceLooper赋值这样就得到了Looper对象3.3mServiceLooper传给给ServiceHandler覆盖原来默认的消息队列3.4ServiceHandler中的handleMessage回调了onHandleIntent(intent)抽象方法(这边就是我们所需要处理的耗时操作的地方)


IntentService源码分析_第3张图片
Paste_Image.png

IntentService源码分析_第4张图片
Paste_Image.png

*注意了:在handleMessage方法中有个stopSelf(msg.arg1)方法msg.arg1是个int值,相当于一个请求的唯一标识。每发送一个请求,会生成一个唯一的标识,然后调用mActivityManager.stopServiceToken( new ComponentName(this, mClassName), mToken, startId);该方法用来停止Service服务;如果传入的是-1则也会也是一样的,这样就可以回调IntentService中的onDestory方法了。onDestory再释放Looper的资源。

你可能感兴趣的:(IntentService源码分析)