【问题标题】:Interacting with a Service与服务交互
【发布时间】:2014-12-04 08:15:06
【问题描述】:

在我的应用程序中,服务在应用程序启动时启动,并且在应用程序关闭之前不会停止(我使用 START_STICKY)。目前我有不同的组件需要与服务绑定和取消绑定进行通信。我现在的想法是,当我可以简单地使 Intent 与服务通信时,为什么还要麻烦绑定和解除绑定。

如果服务要持续启动,让我的组件向服务发送意图比绑定更好吗?我看到了代码不太复杂的好处,因为组件将简单地创建 Intent 并调用启动服务

【问题讨论】:

  • 我能想到的唯一使用绑定的情况是当我希望服务和/或活动对另一个有某种依赖,或者发生大量通信时。听起来你不是这种情况,所以我认为 Intents 可以正常工作。
  • 如果我要让我的组件需要对服务中的事件做出反应,那么绑定以将它们添加为侦听器是否是个好主意?我想弄清楚什么时候应该/不应该绑定
  • 您阅读过“绑定服务”文档吗? “本地绑定服务”的案例特别有趣
  • 是的,我就是这样学会绑定组件的
  • 在这种情况下,这取决于您。您可以为您的活动发送广播以侦听和响应,或者您可以绑定到它们并利用绑定来处理与您的活动的服务通信。绑定需要更多设置,但允许更简单的通信,所以我想这是你更喜欢的。

标签: android android-intent service


【解决方案1】:

正如其他人在 cmets 中指出的那样,这完全取决于您和您的需求。使用 binder 方法,您可以与服务建立更直接的连接,这使您可以进行看起来像直接调用的操作(实际上,如果您在同一进程中)。使用Intent 进行通信意味着您的通信机制更多基于消息,您必须处理不同的Intent 有效负载。它还会产生一些额外的开销,因为调用startService()startActivity()sendBroadcast() 最终都会下降到在system_server 中运行的ActivityManagerService。另一种选择是使用Intent 来设置ServiceActivity 之间的连接,并且都使用Messenger 来回发送消息。它类似于纯Intent 机制,但一旦Messenger 对象被交换,ActivityManagerService 就不再参与。

【讨论】:

  • 感谢您的意见,我一定会更多地查看 messenger 和 ActivityManagerService 类,以更好地了解发生了什么
  • 很高兴为您提供帮助。请注意,就ActivityManagerService 的工作原理而言,您不会找到太多关于它的信息。 Context 对象在调用启动/停止服务、启动活动等时与活动管理器服务进行通信以执行您的请求。
【解决方案2】:

是的,在意图中向服务发送数据并在 onStartCommand 或 OnBind 中处理意图是非常直接的方法。问题是服务如何与活动|片段通信。

messenger 服务有一个优势,它可以将每条传出消息的副本发送给绑定到该服务的所有客户端,并且您可以传递与 Intent 中相同的数据包。

http://developer.android.com/guide/components/bound-services.html#Messenger

上面的例子可以修改成与消息一起来回发送数据包。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-12-02
    • 1970-01-01
    • 1970-01-01
    • 2011-07-13
    • 2014-04-25
    • 1970-01-01
    相关资源
    最近更新 更多