四大组件之Service 第5节 Service的线程和工作线程

更新时间 修改意见
2016-08-02 陈敏

第5节 Service的线程和工作线程

刚开始使用Service的时候,常常会有一个误区:认为这个Service运行于应用中一个单独的线程。其实Service组件和其他组件一样,都是运行于这个应用的主线程当中的,它们都运行于同一个单一的线程。

可以把Service简单的理解成一个没有界面显示的Activity(这个比喻其实并不准确,因为Service可以直接调用WindowManager实现界面展示,不过这里暂时就这样理解吧)。

5.1 Service的工作线程

如果需要Service进行一个需要持续的、耗时的任务,还是需要给它开启一个工作线程。

既然Service进行耗时工作也要开启的单独的线程,那么为什么不让Activity代替Service的工作呢?例如从网络下载一个文件,可以让应用对应的Activity开启一个下载线程单独进行下载工作。即使用户在下载的时候想使用其他应用也没有关系,点击HOME按钮就可以了。下载文件的那个Activity会自动隐藏起来,根本不会影响到其他应用的使用。

这看上去也是可以的,不过千万不能忽略了安卓系统的回收机制。假如系统资源需要回收,操作系统有可能把隐藏起来的Activity给回收了,所以将一个需要长期运行的任务与随时可能被清除的Activity关联在一起是很危险的。因此安卓系统引入了Service组件来处理这种情况。

正在运行的Service组件被系统回收的可能性与隐藏起来的Activity相比,会低很多。它能保证长期运行的任务能够始终运行着。

但要注意的是,这里并不是说不要在Activity当中创建工作线程。在Activity当中创建工作线程,进行短时间的耗时工作(例如,访问网络读取一条数据,然后显示到界面上)是完全没有问题的。

5.2 IntentService

很多时候,启动一个Service就是要它完成一个复杂而耗时的任务,完成之后,这个Service就可以退出了。

例如文件下载。Activity界面启动负责下载的ServiceService安静的下载,下载完成了,就可以自己退出。下载的过程中,Activity可以继续显示下载的进度,也可以不用关心当前的状态而完全退出。

Android SDK为开发者准备好了这样一个现成的ServiceIntentService

IntentServiceService的子类,就是为了上面的那种使用场景而设计的。Android SDK对Service类进行了进一步的封装和扩展,方便开发者直接使用,而不需要重新造轮子了。

使用IntentService

  1. 继承IntentService,实现它的onHandlerIntent()函数。onHandlerIntent()是在工作线程中被调用的,所以可以在它当中添加耗时的任务处理,

  2. AndroidManifest.xml文件中,声明这个Service

使用它的时候,直接启动Service就可以了。

使用IntentService有几个需要注意的地方,

  1. 任务通过Intent发布,如果需要使用参数,参数可以通过Intent传递;
  2. 一旦任务执行完成,Service就退出了;
  3. 可以处理多个Intent请求,但是会按照请求的先来后到挨个处理,一个接一个完成后,如果没有任务了,Service就退出;

/**************************************************************************/
* 版权声明
* 本教程只在CSDN安豆网发布,其他网站出现本教程均属侵权。
/
**************************************************************************/