在Android中安排后台工作

时间:2012-08-15 02:12:14

标签: android alarmmanager android-pendingintent intentservice

我是Android的新手,所以我想确保以下解决方案是正确的。

问题: 我希望每10分钟通过Web服务将设备的本地数据库与我服务器上的数据库同步。我已经有一个Web服务调用,我可以返回新的/更新的记录。我想知道什么是安排这项任务的最佳方式。即使应用程序没有运行,我也希望数据库能够同步。

我的解决方案(这是正确的路线吗?): 我将有一个侦听android.intent.action.BOOT_COMPLETED的BroadcastReceiver,在它的onReceive中我将创建一个AlarmManager,每隔10分钟向MyReceiver发送一条消息(通过PendingIntent)。此外,在我的应用程序的启动中,我将执行相同的操作(创建警报以通过PendingIntent将消息发送到MyReceiver) - 由于两个警报都向MyReceiver发送消息,并且使用PendingIntent.FLAG_UPDATE_CURRENT初始化其相应的PendingIntents,新警报将覆盖老一个? (这就是我想要做的,如果由于某种原因在设备启动后警报被取消,它应该在应用程序启动时重新启动)。

在MyReceiver的onReceive()中,我将创建一个MyIntentService(此实例将进行webservice调用并更新本地数据库)。

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

谢谢

2 个答案:

答案 0 :(得分:2)

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

简单的方法是...... 首先在应用程序启动时创建AlarmManager。 其次是BOOT_COMPLETED BroadcastReceiver的onReceive。

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

这样,应用程序启动时会注册警报。如果已通过BOOT_COMPLETED注册,则不会出现问题。当您关闭设备时,激活的警报将被禁用,但BroadcastReceiver到BOOT_COMPLETED将在下次启动时处理注册新的警报。

如果您认为这回答了您的问题,请将其标记为“已接受”。这将提高您和我的声誉分数。

此外,您还需要检查使用网络的时间间隔,这可能会对设备和用户造成极大的资源消耗。一个策略可能是具有更长的间隔时间并在用户启动应用程序时检查更新(这可能不是用户友好的,但也可以节省许多系统资源和电池电量)。尝试根据您的需求找到更好的政策。

答案 1 :(得分:1)

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