什么是Service

来源:互联网 发布:mac redis命令大全 编辑:程序博客网 时间:2024/05/22 11:35
Service是一个专门在后台处理长时间任务的Android组件,它没有UI。
但是在很多场合的应用中使用,比如播放多媒体的时候用户启动了其他Activity这个时候程序要在后台继续播放,比如检测SD卡上文件的变化,再或者在后台记录你地理信息位置的改变等等,总之服务嘛,总是藏在后头的。
Service的onCreate是在主线程(ActivityThread)中调用的,耗时操作会阻塞UI,会导致程序崩溃,一般会运行在子线程中,但是有个例外,IntentServie,这个Service只启动一次,而且执行的onHandlerIntent方法是在一个独立的线程中执行,执行完毕后,这个Service就会被销毁            
Service 它有两种启动方式,startService和bindService。
当然 服务不能自己运行,需要通过调用Context.startService()或Context.bindService()方法启动服务
startService只是启动Service,启动它的组件(如Activity)和Service并没有关联,只有当Service调用stopSelf或者其他组件调用stopService服务才会终止。
  在服务未被创建时,系统会先调用服务的onCreate()方法,接着调用onStart()方法。 如果调用startService()方法前服务已经被创建,多次调用startService()方法并不会导致多次创建服务,但会导致多次调用onStart()方法。 如果要停止只能调用Context.stopService()方法结束服务,服务结束时会调用onDestroy()方法。

bindService方法启动Service,其他组件可以通过回调获取Service的代理对象和Service交互,而这两方也进行了绑定,当启动方销毁时,Service也会自动进行unBind操作,当发现所有绑定都进行了unBind时才会销毁Service。简单的说就是不求同时生,必须同时死,onBind()只有采用Context.bindService()方法启动服务时才会回调该方法。当调用者与服务已经绑定,多次调用Context.bindService()方法并不会导致该方法被多次调用。采用Context.bindService()方法启动服务时只能调用onUnbind()方法解除调用者与服务解除,服务结束时会调用onDestroy()方法。

要注意的是 当系统内存低时,系统将强制停止Service的运行;若Service绑定了正在与用户交互的activity,那么该Service将不大可能被系统kill,如果创建的是前台Service,那么该Service几乎不会被kill(almost never be killed)。否则,当创建了一个长时间在后台运行的Service后,系统会降低该Service在后台任务栈中的级别——这意味着它容易被kill,所以在开发Service时,需要使Service变得容易被restart,因为一旦Service被kill,再restart它需要其资源可用时才行

Service的生命周期

完整生命周期( entire lifetime ):从onCreate()被调用到onDestroy()返回。与Activity类似,一般在onCreate()中做一些初始化工作,而在onDestroy()做一些资源释放工作。如,若Service在后台播放一个音乐,就需要在onCreate()方法中开启一个线程启动音乐,并在onDestroy()中结束线程。-

无论是startService() 还是 bindService()启动Service,onCreate() 和 onDestroy()均会被回调。

活动生命周期(active lifetime):从onStartCommand() 或 onBind()回调开始。由相应的startService() 或 bindService()调用。 
若是Start Service,那么Service的活动生命周期结束就意味着其完整生命周期结束 (the active lifetime ends the same time that the entire lifetime ends),即便
onStartCommand()返回后,Service仍处于活动状态;若是bound Service,那么当onUnbind()返回时,Service的活动生命周期结束。 
!请注意:针对Start Service,由于Service中没有类似onStop()的回调,所以在调用stopSelf() 或 stopService()后,只有onDestroy()被回调标志着Service已停止。

举例
本地服务 Local Service 用于应用程序内部。

  它可以启动并运行,直至有人停止了它或它自己停止。在这种方式下,它以调用Context.startService()启动,而以调用Context.stopService()结束。它可以调用Service.stopSelf() 或 Service.stopSelfResult()来自己停止。不论调用了多少次startService()方法,你只需要调用一次stopService()来停止服务。

  用于实现应用程序自己的一些耗时任务,比如查询升级信息,并不占用应用程序比如Activity所属线程,而是单开线程后台执行,这样用户体验比较好。

远程服务 Remote Service 用于android系统内部的应用程序之间。

  它可以通过自己定义并暴露出来的接口进行程序操作。客户端建立一个到服务对象的连接,并通过那个连接来调用服务。连接以调用Context.bindService()方法建立,以调用 Context.unbindService()关闭。多个客户端可以绑定至同一个服务。如果服务此时还没有加载,bindService()会先加载它。

  可被其他应用程序复用,比如天气预报服务,其他应用程序不需要再写这样的服务,调用已有的即可。
0 0
原创粉丝点击