我有一个连接到Bitmessage网络的应用程序,即一直在下载和处理来自P2P网络的数据。此外,它应该(可选)仅使用WiFi /未计量网络。
我已经通过使用JobScheduler实现了这一点,但不幸的是它超时了10分钟(在Lollipop上显然甚至是1分钟)。
简而言之,我如何实现
服务答案 0 :(得分:6)
正如您所发现的,JobScheduler
不是在后台持续运行的正确组件。正确的组件是foreground service。
根据您的要求:
- 在WiFi可用时自动启动
您仍应使用JobScheduler
。您的JobScheduler
本身不做任何工作:它只是启动您的前台服务。如果您希望使用Firebase JobDispatcher来恢复API 14,并且只需要在使用Google Play服务的设备上运行,则可以使用CONNECTIVITY_ACTION
。
- 在使用计量网络时自动断开连接
在前台服务中,您应该以编程方式为isActiveNetworkMetered()
广播注册一个监听器。在回调中,您应该检查action的结果(在API 16上可用),如果为真,则停止前台服务。
- 没有超时
前台服务没有超时:它将继续运行,直到您停止服务。强烈建议将服务作为前台服务所需的通知具有{{3}},以允许用户手动停止服务。
答案 1 :(得分:1)
如上所述,作业调度程序不适用于永久运行的任务。这就是前台服务的用途。
在您的情况下,我建议使用作业来监控您想要的启动约束(计量网络等)。当该作业运行时,您启动前台服务以执行实际工作,并从onStartJob()返回false。
然后,当您的前台服务正在运行时,只需使用连接和安全功能直接观察计量网络的丢失。网络API,并在适当时关闭前台服务。