服务与活动之间的沟通

时间:2016-02-07 13:20:51

标签: android android-activity android-service

我有一个服务和一个Activity(两个都作为同一个过程的一部分运行)。 根据SO答案,https://stackoverflow.com/a/29101448/1215996。它建议将Activity引用传递给Service,以便服务可以调用Activity对象上的回调。

1)以这种方式沟通是一个好主意。不会有什么不好,因为它泄漏了对Activity的引用,这会在Service保留其引用之前避免使用GC。

2)我还检查过Messenger可以用于来回通信b / w活动和服务。 AFAIK,如果ActivityService在不同的进程中运行,则应使用此方法。当这些机制作为同一过程的一部分运行时,使用这种机制不会成为通信b / w活动和服务的开销吗?

沟通的最佳方式是什么?我的主要目的是在服务中发生某些事件时,从服务到活动提供一些消息。

1 个答案:

答案 0 :(得分:7)

永远不要将Activity引用传递给活动时间长的任何内容。永远。不要泄漏活动参考。

没有"最佳方式"在活动和服务之间进行通信,但有很多选项,您可以选择最适合您用例的选项。

活动通常与"已启动的服务"通过向startService发送意图。这通常比受约束的服务"更受欢迎。因为它的代码更少,更直接。以这种方式启动服务基本上将服务的一些数据打包以便自己处理。您可以将startService视为一种说法,"嘿,服务,为我做这项工作"。因为意图不能包含"泄漏"对象引用,在这方面是安全的。

让服务与活动进行通信:

<强> LocalBroadcastManager

这类似于常规的Android广播机制,除了广播从不离开您的应用程序(因此它们不能被其他应用程序截获)。

活动巴士

Google并没有提供官方活动总线,但如果您只是搜索&#34; Android event bus&#34;那里有很多可供选择的地方。它们提供的功能使它们比LocalBroadcastManager更易于使用,并且还允许您定义的各种数据广播的状态感。您选择哪一个可能取决于所提供的功能或您喜欢的表达方式。

<强> Bound Service

这与Messenger类似,但建立了正式的#34;链接&#34;客户端和服务之间。您可以使用它在相同或不同进程(使用Messenger)之间执行RPC样式调用。请记住,每次活动进出(如方向更改),都必须取消绑定并重新绑定到服务。这种中断可能不利于您的活动逻辑。

可能还有其他选择,但这些是我所知道的最常用的选项。