【发布时间】:2016-02-11 13:27:11
【问题描述】:
要求 - 我需要大致每 15 分钟获取一次用户的位置坐标并将其发布到服务器。有必要大致按这些间隔发布数据。
实现 - 我制作了一个同步适配器,而不是使用 AlarmManager,因为它可以节省电池。我已将ContentResolver.addPeriodicSync() 设置为大致每 15 分钟同步一次我的应用程序,从而获取当前位置并发布到服务器。
问题 - 如果没有互联网连接,我想继续每 15 分钟获取一次用户的位置并将其保存在本地 sqlite 数据库中。下次网络恢复时,我会一次性发布所有保存的位置,以便服务器数据保持一致,之后同步恢复正常。
主要问题是,当没有互联网时,同步停止,我的应用程序中不再收到定期同步回调,并且我无法将数据保存在本地数据库中。所以我想要的是,即使没有互联网,我也会定期收到回调,直到互联网恢复并再次开始自动同步。同步适配器能做到吗?
我能想到的一个解决方案是当互联网停止时我会收到一个广播,然后我开始使用AlarmManager每15分钟启动一次服务并获取位置并保存到本地数据库。当互联网恢复正常时,我会停止使用 AlarmManager 并返回自动同步。
解决方案 2 - 由下面的 David Medenjak 提供。由于 AlarmManager 的 setInexactRepeating() 行为试图模仿 Sync 适配器的行为,通过将不同应用程序的警报安排在一起来减少 CPU 唤醒的次数,它也很有效。它也导致了更简单的实现。这会比之前比较利弊的解决方案更好吗?
还有更好的方法来实现这一点吗?
【问题讨论】:
-
您使用的是平台的
LocationServicesAPI 还是 Google Play Services 的定位服务? -
来自 Google Play 的定位服务。
-
您是在使用
FusedLocationApi.getLastLocation还是通过PendingIntent订阅持续交付? -
每当同步开始时,我都会使用 FusedLocationApi.getLastLocation 获取位置并发送到服务器。
-
你找到答案了吗
标签: android android-sqlite alarmmanager android-syncadapter