如何在服务之间广播消息?
Posted
技术标签:
【中文标题】如何在服务之间广播消息?【英文标题】:How to Broadcast Messages Between Services? 【发布时间】:2018-12-29 18:05:15 【问题描述】:我有一个主要活动和几个活动,它们以一种用户可控的方式从主要活动开始。无论如何,这些活动中的一些仅限于它们自己的服务。这些服务在启动时将一直工作到主要活动销毁为止。我想知道如何在它们之间传输消息而不将它们全部组合在一个服务中或将它们绑定到那里的每个活动?我的意思是,发送全局消息而不是 LocalBroadcast。
【问题讨论】:
(1) 这些服务是具有自己线程的 IntentService 还是仅共享 MainThread? (2) 您的服务是否在各自的线程中阻塞?正确的解决方案取决于您将如何回答这些问题。 它们只是服务而不是 IntentService。该架构采用这种方式,主要活动绑定到所有可用服务(但不启动它们)只是为了在应用程序运行期间维护它们,并且通过关闭它将关闭所有服务。每个活动都会启动自己的服务。当服务启动时,您从活动中出来并前往另一个。但我想将数据从当前活动的服务发送到其他服务。只是主要活动将停止服务而不是子活动。 【参考方案1】:您说您的服务不是 IntentServices,因此它们使用相同的 MainThread 来执行它们的代码。 可能有许多不同的方法可以实现您想要的:
-
在 MainActivity 的变量中保存 Service 实例:Service1 可以安全调用“MainActivity.mService1instance.doJob()”,Service2 可以安全调用“MainActivity.mService2instance.doJob()”或通过在每个变量中创建 STATIC 方法来执行相同的结果服务并直接从服务类调用它们:“Service2.doJob()”
使用Handlers:每个Service都以这种方式创建自己的Handler:mHandler = new Handler()
@Override
public void handleMessage(Message message)
switch (message.what)
case TH_MESSAGE_JOBx:
break;
;
public static boolean postToService(int what, int arg1, int arg2, Object obj)
if (mHandler == null) return false;
Message cMessage = Message.obtain(mHandler, what, arg1, arg2, obj);
return mHandler.sendMessage(cMessage);
然后您可以从所有线程中安全地调用每个服务的“postToService(TH_MESSAGE_JOBx, int, int, object)”方法
这是两种简单的方法。
其他方式(但更复杂)可能是:AIDL (IPC) 和队列。
【讨论】:
太棒了!非常感谢。以上是关于如何在服务之间广播消息?的主要内容,如果未能解决你的问题,请参考以下文章
Laravel (+ Vue.js) 广播 - 如何设置倒计时然后发送广播消息?
如何使用 WCF NetHttpBinding(WebSockets)通过服务器向所有客户端广播(推送)一个客户端发送的消息?