Sum*_*han 1 android android-service android-activity
我有一个服务和一个Activity
(作为同一过程的一部分运行).根据SO答案,/sf/answers/2037101391/.它建议传递一个Activity
引用,Service
以便服务可以调用该Activity
对象的回调.
1)以这种方式沟通是一个好主意.这不会是坏事,因为它正在泄漏对Activity的引用,这将避免GC直到Service
保留其引用.
2)我还检查了Messenger
可用于来回通信的活动和服务.据我所知,这意味着要使用的,如果Activity
和Service
在不同的进程中运行.当它们作为同一过程的一部分运行时,使用这种机制不会成为通信b/w活动和服务的开销吗?
沟通的最佳方式是什么?我的主要目的是在服务中发生某些事件时,从服务到活动提供一些消息.
永远不要将Activity引用传递给活动时间长于活动的任何内容.永远.不要泄漏活动参考.
在活动和服务之间没有"最佳方式"进行通信,但有很多选项,您可以选择最适合您的用例的选项.
活动通常通过向startService发送Intent来与"已启动的服务"通信.这通常比"绑定服务"更受欢迎,因为它代码更少,更直接.以这种方式启动服务基本上将服务的一些数据打包为自己处理.您可以将startService视为"嘿,服务,为我工作".由于Intent不能包含"可泄漏"的对象引用,因此在这方面是安全的.
要使服务与活动进行通信:
这类似于常规的Android广播机制,除了广播从不离开您的应用程序(因此它们不能被其他应用程序截获).
活动巴士
Google不提供官方活动总线,但如果您只是搜索" Android事件总线 " ,那里有很多选择.它们提供的功能使它们比LocalBroadcastManager更易于使用,并且还允许您定义的各种数据广播的状态感.您选择哪一个可能取决于所提供的功能或您喜欢的表达方式.
这类似于Messenger,但在客户端和服务之间建立了正式的"链接".您可以使用它在相同或不同进程(使用Messenger)之间执行RPC样式调用.请记住,每次活动进出(如方向更改),都必须取消绑定并重新绑定到服务.这种中断可能不利于您的活动逻辑.
可能还有其他选择,但这些是我所知道的最常用的选项.