service

  • 格式:docx
  • 大小:159.28 KB
  • 文档页数:16

Service一、 Service简介Service是android 系统中的四大组件之一(Activity、Service、BroadcastReceiver、ContentProvider),它跟Activity的级别差不多,但不能自己运行只能后台运行,并且可以和其他组件进行交互。

service可以在很多场合的应用中使用,比如播放多媒体的时候用户启动了其他Activity这个时候程序要在后台继续播放,比如检测SD卡上文件的变化,再或者在后台记录你地理信息位置的改变等等,总之服务总是藏在后台的。

二、创建、配置service1、定义一个继承service的类,并实现相应的接口。

2、AndroidManifest.xml中配置该service。

三、Service启动、停止Service的启动有两种方式:context.startService() 和context.bindService()Serviced的停止方式:其他组件:context.stopService(),自己:Service.stopSelf()方法或者Service.stopSelfResult()1、context.startService() 启动流程:context.startService() -> onCreate() -> onStart() -> Servicerunning -> context.stopService() -> onDestroy() -> Service stop如果Service还没有运行,则android先调用onCreate(),然后调用onStart();如果Service已经运行,则只调用onStart(),所以一个Service的onStart方法可能会重复调用多次。

如果stopService的时候会直接onDestroy,如果是调用者自己直接退出而没有调用stopService的话,Service会一直在后台运行,该Service的调用者再启动起来后可以通过stopService关闭Service。

所以调用startService的生命周期为:onCreate --> onStart (可多次调用) --> onDestroy2、context.bindService()启动流程:(绑定本地service)context.bindService() -> onCreate() -> onBind() -> Servicerunning -> onUnbind() -> onDestroy() -> Service stop绑定Service需要三个参数:bindService(intent, conn, Service.BIND_AUTO_CREATE);第一个:Intent对象第二个:ServiceConnection对象,创建该对象要实现它的onServiceConnected()和 onServiceDisconnected()来判断连接成功或者是断开连接第三个:如何创建Service,一般指定绑定的时候自动创建。

onBind()将返回给客户端一个IBind接口实例,IBind允许客户端回调服务的方法,比如得到Service的实例、运行状态或其他操作。

这个时候把调用者(Context,例如Activity)会和Service绑定在一起,Context退出了,Srevice就会调用onUnbind->onDestroy相应退出。

所以调用bindService的生命周期为:onCreate --> onBind(只一次,不可多次绑定) -->onUnbind --> onDestory。

在Service每一次的开启关闭过程中,只有onStart可被多次调用(通过多次startService调用),其他onCreate,onBind,onUnbind,onDestory在一个生命周期中只能被调用一次。

1.先讲讲怎么使用bindService()绑定服务应用组件(客户端)可以调用bindService()绑定到一个service.Android系统之后调用service的onBind()方法,它返回一个用来与service交互的IBinder 绑定是异步的.bindService()会立即返回,它不会返回IBinder给客户端.要接收IBinder,客户端必须创建一个ServiceConnection的实例并传给bindService().ServiceConnection包含一个回调方法,系统调用这个方法来传递要返回的IBinder.注:只有activities,services,和contentproviders可以绑定到一个service—你不能从一个broadcastreceiver绑定到service.所以,从你的客户端绑定到一个service,你必须:∙1实现ServiceConnection.你的实现必须重写两个回调方法:o onServiceConnected()系统调用这个来传送在service的onBind()中返回的IBinder.o OnServiceDisconnected()Android系统在同service的连接意外丢失时调用这个.比如当service崩溃了或被强杀了.当客户端解除绑定时,这个方法不会被调用.∙2调用bindService(),传给它ServiceConnection的实现.∙3当系统调用你的onServiceConnected()方法时,你就可以使用接口定义的方法们开始调用service了.∙4要与service断开连接,调用unbindService().当你的客户端被销毁,它将从service解除绑定,但是你必须总是在你完成与service的交互时或当你的activity暂停于是service在不被使用时可以关闭此两种情况下解除绑定.(下面会讨论更多在适当的时候绑定和解除绑定的问题.使用这个ServiceConnection,客户端可以绑定到一个service,通过把它传给bindService().例如:Intentintent = new Intent(this, LocalService.class);bindService(intent,mConnection, Context.BIND_AUTO_CREATE);∙第一个bindService()的参数是一个明确指定了要绑定的service的Intent.∙第二个参数是ServiceConnection对象.∙第三个参数是一个标志,它表明绑定中的操作.它一般应是BIND_AUTO_CREATE,这样就会在service不存在时创建一个.其它可选的值是BIND_DEBUG_UNBIND和BIND_NOT_FOREGROUND,不想指定时设为0即可.。

补充事项下面是一些关于绑定到service的重要事项:∙你总是需要捕获DeadObjectException异常.它会在连接被打断时抛出.这是被远程方法抛出的唯一异常.∙对象引用计数是跨进程的作用的.∙你应该在客户端的生命期内使绑定和解除绑定配对进行,例如:o如果你需要在你的activity可见时与service交互,你应该在onStart()绑定并在onStop()中解除绑定.o如果你想让你的activity即使在它停止时也能接收回应,那么你可以在onCreate()中绑定并在onDestroy()中解除绑定.注意这意味着你的activity需要使用在自己整个运行期间使用service(即使位于后台),所以如果service在另一个进程中,那么你增加了这个进程的负担而使它变得更容易被系统杀掉.注:你一般不应该在你的activity的onResume()和onPause()中绑定和解除绑定到service,因为这些回调方法,出现在每个生命期变化中,并且你需要使发生在这些变化中的处理最小化.还有,如果你应用中的多个activity绑定到同一个service,并且有一个变化发生在其中两个activity之间,service可能在当前activity解除绑定(pause中)和下一个绑定前(rusume中)被销毁又重建.2.管理(多个客户端)BoundService的生命期当一个service的所有客户端都解除绑定,Android系统就销毁它(除非它是从onStartCommand()启动).如果你的service是一个纯boundservice,你不需管理它的生命期—Android系统会为你管理它.。

然而,如果你选择了实现onStartCommand()回调方法,那么你必须明确地停止service,因为service现在被认为是"开始的".在此情况下,service会一直运行,直到service使用stopSelf()停止它自己或另外的组件调用了stopService()停止了它,不管是否有客户端绑定了它.另外,如果你的service已经启动并且接受绑定,那么当系统调用你的onUnbind()方法,你可以选择返回true表示你想在客户端下一次绑定到service 时接受一个对onRebind()的调用(而不是一个对onBind()的调用).onRebind()返回void,但是客户端依然会在它的onServiceConnected()回调中接收到IBinder.下图演示了这种生命其的逻辑:3。

bindService和startService混合使用时1.如果先bindService,再startService:在bind的Activity退出的时候,Service会执行unBind方法而不执行onDestory 方法,因为有startService方法调用过,所以Activity与Service解除绑定后会有一个与调用者没有关连的Service存在2.如果先bindService,再startService,再调用Context.stopServiceService的onDestory方法不会立刻执行,因为有一个与Service绑定的Activity,但是在Activity退出的时候,会执行onDestory,如果要立刻执行stopService,就得先解除绑定---------------------------把上面的"如果先bindService,再startService"换成"如果先startService,再bindService",结果是一样的问题:如果在一个Activity的onCreate方法中,先bindService(serviceIntent, conn, Context.BIND_AUTO_CREATE);再startService(serviceIntent);退出这个Activity时,会执行onUnBind但是再次进入这个Activity的时候,为什么不执行onBind方法了?只有在这个Service销毁后(执行onDestory),再进这个Activity才会执行onBind,还有就是当有两个客户端时,在第一个客户端startServie启动服务再bindService绑定服务,这时跳到第二个客户端里(启动时会调用onBind()),再客户端startServie启动服务再bindService绑定服务,启动时不会调用用onBind()了(因为之前客户端已经启动后没有onDestory()销毁Service,所以再客户端第二次绑定服务时,只会返回IBinder对象给onServiceConnected()),而且要注意的是当,当第一个服务启动并绑定一个服务时,再跳去第二个服务端启动并绑定这个服务时,第二个服务端再解绑时,不会调用onUnbind(),只有回到第一个客户端时,解绑这是才会调用onUnbind(),顺序反过来结果是一样的。