分类: Android平台
2014-12-01 18:53:06
继承Service这个抽象类,并在实现类中,需要重写一些回调方法,用于处理Service的生命周期各部分的操作。
通过服务的启动方式与适用范围,可将服务分为两类服务:
l start:启动服务,当一个Android组件(如一个Activity)调用startService()的时候,启动一个服务。服务一旦启动,就可以一直在后台运行下去,即使这个启动它的组件被摧毁。这样的服务模式,通常用于执行一个操作而不需要返回结果给调用者。使用startService()方法启动的服务,在服务的外部,必须使用stopService()方法停止,在服务的内部可以调用stopSelf()方法停止当前服务。一旦使用startService()或者stopSelf()方法请求停止服务,系统会就会尽快销毁这个服务。
l Bound:绑定服务,当一个Android组件(如一个Activity)调用bindService()。一个绑定服务提供了一个客户端到服务端的接口,允许组件与服务之间进行交互,这样可以实现跨进程的通信。绑定服务的生命周期默认是跟随它的绑定组件的,但是一个绑定服务可以绑定多个Android组件,如果这些Android组件都被销毁,那么这个绑定服务也将被销毁。bindService()第二个参数是一个ServiceConnection对象,该对象用于监听访问者与Service对象的onServiceConnected()方法。绑定一个服务于宿主交互,依托于一个ServiceConnection接口,这个接口对象必须声明在主线程中,实现onServiceConnection()方法,绑定服务的时候被回调,在这个方法获取绑定Service传递过来的IBinder对象,通过这个IBinder对象,实现宿主和Service的交互。在使用绑定的服务的时候,该Service类必须提供一个IBinder onBind(Intent intent)方法,在绑定本地Service的情况下,onBind()方法说返回的IBinder对象会传给宿主的ServiceConnection.onServiceConnected()方法的service参数,这样宿主就可以通过IBinder对象与Service进行通信。实际开发中一般会继承Binder类(IBinder的实现类)的方式实现自己的IBinder对象。使用broadcast也可以与正在运行的服务进行交互,但缺点是如果数据交互频繁,容易造成性能上的问题,并且BroadcastReceiver本身执行代码的时间不确定。(使用broadcast也可以与正在运行的服务进行交互,但缺点是如果数据交互频繁,容易造成性能上的问题,并且BroadcastReceiver本身执行代码的时间不确定。)
注:一个服务,可以包含上面两种运行方式的服务,只是与它重载的方法有关,如果重写了onStartCommand()即支持启动服务,如果重写onBiind()即支持绑定服务,所以如果同时重载实现这两个方法即可实现两种服务。
Service必须在 AndroidManifest清单文件中进行配置,否则系统将找不到这个服务,在节点下,使用配置,其中android:name属性为Service类。如果开发的服务需要被外部应用操作,还需要配置节点,但是如果仅本程序使用,则无需配置它也可以。如果这个服务强制仅本应用操作,可以配置节点的android:exported属性为false,这样即使配置了,外部应用也无法操作这个服务,默认为true。
Service的开发步骤:
1. 新建一个服务类,需要继承Service或者IntentService。
2. 在AndroidManifest清单文件中注册Service组件。
3. 在一个Android组件中启动这个开发的Service组件。
4. 服务使用完成之后,需要停止这个服务。
Service两种情况下的生命周期:
Android系统仅会为一个Service创建一个实例,所以不管是使用启动服务或是绑定服务,都操作的是同一个Service实例。(绑定服务->启动服务)。对于一个既使用startService()启动又使用bindService()绑定的服务,除非这个服务的两条生命周期均完结,否则不会被销毁。也就是说,在不考虑系统在资源不足的时候,主动回收资源销毁服务的情况下,使用startService()启动的服务,必须使用stopService()或是服务本身的stopSelf()停止服务,使用bindService()绑定的服务,必须使用unbindService()或是销毁宿主来解除绑定,否则服务一直运行。