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

Posted

技术标签:

【中文标题】我可以完全在后台服务中运行 Android GeoFencing 吗?【英文标题】:Can I run Android GeoFencing entirely within a background service? 【发布时间】:2013-07-01 18:24:44 【问题描述】:

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

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

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

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

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

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

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

谁能解释一下这里的事情?

【问题讨论】:

【参考方案1】:

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

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

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

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

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

【讨论】:

我也找不到列出地理围栏的 API,我也很想拥有一个。我也担心我的 sqlite db 和注册的栅栏的实际列表不同步......

以上是关于我可以完全在后台服务中运行 Android GeoFencing 吗?的主要内容,如果未能解决你的问题,请参考以下文章

我可以在android中完全重新启动服务吗?

后台服务未在 Android Management API 中的完全托管设备上运行

在 Android 操作系统中,我可以创建一个在后台运行并检测扬声器是打开还是关闭的服务吗?

iPhone:重复后台任务

如何在 Android O 中保持服务在后台运行?

如何在Android后台服务中运行cordova插件?