android服务startService()和bindService()
我想知道是否有可能有一个服务启动startService,然后也能够绑定到该服务,并做一些远程过程调用? 根据这个: http : //developer.android.com/guide/topics/fundamentals.html#servlife
这两个服务有不同的生命周期,所以这是不可能的,有人知道吗?
我认为哈拉的回答有点混乱。 你所描述的是完全合法的,实际上是获得你想要的行为的唯一方法。 如果你通过绑定来创build一个服务,当你解除绑定时,它将会死亡。 所以保持它没有活动绑定的唯一方法是用startService()来启动它。 与生命周期没有冲突,因为它仅适用于服务如何启动。 所以一旦它启动startService(),它就是生命周期过程。 所以你可以自由的绑定和解除绑定,只要你调用stopService()或stopSelf()
如果使用startService()启动服务,那么应该使用stopService()来停止它。
系统可以运行服务有两个原因。 如果有人调用Context.startService(),那么系统将检索服务(如果需要,创build它并调用其onCreate()方法),然后使用客户端提供的参数调用onStartCommand(Intent,int,int)方法。 此时服务将继续运行,直到调用Context.stopService()或stopSelf()。 请注意,对Context.startService()的多次调用不会嵌套(虽然它们会导致对onStartCommand())进行多次相应的调用),所以无论启动多less次,服务都将停止一次Context.stopService()或stopSelf () 叫做; 然而,服务可以使用他们的stopSelf(int)方法来确保服务不会停止,直到开始的意图已经被处理。
您可以使用bindService()绑定到尽可能多的ServiceConnection服务,但要注意传递给它的标志。 如果你传递0,那么如果你调用stopService()服务将停止(我不知道你会发生什么ServiceConnection)。 否则,如果你希望你的服务直到ServiceConnection绑定到它然后使用BIND_AUTO_CREATE 。
这是从stopService():
请求停止给定的应用程序服务。 如果服务没有运行,则什么都不会发生。 否则停止。 请注意,对startService()的调用不计入 – 无论启动多less次,都会停止服务。
请注意,如果停止的服务仍然使用BIND_AUTO_CREATE集绑定了ServiceConnection对象,则在所有这些绑定都被删除之前,它将不会被销毁。 有关服务生命周期的更多详细信息,请参阅服务文档。
如果您没有停止给定服务的权限,则此函数将引发SecurityException。
我希望这有帮助..
是的,您可以启动并绑定(一次或多次)相同的服务。
以下stream程图演示了如何pipe理服务的生命周期。 variables计数器跟踪绑定客户端的数量:
好的例子 – 音乐应用程序。 从构build媒体浏览器服务官方教程解释:
当所有客户端解除绑定时,只绑定(而不是开始)的服务被销毁。 如果您的UI活动此时断开连接,则该服务将被销毁。 如果你还没有播放任何音乐,这不是一个问题。 但是,当开始播放时,用户可能希望即使在切换应用程序之后也能继续收听。 当您解除绑定UI以与另一个应用程序一起工作时,您不想销毁播放器。
出于这个原因,您需要确保服务在开始播放时通过调用startService()来启动。 启动的服务必须明确停止,不pipe是否绑定。 这可确保即使控制UI活动解除绑定,您的播放器也能继续执行。
要停止启动的服务,请调用Context.stopService()或stopSelf()。 系统尽快停止并销毁服务。 但是,如果一个或多个客户端仍然绑定到该服务,则停止服务的呼叫将被延迟,直到其所有客户端解除绑定。
从服务 ref:
服务既可以启动,也可以绑定连接。 在这种情况下,只要服务启动,或者与Context.BIND_AUTO_CREATE标志有一个或多个连接,系统就会保持服务运行。 一旦这两种情况都不存在,就会调用服务的onDestroy()方法,服务被有效终止。