6

我有一个几乎不需要用户交互但需要地理围栏的应用程序。我可以完全在后台服务中运行它吗?

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

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

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

实际上,我已经使用proximityAlerts 进行了设置,但是出于电池寿命的原因,我希望迁移到新的地理围栏API。但是,我听说在服务中使用 LocationClient 可能会出现一些问题。具体来说,我所听到的(抱歉,没有参考资料,只是传闻):

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

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

任何人都可以在这里阐明一些事情吗?

4

1 回答 1

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 启动的服务,并且调用了连接回调。

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

LocationClient 需要 UI 的原因是设备可能没有安装 Google Play 服务。Google 设计了一种巧妙而复杂的机制,允许您的应用提示用户下载它。在我看来,整个事情都是可怕的和可怕的。它的所有“假设假设”编程。

(他们为 2013 年的 google IO 冲出了很多东西。并非所有的东西都有很好的记录,其中一些似乎有点“边缘粗糙”)。

于 2013-08-13T23:07:55.110 回答