Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/221.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 前台服务和作业调度器之间的区别_Android - Fatal编程技术网

Android 前台服务和作业调度器之间的区别

Android 前台服务和作业调度器之间的区别,android,Android,我有一个应用程序,我使用前台服务启动大量线程,这些线程大部分时间处于睡眠状态,有时醒来进行一些测量 我使用前台服务是因为我需要这些测量必须在特定和准确的时间进行,而不受安卓8.0引入的后台限制 这似乎是可行的,从文档来看似乎没有问题,但我也读了关于JobScheduler的内容 使用作业在特定的准确时间安排工作是一个优势,或者我的解决方案可以毫无问题地使用。对于您的用例,您最好使用WorkManager,根据android文档,在API 23+上使用JobScheduler,在API 14-22

我有一个应用程序,我使用前台服务启动大量线程,这些线程大部分时间处于睡眠状态,有时醒来进行一些测量

我使用前台服务是因为我需要这些测量必须在特定和准确的时间进行,而不受安卓8.0引入的后台限制

这似乎是可行的,从文档来看似乎没有问题,但我也读了关于JobScheduler的内容


使用作业在特定的准确时间安排工作是一个优势,或者我的解决方案可以毫无问题地使用。

对于您的用例,您最好使用
WorkManager
,根据android文档,在API 23+上使用
JobScheduler
,在API 14-22上使用
BroadcastManager
AlarmManager
的组合

使用
WorkManager
,即使应用程序退出或设备重新启动,您的作业也能可靠运行


首先是一个事实

JobScheduler
中,系统在应用程序的
JobService
JobService
类也扩展了我们用来定义
前台服务的
Service
类。所以通过使用两者,我们可以在后台执行代码

现在主要的区别是,
前台服务始终在运行(通过向用户显示通知),并消耗用户的电池和内存,即使您的线程正在休眠且没有代码执行

因为它一直在运行,所以你可以在任何时刻准确地做任何你想做的事情。也许这对你的应用程序的观点是好的,但对用户是坏的。你的应用程序不必要地耗尽电池电量并消耗内存

为了解决这个问题,我们使用了
JobScheduler
。您可以根据某些条件安排要执行的作业。你的应用程序只有在符合条件时才会唤醒,但并不精确。这取决于许多因素,如打盹模式等

你可以多看看

结论是

如果您的任务不需要在准确的时间执行,那么您应该使用
作业调度器
(最近
WorkManager
更好,因为它在内部使用
作业调度器
,而且更高级),以节省用户的电池电量

根据官方的说法

WorkManager适用于可延迟的任务,即 需要立即运行,并且需要可靠运行,即使 应用程序退出或设备重新启动


作业不能在精确的时间运行-系统可以根据需要推迟它们,通常是将更多的作业批处理在一起,并在一个cpu唤醒内完成。首先感谢您的解释,我不知道JobScheduler的调度不精确。我认为使用JobInfo.Builder的方法setMinimumLatency(long)和setOverridedAdline(long)可以在正确的时间执行作业。也许我有点离题了,但JobScheduler的这种行为就是我必须选择ForegroundsService和线程解决方案的原因?或者你知道Android框架中是否有更好的工具更适合我的用例(准确的时间安排)?@Beruth如果你的要求是在准确的时间运行,比如上午11:30,那么使用AlarmManager,但是,如果你的代码不需要在准确的时间运行,WorkManager是一个更好的选项ArmManager/WorkManager总是比AlarmManager提供的前台服务更好。您可以设置时间,并在该时间运行代码