Oppo Realme 1 Job Scheduler 定期工作的最小间隔为 1 小时

Posted

技术标签:

【中文标题】Oppo Realme 1 Job Scheduler 定期工作的最小间隔为 1 小时【英文标题】:Oppo Realme1 Job Schduler Min interval for Periodic Work is 1 hr 【发布时间】:2019-01-02 08:50:55 【问题描述】:

目前我正在使用WorkManager 1.0.0-alpha05。我使用下面的code 设置定期工作请求。 当间隔低于 1 小时时,在 Oppo Realme (android 版本 - 8.1.0 , ColorOSVersion V5.0) 作业在1 hr 执行。当间隔大于1 hr 作业在确切时间执行。当间隔小于1 hr 时,作业在1 hr 处执行。

请让我知道所需的任何日志或信息:

Schdule Periodic Job 的代码:

PeriodicWorkRequest uploadWork = new PeriodicWorkRequest.
                Builder(LocationUpdatesJobService.class ,interval, TimeUnit.MILLISECONDS)
                .addTag(Constants.Location.TAG_BACKGROUND_LOCATION_PERIODIC)
                .setConstraints(constraints).build();
            WorkManager.getInstance().enqueueUniquePeriodicWork(
                    Constants.Location.TAG_BACKGROUND_LOCATION_PERIODIC,
                    ExistingPeriodicWorkPolicy.REPLACE, uploadWork);

在所有其他设备中定期工作请求间隔是正确的。在 Oppo Realme 1 工作在1 hr 处执行。

Oppo Realme 1:间隔 15 分钟

我使用以下命令调试 Job Schduler: adb shell dumpsys jobscheduler

JOB #u0a249/18: cc2fc59 com.cygneto.field_sales/androidx.work.impl.background.systemjob.SystemJobService
u0a249 tag=job/com.cygneto.field_sales/androidx.work.impl.background.systemjob.SystemJobService
Source: uid=u0a249 user=0 pkg=com.cygneto.field_sales
JobInfo:
Service: com.cygneto.field_sales/androidx.work.impl.background.systemjob.SystemJobService
PERIODIC: interval=+1h0m0s0ms flex=+21m0s0ms
Requires: charging=false batteryNotLow=false deviceIdle=false
Extras: mParcelledData.dataSize=180
Backoff: policy=1 initial=+30s0ms
Has early constraint
Has late constraint
Required constraints: TIMING_DELAY DEADLINE
Satisfied constraints: APP_NOT_IDLE DEVICE_NOT_DOZING
Unsatisfied constraints: TIMING_DELAY DEADLINE
Doze whitelisted: true
Tracking: TIME
Enqueue time: -9m4s617ms
Run time: earliest=+29m55s383ms, latest=+50m55s383ms
Ready: false (job=false user=true !pending=true !active=true !backingup=true comp=true)

Oppo Realme 1:间隔 1 小时 10 分钟

日志:

JobInfo:
Service: com.cygneto.field_sales/androidx.work.impl.background.systemjob.SystemJobService
PERIODIC: interval=+1h10m0s0ms flex=+1h10m0s0ms
Requires: charging=false batteryNotLow=false deviceIdle=false
Extras: mParcelledData.dataSize=180
Doze whitelisted: true
Tracking: TIME
Enqueue time: -4m19s846ms
Run time: earliest=+1h5m39s833ms, latest=+2h15m39s833ms
Last successful run: 2018-07-25 17:01:23
Ready: false (job=false user=true !pending=true !active=true !backingup=true comp=true)

其他设备:

日志:

JobInfo:
Service:com.cygneto.field_sales/androidx.work.impl.background.systemjob.SystemJobService
    PERIODIC: interval=+15m0s0ms flex=+15m0s0ms
    Requires: charging=false batteryNotLow=false deviceIdle=false
    Tracking: TIME
    Enqueue time: -29s237ms
    Run time: earliest=+14m30s690ms, latest=+29m30s690ms
    Last successful run: 2018-07-25 17:29:19
    Ready: false (job=false user=true !pending=true !active=true !backingup=true comp=true)

我也尝试使用不同的库。我在 Job Scheduler 和 Android-Job 中发现了相同的行为。 作业周期长度为 15 分钟,但执行时间为 1 小时,但是当我尝试使用 Firebase 作业调度程序时 作业以正确的 15 分钟间隔时间执行。

我使用以下命令调试 Job Scheduler 和 Android-Job: adb shell dumpsys 作业调度程序

作业调度器:

间隔:15 分钟 输出:1小时

日志:

JOB #u0a266/1: a0dd846 com.jobscheduler_periodic/com.periodic.JobSchedulerService
    u0a266 tag=*job*/com.jobscheduler_periodic/com.periodic.JobSchedulerService
    Source: uid=u0a266 user=0 pkg=com.jobscheduler_periodic
    JobInfo:
      Service: com.jobscheduler_periodic/com.periodic.JobSchedulerService
      PERIODIC: interval=+1h0m0s0ms flex=+15m0s0ms

Android-Job:

间隔:15 分钟 输出:1小时:

日志:

JOB #u0a266/3: 10c0d65 com.jobscheduler_periodic/com.evernote.android.job.v21.PlatformJobService
    u0a266 tag=*job*/com.jobscheduler_periodic/com.evernote.android.job.v21.PlatformJobService
    Source: uid=u0a266 user=0 pkg=com.jobscheduler_periodic
    JobInfo:
      Service: com.jobscheduler_periodic/com.evernote.android.job.v21.PlatformJobService
      PERIODIC: interval=+1h0m0s0ms flex=+5m0s0ms

Firebase 作业调度程序:

我使用以下命令调试 Firebase 作业调度程序: adb shell "dumpsys 活动服务 GcmService | grep com.jobscheduler_periodic"

间隔:15 分钟 输出:15分钟

日志

u0|com.jobscheduler_periodic: 1
    (scheduled) com.jobscheduler_periodic/com.firebase.jobdispatcher.GooglePlayReceiveru=0 tag="MyJobService" trigger=windows
tart=720s,end=900s,earliest=46s,latest=226s requirements=[NET_CONNECTED,CHARGING] attributes=[RECURRING] scheduled=-673s last_
run=N/A jid=N/A status=PENDING retries=0 client_lib=FIREBASE_JOB_DISPATCHER-1

【问题讨论】:

【参考方案1】:

这恰好是一个 OEM 错误。不幸的是,很难以省电的方式解决这些错误。如果您想要 15 分钟的时间,我建议使用以下解决方法:

使用OneTimeWorkRequest 而不是定期工作请求,并且在第一次执行第一个工作请求时,使用initialDelay15 mins 从worker 内部安排第二个。这基本上会给你你想要的。

【讨论】:

感谢您的回复。我尝试使用 OneTimeWorkRequest 并且工作正常。但是我不明白当我使用firebase作业调度程序作业在正确的时间执行定期作业时。内部firebase作业调度程序不使用作业调度程序安排作业?在作业调度程序中,android-job 当周期性作业少于 1 小时(15,20 分钟)作业在 oppo realme 中以 1 小时执行时,firebase 作业调度程序除外。 FirebaseJobDispatcher 在幕后使用GCMNetworkManager。它不使用JobScheduler 感谢您的回复。我将尝试将 WorkManager 与 FirebaseJobDispatcher (android.arch.work:work-firebase) 一起使用。我将检查何时将 WorkManager 与 FirebaseJobDispatcher 一起使用,而不是在 oppo realme 1 中以 15 分钟间隔或 1 小时执行工作?因此,如果我将 WorkManager 与 FirebaseJobDispatcher 一起使用,而不是所有使用 GCMNetworkManager 的任务计划正确吗? WorkManager 将仅在 SDK_LEVEL 感谢您回答我所有与 FirebaseJobDispatcher、JobScheduler、WorkManager 相关的疑问。

以上是关于Oppo Realme 1 Job Scheduler 定期工作的最小间隔为 1 小时的主要内容,如果未能解决你的问题,请参考以下文章

OPPO realme 2在哪里打开Usb调试模式的简单步骤

OPPO Realme C1在哪里打开USB调试模式的详细教程

2021年全球手机市场最大赢家除了苹果,还有OPPO系

同样对标小米,iQOO的发展已远远落后于realme

OPPO折叠屏,被期待的“颠覆者”

JOB状态与并发