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