如何在不同进程中建立Activity和Service之间的双向通信?
Posted
技术标签:
【中文标题】如何在不同进程中建立Activity和Service之间的双向通信?【英文标题】:How to establish a two-way communication between Activity and Service in different process? 【发布时间】:2011-01-29 09:07:13 【问题描述】:我正在努力在 Activity 和在不同进程中运行的 Service 之间建立双向通信。
从Activity查询进程没什么大不了的。但我希望进程通知活动事件。它背后的想法是:服务独立于实际应用程序运行。它定期查询网络服务器。如果在网络服务器上发现新任务,该进程应通知该活动。
我在 AndDev.org 上找到了 this thread,但它似乎对我不起作用。我一直在搞乱广播接收器。我已经实现了一个应该通知 Activity 的接口,但问题是侦听器始终为空,因为来自进程的广播是通过 Intent 完成的,因此扩展 BroadcastReceiver 的类将被新实例化。
如何建立双向通信?这必须是可能的。 感谢您的帮助,
结构
【问题讨论】:
您能否详细说明“从 Activity 中查询进程没什么大不了的”> 究竟是如何做到的?你绑定到服务了吗? 【参考方案1】:要么使用BroadcastReceiver
,要么使用Service
调用关键事件的Activity
register a callback or listener object。上面的链接用于预订演示每种技术的示例项目。
【讨论】:
我可以在我的 Activity 中使用 BroadcastReceiver 还是必须创建一个不同的类?我是否必须为意图指定扩展 BroadcastReceiver 的类?BroadcastReceiver
是一个类 -- 一个类不能既是 Activity
又是 BroadcastReceiver
。您可以将Activity
的内部类用于BroadcastReceiver
,如上面链接的示例代码所示。您可以为广播 Intents
使用组件名称,但这需要公共 BroadcastReceiver
类。或者您可以使用自定义操作字符串,如上面链接的示例代码所示。
谢谢,但我不确定广播接收器是否非常适合,因为我想要的是一个尽可能长的运行进程,它独立于实际应用程序。它应该能够像新电子邮件一样在状态栏中显示通知,即使实际应用程序没有运行。所以这意味着我必须通过 startService(intent) 而不是 bindService(intent, connection, flags) 来启动服务,对吧?我一直在尝试理解 ApiDemos 'RemoteServiceClient' 但可悲的是失败了。我越看“例子”就越困惑……
“我想要的是一个尽可能长的运行进程,它独立于实际应用程序”希望你不要这样做,因为那是糟糕的设计。 “它应该能够像新电子邮件一样在状态栏中显示通知,即使实际应用程序没有运行。”通知特别不需要运行。
好吧,我想我只是无法正确表达自己。后台进程应定期(例如每 5 分钟)通过 HttpRequest 查询网络服务器。如果/当它发现一个新任务时,它应该在状态栏中显示一个通知,并通过(引用)新任务通知 GUI(如果 GUI 正在运行)。【参考方案2】:
我认为你应该让BroadcastReceiver
再次开始你的活动,结果在 Intent 中。
或者您可以使用AIDL 来了解 AIDL。这些示例还有一个(多个?)示例如何使用 AIDL 和服务。但是AIDL
对您来说可能会很麻烦。
【讨论】:
...再次开始我的活动?这就是我要避免的... AIDL 确实很麻烦,但似乎是要走的路。我现在正试图从 ApiDemos 中了解 RemoteServiceBinding。艰难的。【参考方案3】:您必须使用BroadcastReceiver
来接收intent,当您想要交流时,只需使用适当的值创建一个Intent。
这样你应该能够在任何组件之间进行双向通信。
【讨论】:
您能详细说明一下这个答案吗?所以你在服务中实现了一个广播接收器,在活动中实现了另一个?并从双方发送意图?另外,我可以使用 LocalBroadcastReceiver 代替 BroadcastReceiver 吗?以上是关于如何在不同进程中建立Activity和Service之间的双向通信?的主要内容,如果未能解决你的问题,请参考以下文章
转Android进程间通信(IPC)机制Binder简要介绍和学习计划