我可以完全在后台服务中运行Android GeoFencing吗?

时间:2013-07-03 21:39:58

标签: android-location android-geofence

我有一个几乎不需要用户互动的应用,但需要Geofences。我可以在后台服务中完全运行吗?

首次运行服务时会有一个Activity。此Activity将启动一个服务并为BOOT_COMPLETED注册一个BroadcastReceiver,因此该服务将在启动时启动。此活动不太可能再次运行。

该服务将设置警报定期关闭,这将导致IntentService从网络下载位置列表。然后,此IntentService将围绕这些位置设置Geofences,并创建PendingIntents,这些PendingIntents将在接近位置时触发。反过来,那些PendingIntents将导致另一个IntentService采取一些行动。

所有这些都需要在后台进行,除了在安装后第一次启动Activity之外没有用户交互。因此,Activity不会与LocationClient或任何位置服务进行交互。

我实际上已经使用proximityAlerts设置了这个设置,但是出于电池寿命的原因希望转移到新的Geofencing API。但是,我听说在服务中使用LocationClient可能会有一些问题。具体来说,我听到了(抱歉,没有参考,只是传闻声称):

  • 位置客户端依赖于ui可用性进行错误处理
  • 从后台线程调用时,LocationClient.connect()假定它是从主ui线程(或其他具有事件循环器的线程)调用的,所以如果我们从后台线程中运行的服务调用此方法,则永远不会调用连接回调

当我调查时,我看不出为什么会出现这种情况,或者为什么它会阻止我按照自己的意愿行事。我希望它几乎可以替代proximityAlerts ...

有人可以对这里的事情有所了解吗?

1 个答案:

答案 0 :(得分:2)

最好的办法就是尝试一下,对吗?你的策略似乎很合理。

when called from background thread, LocationClient.connect() assumes that it is called from main ui thread (or other thread with event looper), so connection callback is never called, if we call this method from service running in background thread.

我知道这不是真的。我有一个从Activity启动的服务,并调用连接回调。

我不知道接近警报;但我似乎无法找到一个API来列出我的GeoFences。我担心我的数据库(sqlite)和实际的栅栏可能会不同步。在我看来,这是一个设计缺陷。

LocationClient需要UI的原因是设备可能没有安装Google Play服务。谷歌设计了一种狡猾而复杂的机制,允许你的应用提示用户下载它。在我看来,整件事情太可怕了。它的全部"假设是什么如果"编程。

(他们为google IO 2013推出了很多东西。并非所有内容都有详细记录,而且其中一些似乎有点"粗糙的边缘")。

相关问题