如何从已经运行的服务中获取数据?

时间:2011-05-21 19:54:49

标签: android

我有一个应用程序启动后运行的服务,我想知道如何在不必重新启动服务的情况下随时从该服务获取数据到活动

5 个答案:

答案 0 :(得分:5)

没有冒犯,但“信使”和“绑定”的方式让我忙了大约2天才弄明白。不是说这是错的,但它对我来说过于复杂。

在我看来,服务更容易广播数据,以便Activity可以在可用时访问数据。 在这个链接上做教程: http://www.websmithing.com/2011/02/01/how-to-update-the-ui-in-an-android-activity-using-data-from-a-background-service/comment-page-1/#comment-734

(花了我10分钟来弄清楚并实施......优秀教程)

答案 1 :(得分:4)

如果服务已在运行,则调用startService()不会“重启服务”。它只是发送一个命令,由onStartCommand()中的服务接收。因此,您可以发送触发服务的命令,代表活动执行某些操作,这可能涉及从服务返回活动的通信(例如,通过Messenger)。

或者,正如@Tom Dignan指出的那样,您可以绑定到该服务。在处理配置更改时要小心一些,例如当用户旋转屏幕时。

答案 2 :(得分:1)

为此,您绑定服务。可以在Android文档中找到大量信息:http://developer.android.com/guide/topics/fundamentals/bound-services.html

答案 3 :(得分:1)

现在(2013年底)有更好的解决方案来获取Android中正在运行的服务的引用,只需使用OttoEventBus等库。

在您的活动和服务中添加eventbus,双方都实施onEvent()方法,创建一个或两个xyzEvent类(xyz =您的活动名称),注册活动和事件总线中的服务引用('this')。

通过事件总线上的活动向服务发布活动,使用onEvent服务方法捕获该活动,将新活动发回活动,并使用onEvent方法将其捕获您的活动:现在您已在活动中提供服务参考(服务的this)。

所有设置和完成没有任何大惊小怪。活动和服务相当分离,易于实施。没什么特别的。没有直接约束,没有信使,没有AIDL。只是老式的K.I.S.S.原理

现在,您可以在活动中引用您的服务,并可以调用服务中提供的任何直接方法。

答案 4 :(得分:1)

要将正在运行的服务中的数据提供给活动(例如,单击按钮时),您应该使用Bounded Service,绑定到服务,获取对它的引用并调用公共方法。查看更多herehere

要将数据从服务发送到活动,您可以使用线程或广播意图和广播接收器来使用处理程序/ Messenger。