如何解决 Android JobScheduler 超时?
How to work around the Android JobScheduler timeout?
我有一个连接到 Bitmessage 网络的应用程序,即一直从 P2P 网络下载和处理数据。此外,它应该(可选)仅使用 WiFi/unmetered 个网络。
我已经使用 JobScheduler 实现了这个,但不幸的是它有 10 分钟的超时(在 Lollipop 上显然甚至是 1 分钟)。
简而言之,我如何实施一项服务
- WiFi 可用时自动启动
- 使用按流量计费的网络时自动断开连接
- 没有超时
- 适用于自 Lollipop
以来的所有 Android 版本
如您所见,JobScheduler
不是在后台持续 运行 的正确组件。正确的组件是 foreground service.
根据您的要求:
- automatically starts when WiFi is available
您仍应为此使用 JobScheduler
。您的 JobScheduler
本身不做任何工作:它只是启动您的前台服务。如果您希望它恢复到 API 14,您可以使用 Firebase JobDispatcher,并且只需要在具有 Google Play 服务的设备上 运行。
- automatically disconnects when a metered network is used
在您的前台服务中,您应该以编程方式为 CONNECTIVITY_ACTION
Broadcast. In the callback, you should check the result of isActiveNetworkMetered()
(在 API 16 上可用)注册一个侦听器,如果为真,请停止您的前台服务。
- doesn't time out
前台服务没有超时:它会一直持续到 运行,直到您停止该服务。强烈建议使服务成为前台服务所需的通知具有 action 以允许用户手动停止您的服务。
如前所述,作业计划程序不适用于永远 运行 的任务。这就是前台服务的用途。
对于您的情况,我建议使用作业来监视您想要的启动限制(计量网络等)。当该作业 运行s 时,您启动前台服务来完成实际工作,并且 return 来自 onStartJob() 的 false。
然后,当您的前台服务处于 运行ning 状态时,只需直接使用连接和网络 API 观察计量网络的丢失,并在适当的时候关闭前台服务。
我有一个连接到 Bitmessage 网络的应用程序,即一直从 P2P 网络下载和处理数据。此外,它应该(可选)仅使用 WiFi/unmetered 个网络。
我已经使用 JobScheduler 实现了这个,但不幸的是它有 10 分钟的超时(在 Lollipop 上显然甚至是 1 分钟)。
简而言之,我如何实施一项服务
- WiFi 可用时自动启动
- 使用按流量计费的网络时自动断开连接
- 没有超时
- 适用于自 Lollipop 以来的所有 Android 版本
如您所见,JobScheduler
不是在后台持续 运行 的正确组件。正确的组件是 foreground service.
根据您的要求:
- automatically starts when WiFi is available
您仍应为此使用 JobScheduler
。您的 JobScheduler
本身不做任何工作:它只是启动您的前台服务。如果您希望它恢复到 API 14,您可以使用 Firebase JobDispatcher,并且只需要在具有 Google Play 服务的设备上 运行。
- automatically disconnects when a metered network is used
在您的前台服务中,您应该以编程方式为 CONNECTIVITY_ACTION
Broadcast. In the callback, you should check the result of isActiveNetworkMetered()
(在 API 16 上可用)注册一个侦听器,如果为真,请停止您的前台服务。
- doesn't time out
前台服务没有超时:它会一直持续到 运行,直到您停止该服务。强烈建议使服务成为前台服务所需的通知具有 action 以允许用户手动停止您的服务。
如前所述,作业计划程序不适用于永远 运行 的任务。这就是前台服务的用途。
对于您的情况,我建议使用作业来监视您想要的启动限制(计量网络等)。当该作业 运行s 时,您启动前台服务来完成实际工作,并且 return 来自 onStartJob() 的 false。
然后,当您的前台服务处于 运行ning 状态时,只需直接使用连接和网络 API 观察计量网络的丢失,并在适当的时候关闭前台服务。