Android服务:绑定还是启动?

26
在什么情况下应该启动Service,什么情况下应该绑定Service?例如 - 用于音乐服务的Android客户端?系统优先级是否有任何差异;是否有任何通用规则;还有其他什么要注意的吗?
1个回答

27

对于那些在启动后将独立运行的服务,如音乐播放器等,应使用startService()。 这些服务会一直运行,直到它们调用stopSelf()或有人调用stopService()

您可以通过发送意图来与运行中的服务进行通信,但大多数情况下,您只需启动该服务并让其自行运行。

当服务和客户端将通过持久连接进行来回通信时,请使用bind()。一个很好的例子是导航服务,它将向客户端传输位置更新。 与意图相比,绑定程序更难编写,但对于此用例确实是正确的选择方式。

关于优先级:当进程的所有活动失去可见性时,如果它承载了使用onStart()启动的服务,则该进程将成为“服务进程”,否则它将成为“后台进程”。 服务进程的优先级高于后台进程。更多详细信息请参见Android开发者网站

如果没有可见活动的服务进程需要更高的优先级(例如真的不应被打断的音乐播放器),则该服务可以调用startForeground()


3
谷歌开发者教程提到绑定"...非常适合音乐应用程序,需要将活动绑定到在后台播放音乐的服务。" 但是你认为这正是应该使用startService的情况。我评论是因为我现在也在犯同样的困惑:是绑定还是启动服务。 - Katedral Pillon
3
谷歌开发者教程糟糕且误导。 - Oliver Dixon
实际上,两种方式都可以。startService()通常是独立运行的服务的最佳选择,而bind()通常是当您的应用程序和服务将进行不断的来回通信时的最佳选择。但是,您可以使用Intent与startService()样式的服务进行来回通信,或者您可以使用bind()启动服务并让其运行。任何你想要的方式都可以。坦白地说,编写绑定器需要很多工作,所以我避免使用它们。您还可以使用ResultReceiver,它是Binder的方便包装器。 - Edward Falk
5
只需要补充一点:你完全可以使用 startService() 启动一个服务,并且同时绑定它。但不要忘记,这并不是必须的。 - Edward Falk

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接