如果出现连接问题,请重复下载

Repeat download if connection problems occurred

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

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

可以吗?

不可能在现代 Android 设备上执行此操作,我所说的现代设备是指 Android 6 或更高。

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

Google 推荐的同步方式是使用 JobScheduler 或 Firebase Cloud Messaging,如果你有足够的时间做服务器实现的话。

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

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

最有可能对您有用的两个 API 是 setAndAllowWhileIdlesetExactAndAllowWhileIdle。这两个 APIs 都可以用来启动服务。当屏幕打开或设备正在充电时,警报将频繁执行。但是,当设备处于名为 Doze 的省电模式时,它们只能在 Doze 维护期间执行 windows。这意味着在大多数正常打瞌睡 windows.

期间,他们仍然可以 运行 至少每 9 分钟一次

现在针对 Android 8 的应用必须解决另一个新限制,它们必须调用 startServiceInForeground。例如,前台服务会像您的媒体播放器一样设置持续通知。因此,它让用户更加清楚该服务正在 运行ning 并且通常会为他们提供停止服务的选项。

现在前台服务 'exempt' 从 doze 开始,有几点需要注意:

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

但您问题的真正答案是:"Don't do it"。该应用程序真的需要使用那么多电池和数据吗? 运行 每 30 秒是非同寻常的,即使可能,它也会使应用程序成为 phone...

上的 "bad citizen"