0

我有一个应用程序需要跟踪我的位置,在执行此操作时读取传感器并使用信息(即我当前的速度)更新 Activity。Activity 还有一个“停止”按钮,允许用户取消后台作业。如果用户离开,数据收集应该继续,并且通知应该允许用户返回到显示信息的视图。

到目前为止,我有:

  • 服务
    • 有一个private static MyService instance字段和一个吸气剂
    • 它设置instance = thisonStartCommand(...)
    • 它还有一个当前数据的吸气剂(包装在一个对象中)
    • 它提供了goForeground()一种调用startForeground(...)并显示通知的方法(goBackground()相反)
  • 一个活动
    • 调用MyService.getInstance()onCreate(...)如果它返回 null 它创建服务startService(someIntent)
    • 一种updateViews()从 Service 中提取数据并使用 Handler 安排对自身的调用以每 500 毫秒更新一次 View 的方法

这行得通。但是,我很确定这不是推荐的方法。它很难看,所有对返回值的调用getInstance()都包含在非空检查中。此外,所有工作都发生在 UI 线程中(当我向服务添加更多计算时,这肯定会导致问题)。另外,我想摆脱轮询服务数据的活动。

推荐的方法是什么?

Android 文档目前还不是很清楚,我在 Google 上找到的所有内容要么已经过时,要么解决了不同的问题。铭记于心:

  • 我的后台工作基本上是无止境的,不会在某个时间点“完成”。只有用户可以决定这一点(这是否排除了 AsyncTask?)
  • 我需要将一些非原始日期从后台传递到前台
  • 我需要从 Activity 控制背景
  • 如果 Activity 关闭并重新打开,它应该能够“重新连接”到后台
4

1 回答 1

0

正如您所说,从服务中提取数据不是最佳实践,幸运的是,有一个叫做BroadcastReceiver的东西,这个类在发送意图并且接收器配置为接收它时唤醒(在清单中)。

这允许您的服务在准备好时发送数据,或者以其他方式,您的活动可以发送对新数据的请求。

请注意,意图可以保存数据,因此您不需要为服务保存任何静态实例,只需将数据传递给意图

于 2013-02-06T19:29:09.553 回答