【问题标题】:Regarding BroadCast Receiver and Service关于广播接收器和服务
【发布时间】:2012-11-29 16:01:49
【问题描述】:

该应用程序正在 2.3.3 中开发

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

如果是?我们该怎么做?

如果不是? -> 这是我现在的方法...我使用 SharedPreferences 对象来保存这些值并在广播接收器中访问它们。这行得通吗?

我对此还有一些问题,将在回答后编辑我的问题... 谢谢..

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

【问题讨论】:

    标签: android


    【解决方案1】:

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

    但是,我认为在几乎所有情况下,这都是一种不好的方法。一般来说,广播接收器应该只解析意图并启动意图服务来完成所有工作。如果需要对位置进行某些操作,则服务应该而不是广播接收器来完成。还需要注意的是,在 onReceive() 结束时,广播接收器会立即被销毁,因此您会丢失其所有状态。

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

    [编辑] 由于我无法发表评论,我将在 Kerim 的答案中添加两美分。除非我遗漏了一些重要的东西(如果我遗漏了,请让我知道 Kerim,因为您可以评论我的)可能无法按您期望的方式工作。当广播接收器的onReceive() 函数完成时,广播接收器将被销毁。您发送的处理程序将继续存在,但广播接收器中的任何数据都将不存在,并且处理程序将无法调用广播接收器的函数。由于处理程序无法访问任何广播接收器的数据或功能,因此您不妨在服务中完成所有需要完成的工作。

    【讨论】:

    • 好的...那么我的 SharedPreferences 方法呢。一旦我的服务获得纬度和经度,我将它们存储在服务内的 SharedPreferences 对象中。在广播接收器被销毁之前,它们是否可以在广播接收器中被访问。我的代码将通过短信将位置发送到另一部手机,所以在发送消息后,即使广播接收器被破坏,我也可以接受。
    • 我同意我们应该做除了在服务中处理意图之外的所有事情。以防万一,SP怎么办
    • 我猜你的onReceive() 方法流程如下所示:解析意图->启动纬度/经度服务->查看纬度/经度的共享首选项->使用纬度/经度发送短信->onReceive() 结束。这将不起作用,因为当onReceive() 完成时,服务仍将查找纬度/经度。如果您将onReceive() 更改为仅启动服务并让服务找到纬度/经度发送短信,那么它将起作用。
    • @ThisNameIsTooLon 你对我的回答是正确的。但是处理程序不能启动服务来完成这项工作吗?在这种情况下,启动一个发送 SMS 的服务。
    • @KerimOguzcanYenidunya 在我的理解中它可以,但是你为什么想要它呢?在我看来,当服务可以做同样的事情时,这是一个不必要的复杂化。
    【解决方案2】:

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

    当你启动一个服务时,传递一个 Messenger 对象作为额外的。然后服务完成后,可以通过调用messenger.send(message);发回纬度和经度值

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-08-06
      • 1970-01-01
      • 1970-01-01
      • 2012-02-23
      • 2023-04-04
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多