Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/233.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android中后台作业,数据从后台到前台_Android_Android Service - Fatal编程技术网

Android中后台作业,数据从后台到前台

Android中后台作业,数据从后台到前台,android,android-service,Android,Android Service,我有一个应用程序需要跟踪我的位置,在执行此操作时读取传感器,并使用信息(即我的当前速度)更新活动。该活动还有一个“停止”按钮,允许用户取消后台作业。如果用户导航离开,数据收集应该继续,通知应该允许用户返回显示信息的视图 到目前为止,我已经: 服务 它有一个私有静态MyService实例字段和一个getter 它在onStartCommand(…) 它还有一个当前数据的getter(包装在对象中) 它提供了一个goForeground()方法,该方法调用startForeground(…)并显

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

到目前为止,我已经:

  • 服务
    • 它有一个
      私有静态MyService实例
      字段和一个getter
    • 它在
      onStartCommand(…)
    • 它还有一个当前数据的getter(包装在对象中)
    • 它提供了一个
      goForeground()
      方法,该方法调用
      startForeground(…)
      并显示通知(
      goBackground()
      则相反)
  • 活动
    • 调用
      onCreate(…)
      中的
      MyService.getInstance()
      ,如果返回null,则使用
      startService(someIntent)
    • 一种
      updateViews()
      方法,它从服务中提取数据,并使用处理程序安排对自身的调用,以每500毫秒更新一次视图
这很有效。 但是我很确定这不是推荐的方法。它非常丑陋,对
getInstance()
的返回值的所有调用都被包装在一个NOTNULL检查中。此外,所有工作都发生在UI线程中(当我向服务添加更多计算时,这肯定会导致问题)。另外,我想去掉轮询服务以获取数据的活动

推荐的方法是什么?

Android文档在这一点上不是很清楚,我在谷歌找到的所有东西要么已经过时,要么已经解决了不同的问题。请记住:

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

正如您所说,从服务中提取数据并不是最佳做法,幸运的是,有一种称为a的东西,当发送了意图并且接收方被配置为接收它(在清单中)时,该类会被唤醒

这允许您的服务在数据准备就绪时发送数据,或者通过另一种方式,您的活动可以发送新数据请求

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