我想知道是否可以使用以startService启动的服务,然后能够绑定到该服务并执行一些远程过程调用? 根据这个:http://developer.android.com/guide/topics/fundamentals.html#servlife
这两个服务有不同的生命周期,所以不可能,有人知道吗?
答案 0 :(得分:90)
我认为哈拉的答案有点令人困惑。你所描述的是完全合法的,事实上是获得你想要的行为的唯一方法。如果通过绑定它来创建服务,则在解除绑定时它将会死亡。因此,没有活动绑定到它的唯一方法是使用startService()启动它。与生命周期没有冲突,因为它仅适用于服务的启动方式。所以一旦它从startService()开始,就会遵循生命周期过程。所以你可以随心所欲地绑定和取消绑定它,它只会在你调用stopService()或stopSelf()
时死掉答案 1 :(得分:13)
是的,您可以启动并绑定(一次或多次)相同的服务。
以下流程图演示了如何管理服务的生命周期。变量计数器跟踪绑定客户端的数量:
很好的例子 - 音乐应用。来自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。
我希望这会有所帮助..