我有一个应用程序需要跟踪我的位置,在执行此操作时读取传感器并使用信息(即我当前的速度)更新 Activity。Activity 还有一个“停止”按钮,允许用户取消后台作业。如果用户离开,数据收集应该继续,并且通知应该允许用户返回到显示信息的视图。
到目前为止,我有:
- 服务
- 有一个
private static MyService instance
字段和一个吸气剂 - 它设置
instance = this
在onStartCommand(...)
- 它还有一个当前数据的吸气剂(包装在一个对象中)
- 它提供了
goForeground()
一种调用startForeground(...)
并显示通知的方法(goBackground()
相反)
- 有一个
- 一个活动
- 调用
MyService.getInstance()
,onCreate(...)
如果它返回 null 它创建服务startService(someIntent)
- 一种
updateViews()
从 Service 中提取数据并使用 Handler 安排对自身的调用以每 500 毫秒更新一次 View 的方法
- 调用
这行得通。但是,我很确定这不是推荐的方法。它很难看,所有对返回值的调用getInstance()
都包含在非空检查中。此外,所有工作都发生在 UI 线程中(当我向服务添加更多计算时,这肯定会导致问题)。另外,我想摆脱轮询服务数据的活动。
推荐的方法是什么?
Android 文档目前还不是很清楚,我在 Google 上找到的所有内容要么已经过时,要么解决了不同的问题。铭记于心:
- 我的后台工作基本上是无止境的,不会在某个时间点“完成”。只有用户可以决定这一点(这是否排除了 AsyncTask?)
- 我需要将一些非原始日期从后台传递到前台
- 我需要从 Activity 控制背景
- 如果 Activity 关闭并重新打开,它应该能够“重新连接”到后台