服务基本上是在后台默默运行的额,但是由于服务的系统优先级比较低,当出现内存不够的时候,系统可能会回收掉正在后台运行的程序。如果希望服务一直保持着运行状态而不是因为内存不够而被系统回收,那么可以考虑使用一个前台服务。前台服务有些类似于通知。有时我们为了防止服务被回收而使用前台服务,但有些项目由于特殊的需求必须使用前台服务,比如说彩云天气,它的服务在后台更新天气数据的同时,还会在系统状态栏一直显示当前的天气信息。

        前台服务和普通服务都是同样的Service的创建方法,它们内部的方法都是一样的,唯一的区别在于前台服务会在onCreate方法里面创建通知,并使用startForeground将通知显示,当然并没有使用NotificationManager,因为这里使用startForeground更适合。      而会自动停止的Intent Service则少有所不同,特别是它独有的onHandleIntent方法。

一。创建前台服务的时候传入的图片资源需要注意,

Android实现开启前台Service android 前台service_前台服务

死在这上面了,事实上这个调用不到对应的图片。必须要有明确的png图片。

Android实现开启前台Service android 前台service_后台运行_02

活动中启动service和启动正常service的程序相同。而在MyService类中,在onCreate中的改动如下:

Android实现开启前台Service android 前台service_前台服务_03

二。接下来就是Intent Service这个会自动停止的异类啦,其实Intent Service只是比正常的Service多出了个自动开启子线程,以及会自动停止这样的优势。

当没有Intent Service的时候,在服务中处理一个耗时逻辑需要开启一个线程,再加上为了防止它一直处于运行状态,(忘了stopService),还需要加个stopSelf方法让他自动停止。也就是如下所示:

Android实现开启前台Service android 前台service_后台运行_04

Android实现开启前台Service android 前台service_后台运行_05

(可以试试加个延时,如左图)

鉴于此种麻烦,Android专门提供了这样一个类来解决前面的两种尴尬(忘开线程和忘记调用stop Service或stopself):

Intent Service类:

Android实现开启前台Service android 前台service_前台服务_06

IntentService对比于普通Service的一大优势是,在onHandleIntent中处理信息不用担心ANR问题,因为该方法在子线程之中运行。子线程!!!

Android实现开启前台Service android 前台service_前台服务_07

自动开启线程和自动停止服务的证明!  啊啊啊啊啊啊啊,一个很重要的问题,因为是自己写的一个类继承了Intent Service而不是通过AS创建的,所以千万别忘了要在AndroidManifest中注册啊!!!没有注册的都是非法的纸老虎,会被人民碾碎的。