源码Android开发笔记Android知识

Android源码学习笔记2-IntentService源码的学

2016-07-30  本文已影响257人  NKming

为什么要使用IntentService:

IntentService is a base class for {@link Service}s that handle asynchronous* requests (expressed as {@link Intent}s) on demand. Clients send requests* through {@link android.content.Context#startService(Intent)} calls; the* service is started as needed, handles each Intent in turn using a worker* thread, and stops itself when it runs out of work.
�这是摘自IntentService的注释,说明IntentService是一个基于异步请求的抽象类,我们的请求通过startService启动,顾名思义,IntentService会根据传得Intent来在工作线程中处理我们的任务,并且会在任务运行完结束自己。
This "work queue processor" pattern is commonly used to offload tasks* from an application's main thread. The IntentService class exists to* simplify this pattern and take care of the mechanics. To use it, extend* IntentService and implement {@link #onHandleIntent(Intent)}. IntentService* will receive the Intents, launch a worker thread, and stop the service as* appropriate.
并且说明了使用的方法,由此看可以看出其使用的是工作队列处理模式,来减轻主线程的负担,其存在的意义就是简化这个流程,通过实现onHandleIntent这个方法,我们就可以轻松的实现相关的操作。

原理解析:

通过上面的文档,可以看出,能实现消息队列的,在Android系统内部,使用的最多的便是looper+handler机制了,所以,其肯定是包含了这个机制的。

那就来逐步分析


You should not override this method for your IntentService. Instead,* override {@link #onHandleIntent}, which the system calls when the IntentService* receives a start request. public int onStartCommand(Intent intent, int flags, int startId) { onStart(intent, startId); return mRedelivery ? START_REDELIVER_INTENT:START_NOT_STICKY;}
google官方给我们的建议是不要复写这个方法而是去实现onHandleIntent()这个方法,当系统受到请求时就会执行这个onStart方法,这也是我们继承IntentService,执行startService方法而不用复写onStartCommand()方法的原因。说到mRedelivery这个变量,从书面意思就是再发送的意思。
<p>If enabled is true,* {@link #onStartCommand(Intent, int, int)} will return* {@link Service#START_REDELIVER_INTENT}, so if this process dies before* {@link #onHandleIntent(Intent)} returns, the process will be restarted* and the intent redelivered. If multiple Intents have been sent, only* the most recent one is guaranteed to be redelivered.
如果是设置为true,当这个进程在onHandleIntent之前挂掉了,这个进程会重新启动并且重新发送,如果多个intents已发送,只会有一个最近的被重新发送处理。
* <p>If enabled is false (the default),* {@link #onStartCommand(Intent, int, int)} will return* {@link Service#START_NOT_STICKY}, and if the process dies, the Intent* dies along with it.*/
如果是false的话,这个intent会随着进程的结束而结束。
一般来说mRedelivery为false,如果我们需要的话我们可以给这个赋值为true。
那关于为什么返回两个标识符会有不同的结果,我大概猜是和stopself和activitymanager中有关,等以后我读到ActivityManager的源码时再来说吧。

休息下,来自万能的gank.io

继续,下面说最重要的两个方法


至此

我们基本上已经将IntentService扒光了,由此看出,其实其构造真的不复杂,并且原理好像也是很简单。
这么想想,其实我们平时自己写service时,很多代码都是可以封装的,但是我们却没有养成这个习惯,而是等到别人出了个新的框架或者库,其实我们自己就能实现这些库,只是我们懒罢了。
今天听了云大一席话,感悟颇深,至此,我会坚持写这个系列的笔记的,大家共勉!此文有不足之处,敬请指出。

上一篇下一篇

猜你喜欢

热点阅读