【问题标题】:When is it smart to use bindService and startService什么时候使用 bindService 和 startService 比较聪明
【发布时间】:2022-04-22 18:07:14
【问题描述】:

我想知道什么时候用bindService比较聪明,什么时候用startService

例如:

如果我使用bindServiceBIND_AUTO_CREATE,服务将自动启动和创建,如下所示:http://developer.android.com/reference/android/content/Context.html#BIND_AUTO_CREATE

什么时候使用 bindServicestartService 是明智之举?这两个我真的理解不正确。

【问题讨论】:

标签: android


【解决方案1】:

如果您的调用组件 (Activity) 需要通过 ServiceConnection 与您正在启动的 Service 通信,您通常使用 bindService()。如果您不想与Service 通信,您可以只使用startService()。您可以在下面看到服务和绑定服务之间的差异。

来自文档:

开始

当应用程序组件(例如活动)通过调用 startService() 启动服务时,服务被“启动”。一旦启动,服务可以无限期地在后台运行,即使启动它的组件被破坏。通常,已启动的服务执行单个操作并且不会向调用者返回结果。例如,它可能通过网络下载或上传文件。操作完成后,服务应自行停止。

绑定

当应用程序组件通过调用 bindService() 绑定到服务时,服务被“绑定”。绑定服务提供了一个客户端-服务器接口,允许组件与服务交互、发送请求、获取结果,甚至通过进程间通信 (IPC) 跨进程执行此操作。绑定服务仅在另一个应用程序组件绑定到它时运行。多个组件可以一次绑定到服务,但是当所有组件解除绑定时,服务将被销毁。

您可以在这里阅读更多内容:Android ServicesBound Services

【讨论】:

  • 我发现用联想来思考更容易。绑定服务只有在存在任何关联/客户端/活动时才可用,因此在媒体播放器中是有意义的,如果它的 UI 被破坏,我们也应该关闭播放器服务。即使它的关联被破坏,startedservice 也会继续运行,因此在打印机服务中是有意义的,在应用程序中触发打印并且可以退出,而打印机服务将完成其工作。
【解决方案2】:

我同意@Ovidiu Latcu 的观点,但有一个重要说明: 使用绑定服务时,服务会在启动它的活动结束时结束(如果它是唯一绑定到该服务的活动)。

因此,如果您想在应用处于后台时在后台运行服务, (例如,活动暂停并且用户不可见)然后您必须启动服务而不绑定它并与它进行通信 BroadcastReceiver 例如。

【讨论】:

  • 您也可以启动服务并稍后绑定到它 - 这样它会一直运行直到调用停止。
  • 我会考虑从仅以startService() 开始的服务中获取结果(使用BroadcastReceiver 或任何其他替代方法),并且他和客户之间没有绑定,因为不好实践 因为,正如 Ovidiu Latcu 所引用的,与 bound 服务,它提供客户端-服务器接口,允许组件与服务交互、发送请求、接收结果...。
  • 当我想接收来自非服务组件的结果时,我只会使用BroadcastReceiver(或任何其他替代方法)(例如DownloadManagerBluetoothManager ,或广播结果的任何其他“非服务”类)。 Android 开发者实现服务绑定的概念是有原因的。
  • 这个答案是不正确的,因为正如谷歌文档中描述的那样,startService() 告诉系统在后台做某事。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-10-31
  • 2011-02-21
  • 2015-02-11
  • 2021-07-14
  • 2013-11-08
  • 1970-01-01
相关资源
最近更新 更多