【发布时间】:2018-07-25 21:20:14
【问题描述】:
在我的应用中,我每 10 分钟通过AlarmManager API 建立一次互联网连接以下载数据。
我希望该应用至少尝试连接 6 次,如果网络连接出现问题,则每 30 秒尝试一次。
有可能吗?
【问题讨论】:
标签: android download connection repeater android-networking
在我的应用中,我每 10 分钟通过AlarmManager API 建立一次互联网连接以下载数据。
我希望该应用至少尝试连接 6 次,如果网络连接出现问题,则每 30 秒尝试一次。
有可能吗?
【问题讨论】:
标签: android download connection repeater android-networking
在现代 Android 设备上是不可能做到这一点的,现代我指的是 Android 6 或更高版本。
Google 推荐的这种同步方式是使用 JobScheduler 或 Firebase Cloud Messaging(如果您有能力执行服务器实现)。
在不了解所有要求的情况下,如果您确定比 JobScheduler 允许的同步频率更高,听起来该应用可能需要使用 AlarmManager。
AlarmManager 中只有 1 个 API 保证每 30 秒可靠调用一次,即setAlarmClock。但是,它不能用于启动服务。它只能发送一个面向用户的警报和一个PendingIntent,当用户点击警报时会执行。
最有可能对您有用的两个 API 是 setAndAllowWhileIdle 和 setExactAndAllowWhileIdle。这两个 API 都可用于启动服务。当屏幕打开或设备正在充电时,警报会频繁执行。但是,当设备处于称为 Doze 的省电模式时,它们只能在 Doze 维护窗口期间执行。这意味着在大多数正常的打盹窗口期间,它们仍然可以至少每 9 分钟运行一次。
现在,面向 Android 8 的应用必须解决另一个新限制,它们必须调用 startServiceInForeground。例如,前台服务会设置一个正在进行的通知,例如您的媒体播放器。因此,它使用户更加意识到服务正在运行,并且通常为他们提供停止服务的选项。
现在前台服务“免于”打瞌睡,有几点需要注意:
但您问题的真正答案是:“不要这样做”。该应用程序真的需要使用那么多电池和数据吗?每 30 秒运行一次是非同寻常的,即使有可能,它也会使应用程序成为手机上的“坏公民”......
【讨论】: