0

我是Android新手,所以我想确保以下解决方案是正确的。在Android中安排后台工作

问题: 我想每隔10分钟通过web服务将设备的本地数据库与服务器上的数据库同步。我已经有了一个可以返回新/更新记录的Web服务调用。我想知道的是安排此任务的最佳方式是什么。即使应用程序未运行,我也希望数据库同步。我的解决方案(这是正确的路线吗?): 我将有一个BroadcastReceiver侦听android.intent.action.BOOT_COMPLETED,它的onReceive我将创建一个AlarmManager,它将消息发送到MyReceiver(通过每10分钟一个PendingIntent)。另外,在我的应用程序的启动过程中,我会做同样的事情(创建一个通过PendingIntent向MyReceiver发送消息的警报) - 由于两个警报都向MyReceiver发送消息,并且使用PendingIntent.FLAG_UPDATE_CURRENT初始化其相应的PendingIntents,所以新警报将覆盖旧的? (这是我想要做的,如果出于某种原因,设备启动后报警会被取消,应用程序启动时应该重新启动)。

在MyReceiver的onReceive()我将创建一个MyIntentService(此实例将使Web服务调用并更新本地数据库)。

这是一个很好的解决方案吗?有什么建议么?如果存在

感谢

回答

1

以这种方式使用FLAG_UPDATE_CURRENT将覆盖现有的PendingIntent。我并不积极,但我相信只要你进入onReceive,PendingIntent就会被消耗掉,所以它不再被覆盖。无论在哪种情况下,这听起来像是你正在寻找的功能,是的,这是解决这类问题的好方法。我唯一的建议是,如果10分钟的时间间隔不是绝对关键的,那么在你的AlarmManager中使用INTERVAL_时间表(例如INTERVAL_FIFTEEN_MINUTES)来帮助节省电池寿命;基本上,它允许所有按时间间隔运行的应用程序一起“批量”工作,并且不太频繁地唤醒设备。

2

解决方案很好......实际上,当设备关闭并重新启动时,所有的AlarmManager实例都会被清除。

简单的方法是... 首先创建应用程序启动时的AlarmManager。 第二次接收BOOT_COMPLETED BroadcastReceiver。

它足够了,PendingIntent.FLAG_UPDATE_CURRENT将确保一次只有一个激活的警报。

通过这种方式,您的应用程序启动时就会注册警报。如果它已通过BOOT_COMPLETED注册,则不会有任何问题。当您关闭设备时,激活的闹钟将停用,但BroadcastReceiver到BOOT_COMPLETED将在下次开机时处理注册新闹钟。

如果您决定回答您的问题,请将其标记为“已接受”。这会提高你的和我的声望得分。

此外,您还需要查看使用网络的时间间隔,这可能会非常耗费设备和用户的资源。一种策略可能是在用户启动应用程序时有更长的时间间隔并检查更新(这可能不便于用户使用,但可以节省很多系统资源和电池电量)。尝试根据您的需求找到一些更好的政策。