Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/228.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/flash/4.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 安卓应用程序关闭时WorkManager是否正在运行?_Android_Android Service_Android Jetpack_Android Workmanager - Fatal编程技术网

Android 安卓应用程序关闭时WorkManager是否正在运行?

Android 安卓应用程序关闭时WorkManager是否正在运行?,android,android-service,android-jetpack,android-workmanager,Android,Android Service,Android Jetpack,Android Workmanager,我想安排每晚的数据库更新。所以我使用了新的Android WorkManager。我的理解是,一旦安排,它将始终在后台运行,与应用程序的生命周期无关。 是这样吗?我的第一次测试表明,只有在应用程序运行时才执行工作 val locationWork = PeriodicWorkRequest.Builder(UpdateDatabaseWorker::class.java, 24, TimeUnit.HOURS) .addTag("DATABASE_

我想安排每晚的数据库更新。所以我使用了新的Android WorkManager。我的理解是,一旦安排,它将始终在后台运行,与应用程序的生命周期无关。 是这样吗?我的第一次测试表明,只有在应用程序运行时才执行工作

val locationWork = PeriodicWorkRequest.Builder(UpdateDatabaseWorker::class.java, 24, TimeUnit.HOURS)
                        .addTag("DATABASE_UPDATE_SERVICE")
                        .build()
WorkManager.getInstance().enqueue(locationWork)
我的理解是,一旦计划好,它将始终以最快的速度运行 后台独立于应用程序的生命周期。是这样吗

对。基于

即使您的应用程序被强制退出或退出,任务仍保证运行 设备已重新启动

WorkManager根据设备API级别和应用程序状态等因素选择适当的任务运行方式。如果WorkManager在应用程序运行时执行您的任务之一,WorkManager可以在应用程序进程中的新线程中运行您的任务。如果您的应用程序未运行,WorkManager会根据设备API级别选择适当的方式来安排后台任务

WorkManager可能使用JobScheduler、Firebase JobDispatcher或AlarmManager,具体取决于API级别。在执行工作之前,它将重复Doze和conaider所有其他约束。在打瞌睡模式下,您可能会遇到一些延迟,因为它可能会等待维护窗口

注意:

WorkManager适用于需要保证即使应用程序退出,系统也会运行它们的任务,例如将应用程序数据上载到服务器。它不适用于在应用程序进程消失时可以安全终止的进程内后台工作;对于这种情况,我们建议使用线程池


这就是文档所说的:

注意:WorkManager适用于需要保证即使应用程序退出,系统也会运行它们的任务,例如将应用程序数据上载到服务器。它不适用于在应用程序进程消失时可以安全终止的进程内后台工作;对于这种情况,我们建议使用线程池

但一定有一些条件如果该条件满足,则WorkManager将运行任务(这很重要)。条件,如“仅在设备充电和联机时”

阅读本文后,WorkManager会根据您施加的约束及其其他要求,尝试按您请求的时间间隔运行任务


在这里,我找到了一个关于如何使用WorkManager安排任务的好教程:

基于WorkManager上报告的各种问题,他们的文档对于WorkManager在这种边缘情况下的确切行为并不完全准确

在某些设备上,当应用程序从任务管理器中清除时,应用程序将强制停止,因此该部分是预期的


不幸的是,一些设备将从“最近”菜单中终止应用程序作为强制停止。股票安卓并没有做到这一点。当应用程序被强制停止时,它无法执行作业、接收警报或广播等。因此,不幸的是,我们无法解决它-问题在于操作系统,没有解决方法


我们遇到的唯一一个问题是,一些中国原始设备制造商将最近的swipe解雇视为强制停止。当这种情况发生时,WorkManager将在下次应用程序启动时重新安排所有挂起的作业。考虑到这是一个CDD冲突,WorkManager在拥有一个客户机库的情况下所能做的就不多了


此外,如果设备制造商决定修改库存Android以强制停止应用程序,WorkManager将停止工作(JobScheduler、警报、广播接收器等也将停止工作)。没有办法解决这个问题。不幸的是,一些设备制造商会这样做,因此在这种情况下,WorkManager将停止工作,直到下一次应用程序启动


在使用android的Pixel 2 XL上对
OneTimeWorkRequest
(无限制)进行密集测试后,行为如下:

  • 任务管理器关闭:
    • 工作继续(一段时间后)
  • 重新启动设备(工作正在运行):
    • 重新启动完成后,工作仍在继续
  • 应用程序信息“强制停止”:
    • 工作停止,仅当应用程序再次启动时才会继续
  • 重新启动设备(工作被“强制停止”):
    • 在再次启动应用程序之前,工作不会继续


您可以在上找到不同OEM行为的完整列表。安卓团队似乎也承认了这个问题,并在安卓Q的CTS测试中添加了一个测试。

因此,如果像我这样,我在没有条件的情况下运行任务,它将始终运行?@TuesdayFourAM no,它将不会运行。您需要设置一些条件,当该条件满足时,它将运行您的任务。比如,<代码>使用Wifi连接时将我的照片上传到服务器。@TuesdayFourAM欢迎!我已将.setRequiredNetworkType(NetworkType.NOT_REQUIRED)添加到工作定义中,但没有任何帮助。工作只启动了一次,然后再也没有运行过。所以,我仍然不太明白它是如何工作的。我一直在关注你在评论中添加的教程,并将此问题发布给教程的作者。因此,只将任务排队一次就足够了,它将永远运行,直到显式取消为止?我观察到它只在应用程序运行时运行一次。@TuesdayFourAM是的。够了。它应该每24小时运行一次。对于API>棒棒糖,您必须了解这一点。它将使用JobScheduler来安排作业。它将尊重打盹模式,任务将在维护窗口期间执行。我尝试并在我的工作人员中请求了一个一次性工作请求。我放置了一个简单的日志和一个线程睡眠。它工作正常,但一旦我通过切换退出应用程序,就没有更多的日志了。。所以对我来说它好像停止了..如果我们更新了怎么办