pjp*_*res 7 android android-workmanager
仅当设备未使用时我才需要运行特定的工作。但是,我不完全理解该.setRequiresDeviceIdle()约束是如何工作的。
我正在这样安排一个工人:
\nval constraints = Constraints.Builder()\n .setRequiredNetworkType(NetworkType.CONNECTED)\n .setRequiresBatteryNotLow(true)\n .setRequiresStorageNotLow(true)\n .setRequiresDeviceIdle(true)\n .build()\n\nval networkWorkRequest = PeriodicWorkRequestBuilder<NetworkWorker>(15, TimeUnit.MINUTES)\n .addTag(NetworkWorker.TAG)\n .setInitialDelay(15, TimeUnit.SECONDS)\n .setConstraints(constraints)\n .build()\n\nWorkManager.getInstance(context)\n .enqueueUniquePeriodicWork(NetworkWorker.TAG, ExistingPeriodicWorkPolicy.REPLACE, networkWorkRequest)\nRun Code Online (Sandbox Code Playgroud)\n请注意,设备已充满电、有足够的存储空间并且始终有可用的互联网连接(意味着满足前 3 个限制)。
\n我尝试过几个小时不触摸设备,关闭所有应用程序,甚至通过 ADB(使用adb shell dumpsys deviceidle force-idle然后adb shell dumpsys deviceidle step)触发打瞌睡模式(然后是维护窗口),但似乎没有任何效果(根据文档,这个“空闲”不是与打瞌睡模式相同,但我决定尝试一下)。
正如你所看到的,我已经将这项工作安排为定期的,只是为了检查它是否会产生任何影响(事实上,我只需要一名一次性工人)。我离开设备过夜,最终工作人员运行了(这些是我正在写入 SD 卡中的文件的一些日志):
\n1620688536155,2021.05.11 00:15:36.155,DEBUG,PRETTY_LOGGER,Enqueueing worker with id 931d2b1f-85f4-445f-a889-832fdd945752\n1620712213970,2021.05.11 06:50:13.970,DEBUG,PRETTY_LOGGER,Running background work\xe2\x80\xa6 --- job started running\n1620712224898,2021.05.11 06:50:24.898,DEBUG,PRETTY_LOGGER,Response is: IT WORKS\n1620712224899,2021.05.11 06:50:24.899,DEBUG,PRETTY_LOGGER,Done! --- job finished\nRun Code Online (Sandbox Code Playgroud)\n如果我的作业至少在晚上运行一次,我就很好,因为它是为了触发更新过程,所以我确实需要设备在更新过程中处于空闲状态。无论如何,我想了解如何确保它能够运行,以及如何模仿它进行测试(例如,我们可以使用打瞌睡模式)。
\n我在 Medium 上的文档(WorkManager will use JobScheduler on API 23+,就是这种情况)中读到了很多相关内容(其中说“空闲”是指设备“hasn\xe2\x80\x99t”)使用了一段时间”)并经历了很多SO问题,似乎没有人知道如何正确测试它。
\n鉴于上述情况,我的问题是:
\n| 归档时间: |
|
| 查看次数: |
805 次 |
| 最近记录: |