我能否在后台服务中完全运行Android地理围栏?

6
我有一个几乎不需要用户交互但需要地理围栏的应用,我能在后台服务中完全运行吗?
当服务首次运行时将存在一个Activity。这个Activity将启动一个服务并在BOOT_COMPLETED时注册一个BroadcastReceiver,因此服务将在启动时开始运行。这个Activity很可能永远不会再次运行。
该服务将设置一个闹钟定期触发,这将导致IntentService从网络下载位置列表。然后,该IntentService将在这些位置周围设置地理围栏,并创建PendingIntents,当接近这些位置时将触发这些PendingIntents。接着,这些PendingIntents将导致另一个IntentService执行某些操作。
除了安装后第一次启动Activity外,所有这些都需要在后台进行,没有用户交互。因此,该Activity将不与LocationClient或任何位置服务交互。
实际上,我已经使用了proximityAlerts来设置这个应用程序,但出于电池寿命方面的考虑,我希望转移到新的Geofencing API。然而,我听说在服务中使用LocationClient可能会出现一些问题。具体来说,我听到的是(对不起,没有参考资料,只是 hearsay claims):
- 位置客户端依赖UI可用性进行错误处理 - 当从后台线程调用时,LocationClient.connect() 假定它是从主UI线程(或其他带有事件looper的线程)调用的,如果我们从在后台线程运行的服务中调用此方法,则不会调用连接回调函数
当我调查时,我看不到为什么会出现这种情况,或者为什么它会阻止我做我想做的事情。我希望它几乎可以成为proximityAlerts的替代品...
请问有人能解释一下吗?
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启动的Service,并且连接回调被调用。

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

LocationClient需要UI的原因是设备上可能没有安装Google Play服务。Google已经设计了一个狡猾而复杂的机制,允许您的应用程序提示用户下载它。在我看来,整个过程都很可怕和糟糕。这都是“如果发生什么”编程。

(他们匆忙推出了很多东西给谷歌IO 2013。并不是所有东西都有很好的文档记录,其中一些似乎有点“粗糙”)。


我也找不到列出地理围栏的API,而且我也很想有一个。我还担心我的SQLite数据库和实际注册围栏列表不同步... - b-ryce

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接