背景工作与数据从背景到前景在Android中

时间:2013-02-06 19:18:45

标签: android android-service

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

到目前为止,我有:

  • 服务
    • 有一个private static MyService instance字段和一个getter
    • 它在instance = this
    • 中设置onStartCommand(...)
    • 它还有一个当前数据的getter(包装在一个对象中)
    • 它提供了goForeground()方法,可以调用startForeground(...)并显示通知(goBackground()执行相反的操作)
  • 一项活动
    • MyService.getInstance()中调用onCreate(...),如果它返回null,则会使用startService(someIntent)
    • 创建服务
    • 一种updateViews()方法,用于从服务中提取数据并使用处理程序安排对自身的调用以每500毫秒更新一次视图

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

推荐的方式是什么?

此时Android文档还不是很清楚,我在Google上找到的所有内容都已过时或解决了不同的问题。请记住:

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

1 个答案:

答案 0 :(得分:0)

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

这允许您的服务在准备就绪时发送数据,或者您的活动可以发送新数据请求。

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