我想知道是否有可能使用startService启动一个服务,然后也能够绑定到该服务并执行一些远程过程调用?根据这个:http://developer.android.com/guide/topics/fundamentals.html#servlife
这两个服务有不同的生命周期,所以这是不可能的,有人知道吗?
发布于 2010-08-19 01:18:08
我认为hara的回答有点令人困惑。你所描述的是完全合法的,实际上是获得你想要的行为的唯一途径。如果您通过绑定来创建Service,那么当您解除绑定时,它将会消亡。因此,在不绑定活动的情况下保留它的唯一方法是使用startService()启动它。这与生命周期没有冲突,因为它只适用于服务的启动方式。因此,一旦它从startService()开始,它就会遵循这个生命周期过程。因此,您可以随意绑定和解除绑定到它,并且它只会在您调用stopService()或stopSelf()时终止。
发布于 2017-02-14 15:45:57
可以,您可以启动和绑定(一次或多次)相同的服务。
下面的流程图演示了如何管理服务的生命周期。变量计数器跟踪绑定客户端的数量:

一个很好的例子-音乐应用。来自Building a Media Browser Service官方教程的说明:
当所有客户端解除绑定时,仅绑定(且未启动)的服务将被销毁。如果此时您的UI活动断开连接,则服务将被销毁。如果您还没有播放任何音乐,这不是问题。然而,当播放开始时,用户可能希望即使在切换应用程序之后也能继续收听。当您解除绑定UI以使用其他应用程序时,您不会想要销毁播放器。
因此,您需要通过调用startService()来确保服务在开始播放时启动。无论是否绑定,启动的服务都必须显式停止。这确保了即使控制UI活动解除绑定,您的播放器也可以继续执行操作。
要停止已启动的服务,请调用Context.stopService()或stopSelf()。系统会尽快停止并销毁服务。但是,如果一个或多个客户端仍绑定到该服务,则停止该服务的调用将被延迟,直到其所有客户端解除绑定。
来自Service参考:
服务既可以启动,也可以绑定连接。在这种情况下,只要服务启动,或者存在一个或多个带有Context.BIND_AUTO_CREATE标志的连接,系统就会保持服务运行。一旦这两种情况都不存在,服务的onDestroy()方法就会被调用,服务实际上就会终止。
发布于 2010-08-19 00:44:42
如果使用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()的调用不会被计算在内--这将停止服务,无论它启动了多少次。
请注意,如果已停止的服务仍然具有使用BIND_AUTO_CREATE集绑定到它的ServiceConnection对象,则在删除所有这些绑定之前,它不会被销毁。有关服务生命周期的更多详细信息,请参阅服务文档。
如果您没有停止给定服务的权限,此函数将抛出SecurityException。
我希望这会有帮助..。
https://stackoverflow.com/questions/3514287
复制相似问题