【问题标题】:Scheduling background work in Android在 Android 中调度后台工作
【发布时间】:2012-08-15 02:12:13
【问题描述】:

我是 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 服务并更新本地数据库)。

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

谢谢

【问题讨论】:

    标签: android alarmmanager android-pendingintent intentservice


    【解决方案1】:

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

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

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

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

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

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

    【讨论】:

      【解决方案2】:

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

      【讨论】:

        猜你喜欢
        • 2014-01-29
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-07-25
        • 2020-10-26
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多