0

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

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

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

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

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

谢谢

4

2 回答 2

2

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

简单的方法是...首先在应用程序启动时创建AlarmManager。在 BOOT_COMPLETED BroadcastReceiver 的 onReceive 中排在第二位。

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

这样,当您的应用程序启动时,警报就会注册。如果它已经通过 BOOT_COMPLETED 注册,则不会有任何问题。当您关闭设备时,已激活的警报将停用,但 BroadcastReceiver 到 BOOT_COMPLETED 将负责在下次启动时注册新警报。

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

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

于 2012-08-15T04:53:44.737 回答
1

Using FLAG_UPDATE_CURRENT in that manner will override the existing PendingIntent if one exists. I'm not positive but I believe that as soon as you get into onReceive, the PendingIntent is consumed so it's no longer there to be overridden. In either case, it sounds like this is the functionality you are looking for and yes it's a good way to solve this kind of problem. My only other suggestion would be if the 10 minute interval timing is not absolutely critical then use one of the INTERVAL_ schedules (INTERVAL_FIFTEEN_MINUTES for example) in your AlarmManager to help conserve battery life; basically it lets allows all apps that run on intervals to "batch" their work together and wake the device up less frequently.

于 2012-08-15T04:42:53.053 回答