如何解决 Android JobScheduler 超时?

How to work around the Android JobScheduler timeout?

我有一个连接到 Bitmessage 网络的应用程序,即一直从 P2P 网络下载和处理数据。此外,它应该(可选)仅使用 WiFi/unmetered 个网络。

我已经使用 JobScheduler 实现了这个,但不幸的是它有 10 分钟的超时(在 Lollipop 上显然甚至是 1 分钟)。

简而言之,我如何实施一项服务

如您所见,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 观察计量网络的丢失,并在适当的时候关闭前台服务。