第七章 后台服务(Service)

参考资料:
《Android应用程序开发》ISBN 9787302283164
参考软件:
Android Studio、Eclipse+ADT、Android SDK、JDK
一、Service简介
android中服务是运行在后台的东西,级别与activity差不多。既然说service是运行在后台的服务,那么它就是不可见的,没有界面的东西。你可以启动一个服务Service来播放音乐,或者记录你地理信息位置的改变,或者启动一个服务来运行并一直监听某种动作。
Service是Android中实现程序后台运行的解决方案,非常适合用于去执行哪些不需要和用户交互而且还要求长期运行的任务。不能运行在一个独立的进程当中,而是依赖与创建服务时所在的应用程序进程。只能在后台运行,并且可以和其他组件进行交互。
Service可以在很多场合使用,比如播放多媒体的时候用户启动了其他Activity,此时要在后台继续播放;比如检测SD卡上文件的变化;比如在后台记录你的地理信息位置的改变等等,总之服务是藏在后台的。
服务不会自动开启线程,我们需要在服务的内部手动创建子线程,并在这里执行具体的任务。
Service和其他组件一样,都是运行在主线程中,因此不能用它来做耗时的请求或者动作。你可以在服务中开一一个线程,在线程中做耗时动作。
□ Service适用于无需用户干预,且规则或长期运行的后台功能
□首先,因为Service没有用户界面,更加有利于降低系统资源的消耗,而且Service比Activity具有更高的优先级,因此在系统资源紧张时,Service不会被Android系统优先终止
□ 即使Service被系统终止,在系统资源恢复后Service也将自动恢复运行状态,因此可以认为Service是在系统中永久运行的组件
Service除了可以实现后台服务功能,还可以用于进程间通信(Inter Process Communication,IPC),解决不同Android应用程序进程之间的调用和通讯问题
二、Service的种类

按运行地点分类:

其实remote服务还是很少见的,并且一般都是系统服务。
按运行类型分类:

前台服务是在做了上述工作之后需要调用 startForeground( android 2.0 及其以后版本 )或 setForeground (android 2.0 以前的版本)使服务成为前台服务。这样做的好处在于,当服务被外部强制终止掉的时候,ONGOING 的 Notification 任然会移除掉。
按使用方式分类:

以上面三种方式启动的服务其生命周期也有区别,将在随后给出。
三、Service生命周期

context.startService() ->onCreate()->onStart()->Service running--调用context.stopService() ->onDestroy()
context.bindService()->onCreate()->onBind()->Servic e running--调用>onUnbind() -> onDestroy()
1. 生命周期常用方法
在Service的生命周期里,常用的有:
· 4个手动调用的方法
手动调用方法
作用
startService()
启动服务
stopService()
关闭服务
bindService()
绑定服务
unbindService()
解绑服务
· 5个内部自动调用的方法
内部自动调用的方法
作用
onCreat()
创建服务
onStartCommand()
开始服务
onDestroy()
销毁服务
onBind()
绑定服务
onUnbind()
解绑服务
2. 生命周期方法具体介绍
主要介绍内部调用方法和外部调用方法的关系。
2.1 startService()
· 作用:启动Service服务
· 手动调用startService()后,自动调用内部方法:onCreate()、onStartCommand()
· 调用逻辑如下:

调用逻辑
2.2 stopService()
· 作用:关闭Service服务
· 手动调用stopService()后,自动调用内部方法:onDestory()
· 调用的逻辑:
·

调用逻辑
2.3 bindService()
· 作用:绑定Service服务
· 手动调用bindService()后,自动调用内部方法:onCreate()、onBind()
· 调用的逻辑:

调用的逻辑
2.4 unbindService()
· 作用:解绑Service服务
· 手动调用unbindService()后,自动调用内部方法:onCreate()、onBind()、onDestory()
· 调用的逻辑:
·

调
调用的逻辑
3. 常见的生命周期使用
3.1 只使用startService启动服务的生命周期

startService启动服务的生命周期
3.2 只使用BindService绑定服务的生命周期

BindService绑定服务的生命周期
3.3 同时使用startService()启动服务、BindService()绑定服务的生命周期

Paste_Image.png
3.4 特别注意
· startService()和stopService()只能开启和关闭Service,无法操作Service;
bindService()和unbindService()可以操作Service
· startService开启的Service,调用者退出后Service仍然存在;
BindService开启的Service,调用者退出后,Service随着调用者销毁。