概述
Service是一种组件,他可以长时间在后台运行,并且没有用户界面。其他的组件可以启动service,即使用户切换到了其他的应用,service也会在后台继续运行。其他组件可以绑定到一个service与它进行交互以及进程间通信。举个例子,一个service可以处理网络传输、播放音乐、处理文件I/O
或者与content provide进行交互,所有都是在后台进行。
一个service本质上有两种形式:
一、启动模式
一个应用组件通过调用startService()启动了一个service,这个service就处于started状态。一旦service被启动了,他就立刻在后台运行了,即使启动它的应用组件已经被销毁。通常,一个启动的service用来处理一个单独的操作,不返回结果给它的调用者。举例来说,上传或下载文件。当操作完成以后,service会自己停止。
二、绑定模式
一个应用组件通过调用bindService()绑定一个service,这个service就处于bound状态。一个绑定的service提供client-server模式接口,它允许组件与service交互,发送请求、获得结果、跨进程间通信。一个绑定的service只有在被其他组件绑定时才会运行,一旦所有的绑定者都解除绑定,service就会销毁。
尽管service有两种工作模式,但是我们依然可以使我们的service同时工作在两种模式下。
不管我们的service工作在started模式还是bound模式,或者是两者兼有,任何应用组件都可以使用它,即使其他应用程序的组件也可以使用它,就像是我们可以通过Intent调用其他应用程序的Activity一样。如果我们不想被其他的应用使用,只想在自己的应用中使用service,我们可以在manifest.xml文件中把service声明为私有。
创建Service基础
创建一个服务,你必须创建一个Service的子类。根据你的需要覆盖一些方法。你需要覆盖的最重要的回调函数如下:
onStartCommand()
当其他组件(例如activity)调用startService()函数来启动service时,系统会调用此函数。一旦这个方法被执行,service就会被立刻启动,并且在后台运行。如果你实现它,你就必须在服务任务完成以后,负责停止(调用stopSelf() or stopService() )该service。
onBind()
当一个组件通过调用bindService()函数来绑定服务的时候,系统会调用onBind()函数。在这个函数中,你需要返回一个IBinder,作为与客户交互的接口。如果你禁止绑定,返回null就好了。
onCreate()
当service第一次创建的时候,系统会调用onCreate()。系统保证此函数会在onStartCommand()和onBind()之前被调用。如果service已经处于运行状态,该函数就不会再次被调用了。
onDestroy()
如果service不在被使用并且正在被销毁,系统会调用此函数。你的服务需要覆盖此方法来清理资源,例如:线程、注册的监听器、接受器等等。
一个服务从启动之后就一直处于运行状态,直到自己调用stopSelf()或者其他组件调用stopService()。
一个服务一旦被绑定,服务就会运行,直到所有的绑定者都解除绑定,系统会销毁该服务。
当内存比较低系统需要回收资源用於用户关注的activity时,系统会强制停止低优先级的服务。如果一个服务绑定到用户正在关注的Activity,那么它被系统扇死的可能性比较小,如果一个服务被声明运行在前台,那么它基本上不会被杀掉。换句话说,如果服务被启动了并且运行了很长时间,系统将会调整它在后台超时任务列表中的位置,该服务将会有很大的几率被杀死。一旦你的服务被启动,你就需要为被系统重启服务设计一个优雅的处理方法。如果系统杀掉你的服务,它会在系统资源可用的情况下重新启动你的服务(这也依赖于你在onStartCommand()函数中的返回值)。
同Activity一样,需要在manifest.xml文件中添加service声明。
<manifest ... >
...
<application ... >
<service android:name=".ExampleService" />
...
</application>
</manifest>
如果你的服务不想被其他应用程序使用,只需要在manifest.xml文件中service节点中添加属性android:exported="false"。
参考: http://developer.android.com/guide/components/services.html#Basics
转载请注明出处: Android服务(Service)概述 http://blog.csdn.net/oracleot/article/details/18797723