Android 后台任务(五)Service
翻译自:http://blog.stylingandroid.com/archives/833
转载请注明:http://blog.csdn.net/liaoqianchuan00/article/details/23949847
最后我们来看看如何使用Android的services.
Service是Android核心的一个东西,但是经常被滥用,所以我们现在来再次理解下什么是Service,以及我们怎么来很好的使用他。我喜欢这样理解Service,他是一个不需要与Activity相关的处理耗时操作的东西。如果你想要处理一些耗时操作,这些操作和Activity有关联,那么你可以用我们之前讨论的一些方法。Service是一个不会被中断的,或者是独立于Activity单独运行的。
Android市场上又很多Task Killer应用,我相信是两个主要原因造成的:一,很多用户不知道系统会自动释放这些资源,而Task Killer其实做的是一样的事情,只是更强力一点。二,一些开发者用开发桌面或者服务器的方式来实现Android的service,造成内存里面长期存在一个不需要的service。
有两种service:foreground和background。一个background service是默认形式的service,可以被系统或者task killer杀掉。Foreground service不会被系统杀掉,当它运行的时候需要一个持续不断的Notification现实在Notification bar上面,这样用户就知道这个foreground service是在运行着的,并且不会呗系统自动杀掉。
一个明显的使用foreground services的例子就是音乐播放器,当程序关闭的时候依然可以在后台运行,这个service需要被保证不被杀掉。Foreground service很有用,但是开发人员只有当真正需要的时候再使用他们。当决定是否需要使用foreground service的时候,需要问自己:当系统杀掉service的时候用户是否会立即烦恼?关键是“立即“。在音乐播放器的例子里,系统杀掉service,后台就不会播放音乐,用户就不舒服,他们就会尝试去寻找其他的音乐播放软件了。
一些开发者很担心background service被系统或者task killer杀掉。在桌面或者服务器开发中,我们常常会有一个后台进程在闲置的时候进入休眠状态并且定期的做一些事情,然后又进入休眠状态。在移动设备上,我们应该更有效的来利用系统资源,所以我们需要有一个类似于foreground service的方式并且在不需要的时候自动关闭。关闭service可以直接调用stopSelf。Android为我们提供了BroadcastReceiver机制,它允许我们的service被一些特定的intent叫醒。BroadcastReceiver会调用startService来启动service,Service会处理这个intent事件,之后又自动关闭。如果我们的service用这种方式来实现,就不会被过早的杀死了。
一个常见的错误用法是让service一直存在内存中,然后使用Timer或者TimerTask来定期的做一些事情。但是你的Timer可能会和你的Service一起被kill掉,所以你想要定期执行的任务就永远被杀掉了。一个比较好的解决方法就是使用AlarmManager来创建一个alarm,定期的发送intent。pendingIntent会让我们的Intent启动,处理完事情之后又自动关闭。如果使用了重复发生的alarm事件,我们就不必担心service在某个执行期间被杀掉了,因为过一段事件之后service又会呗启动起来。
一个非常有用的Service的子类就是IntentService。他提供了一个类可以接收一个Intent,处理完成之后自动关闭。接下来我们会看看怎么来使用IntentService。