【问题标题】:How to receive and process location changes when an Activity is pausedActivity 暂停时如何接收和处理位置变化
【发布时间】:2016-10-28 19:17:24
【问题描述】:

我正在寻找一些应用设计建议。

我有一个应用程序可以连接到 Google 定位服务并跟踪它收到的位置坐标。这些在 UI 上显示为路径。

当屏幕超时并变为空白时,Activity 当然会按照正常的 Activity 生命周期关闭。

但是 - 我仍然想记录从位置服务返回的每个 onLocationChanged 事件的坐标,但是当然,Activity 已经暂停,所以它不能这样做。

我并不是特别想阻止 Manifest 中的屏幕空白(因此Activity 永远不会暂停)。虽然我相信如果接到电话等它仍然会暂停。

我的解决方案是在 Activity 暂停事件之一(onPauseonStoponSaveInstanceState)中启动一个 IntentService 以接收位置更新,然后当Activity重启时,从Service中收集数据并关闭Service。

这是实现此目标的一种有效且正确的方法,还是有一些我不知道的 Android 魔法?如果是这样,IntentService 是正确的方法吗(或者我应该使用Service)吗?

【问题讨论】:

    标签: android service android-service android-location android-intentservice


    【解决方案1】:

    由警报管理器重新启动的正常服务可能是一个更好的主意。

    【讨论】:

    • 您介意解释一下为什么这样更好吗?这不只是一个由调度程序启动的service,而不是在实际需要时(即我的应用暂停时)吗?
    【解决方案2】:

    为了解决松散的问题,我将添加自己的答案,现在我已经实现了一些东西。

    我最终的解决方案是不是IntentService。这是因为我认为IntentService 会将其工作视为LocationService 的实际设置,一旦该工作完成,它就会自行关闭而不是等待LocationService 'pings' .

    因此,我实现了一个普通的Service,但我将它绑定到调用Activity。我还设置了对Activity 的回调。这样,当收到“ping”时,我可以对其进行处理并将数据直接传回Activity。此外,只要绑定到位,Service 就会保持活动状态。当Activity 被销毁时,我清除了活页夹。

    这很完美....但是

    然后我发现Activity 中没有处理LocationService 'pings' 的原因是因为我在调用Activity onStop 时断开了GoogleAPIClient。删除它后,Activity 即使在停止状态下也会处理“ping”,因此无论如何都不需要Service

    因此,这个问题的正确答案是……Activity 应该在后台继续处理(除非它出于内存管理目的而被销毁),因此请检查您是否没有停止“关闭”处理程序中的内容onPause onStop 等。那你就不会像我一样浪费时间写服务了!

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-10-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-06-25
      • 2012-09-19
      相关资源
      最近更新 更多