我的情况是,我希望服务定期获取一些信息(例如用户的位置),将其报告给我的服务器,并在位置与某个X位置匹配时接收推送通知。
无论应用程序是否正在运行,我都会得到一些关于定期检索位置信息的最佳机制的建议。以下是我考虑过的选项以及每个选项的背景信息。
创建标准Android服务
我的第一个想法是创建一个STICKY服务,初始化将获得位置更新的GoogleAPIClient,一旦收到位置,它就会将其发送到服务器。我对这种方法的问题是我必须定期获取位置信息。因此,即使没有运行位置扫描,服务也会持续运行。此外,在服务中经常轮询位置的最佳方式是什么?
使用IntentService创建警报
我想到的第二个选项是唤醒警报管理器并启动一个启动位置更新的IntentService(通过GoogleAPIClient)。获得位置后,发送到服务器并关闭位置更新。这将解决定期启动/停止位置更新的问题。但是,在没有等待的情况下,我没有在IntentService中连接到GoogleAPIClient的运气好,我认为这不是最有效的事情。
创建GcmTaskService
这有很多AlarmManager的优点,并且在打盹模式方面似乎更有效,因为它只在手机处于维护模式时唤醒服务,因此它似乎是一个很好的解决方案。但是,我有与IntentService相同的问题,它连接到GoogleAPIClient以获取位置而没有等待。
我可能会在这个兔子洞里走得太远而且可能会有一些我不知道的东西,所以任何建议都会非常感激。
答案 0 :(得分:1)
我有同样的问题。我选择了第一种方法(一种粘性服务),一切正常。但是,我并不喜欢服务始终在运行并且对用户可见的事实。 这就是我决定使用JobScheduler API的原因,因为它是根据docs执行后台工作的首选方式。
如果您的应用定位API> = 21,则可以使用JobScheduler。如果您想支持该平台的旧版本,那么您应该使用最近推出的Firebase JobDispatcher库,但遗憾的是缺少文档。
在Google I / O 2016演示文稿中解释了所有内容here。看看吧。
答案 1 :(得分:0)
当您请求更新时,您可以请求最高频率。只需使用服务并将最大频率设置为您想要的轮询间隔。不需要AlarmManager。