【问题标题】:Repeat download if connection problems occurred如果出现连接问题,请重新下载
【发布时间】:2018-07-25 21:20:14
【问题描述】:

在我的应用中,我每 10 分钟通过AlarmManager API 建立一次互联网连接以下载数据。

我希望该应用至少尝试连接 6 次,如果网络连接出现问题,则每 30 秒尝试一次。

有可能吗?

【问题讨论】:

    标签: android download connection repeater android-networking


    【解决方案1】:

    在现代 Android 设备上是不可能做到这一点的,现代我指的是 Android 6 或更高版本。

    • 6:打瞌睡 [在屏幕关闭大约一小时后打瞌睡]
    • 7:Doze++ [在屏幕关闭后不久打瞌睡]
    • 8:后台限制[无法运行不在前台的服务]

    Google 推荐的这种同步方式是使用 JobScheduler 或 Firebase Cloud Messaging(如果您有能力执行服务器实现)。

    在不了解所有要求的情况下,如果您确定比 JobScheduler 允许的同步频率更高,听起来该应用可能需要使用 AlarmManager。

    AlarmManager 中只有 1 个 API 保证每 30 秒可靠调用一次,即setAlarmClock。但是,它不能用于启动服务。它只能发送一个面向用户的警报和一个PendingIntent,当用户点击警报时会执行。

    最有可能对您有用的两个 API 是 setAndAllowWhileIdlesetExactAndAllowWhileIdle。这两个 API 都可用于启动服务。当屏幕打开或设备正在充电时,警报会频繁执行。但是,当设备处于称为 Doze 的省电模式时,它们只能在 Doze 维护窗口期间执行。这意味着在大多数正常的打盹窗口期间,它们仍然可以至少每 9 分钟运行一次。

    现在,面向 Android 8 的应用必须解决另一个新限制,它们必须调用 startServiceInForeground。例如,前台服务会设置一个正在进行的通知,例如您的媒体播放器。因此,它使用户更加意识到服务正在运行,并且通常为他们提供停止服务的选项。

    现在前台服务“免于”打瞌睡,有几点需要注意:

    • 当前台服务处于活动状态时,它会防止整个设备打瞌睡,从而大大增加电池使用量
    • 在 Android 6 中,前台服务无论如何都会被打瞌睡,除非它们由于框架缺陷而处于单独的进程中
    • 我听说如果让前台服务运行很长时间,某些设备最终会终止它

    但您问题的真正答案是:“不要这样做”。该应用程序真的需要使用那么多电池和数据吗?每 30 秒运行一次是非同寻常的,即使有可能,它也会使应用程序成为手机上的“坏公民”......

    【讨论】:

    • 感谢 Elletlar 非常完整的回答。如果第一次尝试没有连接,我需要重复下载。事实上,我已经预见到每 10 分钟会进行一次 wakefullbroadcast 下载,但有时它会在没有网络的情况下发生,在这些情况下,我需要立即进行其他尝试下载,直到连接恢复。
    • 在这种情况下,服务可以在前台保留足够长的时间以发出几次重试。毕竟,如果应用程序以 Android 8 或更高版本为目标,它无论如何都必须在前台启动服务。但是,仅让设备保持唤醒以发出重试当然对电池寿命不利。我知道您正在尝试使用 AlarmManager 以“正确的方式”执行此操作,但由于所有电池节省优化,它不再那么频繁地唤醒。
    猜你喜欢
    • 2021-05-01
    • 2021-04-11
    • 1970-01-01
    • 1970-01-01
    • 2011-08-21
    • 2021-09-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多