服务是运行在后台的一段代码。它能够运行在它本身的进程,也能够运行在其余应用程序进程的上下文(context)里面,这取决于自身的须要。其它的组件能够绑定到一个服务(Service)上面,经过远程过程调用(RPC)来调用这个方法。例如媒体播放器的服务,当用户退出媒体选择用户界面,仍然但愿音乐依然能够继续播放,这时就是由服务 (service)来保证当用户界面关闭时音乐继续播放的。 android
它跟Activity的级别差很少,可是他不能本身运行,须要经过某一个Activity或者其余Context对象来调用, Context.startService() 和Context.bindService()。
两种启动Service的方式有所不一样。这里要说明一下的是若是你在Service的onCreate或者onStart作一些很耗时间的事情,最好在Service里启动一个线程来完成,由于Service是跑在主线程中,会影响到你的UI操做或者阻塞主线程中的其余事情。
何时须要Service呢?好比播放多媒体的时候用户启动了其余Activity这个时候程序要在后台继续播放,好比检测SD卡上文件的变化,再或者在后台记录你地理信息位置的改变等等。 spa
1.第一种是经过调用Context.startService()启动,调用Context.stopService()结束,startService()能够传递参数给Service。 线程
2.第二种方式是经过调用Context.bindService()启动,调用Context.unbindservice()结束,还能够经过ServiceConnection访问Service。 对象
两者能够混合使用,好比说我能够先startService再bindservice。 接口
startService后,即便调用startService的进程结束了,Service仍然还存在,直到有进程调用stopService,或者Service本身自杀(stopSelf())。bindService后,Service就和调用bindService的进程同生共死了,也就是说当调用bindService的进程死了,那么它bind的Service也要跟着被结束,固然期间也能够调用unbindservice让 Service结束。 生命周期
两种方式混合使用时,好比说你startService了,我bindService了,那么只有你stopService了并且也unbindservice了,这个Service才会被结束。 进程
Android系统将会尝试保留那些启动了的或者是绑定了服务的进程。若是该服务正在进程的onCreate(), onStart(), 或者 onDestroy() 这些方法中执行时, 那么主进程将会成为一个前台进程,以确保此代码不会被中止。若是服务已经开始,那么它的主进程会就重要性而言低于全部可见的进程但高于不可见的进程, 因为只有少数几个进程是用户可见的,因此只要不是内存特别低,该服务不会中止.。若是有多个客户端绑定了服务, 只要客户端中的一个对于用户是可见的,即认为该服务可见。 内存
若是Service尚未运行,则android先调用onCreate()而后调用onStart();若是Service已经运行,则只调用onStart(),因此一个Service的onStart方法可能会重复调用屡次。 it
stopService的时候直接onDestroy,若是是调用者本身直接退出而没有调用stopService的话,Service会一直在后台运行。该Service的调用者再启动起来后能够经过stopService关闭Service。 io
因此调用startService的生命周期为:onCreate --> onStart(可屡次调用) --> onDestroy
使用context.bindService()启动Service会经历:
context.bindService()->onCreate()->onBind()->Service running
onUnbind() -> onDestroy() ->Service stop
onBind将返回给客户端一个IBind接口实例,IBind容许客户端回调服务的方法,好比获得Service运行的状态或其余操做。这个时候把调用者(Context,例如Activity)会和Service绑定在一块儿,Context退出了,Srevice就会调用onUnbind->onDestroy相应退出。
因此调用bindService的生命周期为:onCreate --> onBind(只一次,不可屡次绑定) --> onUnbind --> onDestory。
因此,在Service每一次的开启关闭过程当中,只有onStart可被屡次调用(经过屡次startService调用),其余onCreate,onBind,onUnbind,onDestory在一个生命周期中只能被调用一次。