关于BroadCast接收器和服务

时间:2012-11-29 06:57:38

标签: android

该应用程序正在2.3.3中开发

在我的应用程序中,我正在从广播接收器启动服务。该服务调用位置管理器并获取经度和纬度。是否可以从服务中将纬度和经度值发送回广播接收器?

如果是的话?我们怎么做?

如果不是? - >这是我现在的方法...我使用SharedPreferences对象来保存这些值并在BroadCast Receiver中访问它们。这有用吗?

我对此有更多疑问,会在答案后编辑我的问题...... 感谢..

[编辑]回答我的上述问题 - >因此,我们可以将数据从服务发送到广播接收器,尽管这不是一般的好习惯。

2 个答案:

答案 0 :(得分:1)

可以通过从具有位置数据的服务广播新意图将信息传递回广播接收器。您需要为intent创建自定义操作,并让广播接收器注册以处理该操作。使用自定义操作创建和接收意图的内容为here

然而,我认为在几乎所有情况下这都是一个糟糕的方法。通常,广播接收器应该只解析意图并启动意图服务来完成所有工作。如果需要对位置进行某些操作,那么服务应该不是广播接收器。同样重要的是要注意,在onReceive()结束时,广播接收器会立即被销毁,因此您将失去其所有状态。

如果您提供有关拉/长收集任务目的的更多信息,我很乐意回答更多问题或更新我的答案,以便更具体。

[编辑]由于我不能发表评论,我将把我的两分钱加到克里姆的答案中。除非我遗漏了一些巨大的东西(如果我能告诉我Kerim,因为你可以对我发表评论)可能不会按你期望的方式工作。当广播接收器的onReceive()功能完成时,广播接收器将被销毁。您发送的处理程序将继续存在,但广播接收器中的任何数据都不存在,处理程序将无法调用广播接收器的功能。由于处理程序无法访问任何广播接收器的数据或功能,因此您可以完成服务中需要完成的所有操作。

答案 1 :(得分:0)

您可以使用Messenger类来进行跨进程通信。

启动服务时,将Messenger对象作为额外对象传递。然后在完成其工作后进行服务,可以通过调用messenger.send(message);

来发回纬度和经度值

Messenger类在其构造函数中使用Handler对象。通过此Messenger发送的任何Message对象都将显示在Handler中,就好像已直接调用Handler.sendMessage(message)一样。

这是一个很好的教程,详细解释:http://www.vogella.com/articles/AndroidServices/article.html#servicecommunication_handler