android服务startService()和bindService()

时间:2010-08-18 16:25:02

标签: android

我想知道是否可以使用以startService启动的服务,然后能够绑定到该服务并执行一些远程过程调用? 根据这个:http://developer.android.com/guide/topics/fundamentals.html#servlife

这两个服务有不同的生命周期,所以不可能,有人知道吗?

3 个答案:

答案 0 :(得分:90)

我认为哈拉的答案有点令人困惑。你所描述的是完全合法的,事实上是获得你想要的行为的唯一方法。如果通过绑定它来创建服务,则在解除绑定时它将会死亡。因此,没有活动绑定到它的唯一方法是使用startService()启动它。与生命周期没有冲突,因为它仅适用于服务的启动方式。所以一旦它从startService()开始,就会遵循生命周期过程。所以你可以随心所欲地绑定和取消绑定它,它只会在你调用stopService()或stopSelf()

时死掉

答案 1 :(得分:13)

是的,您可以启动并绑定(一次或多次)相同的服务。

以下流程图演示了如何管理服务的生命周期。变量计数器跟踪绑定客户端的数量: enter image description here

很好的例子 - 音乐应用。来自Building a Media Browser Service官方教程的解释:

  

只有绑定(并且未启动)的服务才会被销毁   其客户解除绑定。如果您的UI活动此时断开连接,   服务被破坏了。如果你没有玩,这不是问题   任何音乐。但是,当播放开始时,用户可能   期望在切换应用程序后继续收听。你没有   想要在取消绑定UI以与其他人合作时销毁播放器   应用

     

出于这个原因,您需要确保在何时启动该服务   它通过调用startService()开始播放。必须启动服务   明确地停止了,不论它是否受到约束。这可以确保您的   即使控制UI活动,播放器仍继续执行   解除绑定。

     

要停止已启动的服务,请调用Context.stopService()或stopSelf()。   系统会尽快停止并销毁服务。   但是,如果一个或多个客户端仍然绑定到该服务,则   停止服务的呼叫被推迟,直到所有客户解除绑定。

来自Service参考:

  

服务既可以启动也可以   连接到它的连接。在这样的   情况下,系统将保留服务   只要它运行,它就会运行   开始或有一个或多个   与它的连接   Context.BIND_AUTO_CREATE标志。一旦   这些情况都不成立   调用service的onDestroy()方法   而服务是有效的   终止。

答案 2 :(得分:9)

如果使用startService()启动服务,则应使用stopService()停止服务。

  

系统可以运行服务有两个原因。如果有人调用Context.startService(),那么系统将检索服务(创建它并在需要时调用其onCreate()方法),然后使用客户端提供的参数调用其onStartCommand(Intent,int,int)方法。此服务将在此时继续运行,直到调用Context.stopService()或stopSelf()。请注意,对Context.startService()的多次调用不会嵌套(尽管它们会导致多次对onStartCommand()的相应调用),因此无论启动多少次,一旦Context.stopService()或stopSelf将停止服务() 叫做;但是,服务可以使用其stopSelf(int)方法来确保在处理完启动意图之前不会停止服务。

您可以使用bindService()将所需数量的ServiceConnection绑定到服务,但要注意传递给它的标志。如果你传递0然后如果你调用stopService(),服务将停止(我不知道你的ServiceConnection会发生什么)。否则,如果您希望服务保持活动状态,直到将ServiceConnection绑定到它,则使用BIND_AUTO_CREATE

这是来自stopService():

  

请求停止给定的应用程序服务。如果服务没有运行,则没有任何反应。否则它会停止。请注意,不计算对startService()的调用 - 无论启动多少次都会停止服务。

     

请注意,如果停止的服务仍然具有绑定到它的ServiceConnection对象并且设置了BIND_AUTO_CREATE,则在删除所有这些绑定之前不会销毁它。有关服务生命周期的更多详细信息,请参阅服务文档。

     

如果您没有权限停止给定服务,则此函数将抛出SecurityException。

我希望这会有所帮助..