我开发了一个应用程序,其主要目的是使用 zxing 库读取一些 QR 码。 这很好用。
我的问题来自 workmanager 和预定的工作。我有一个班级,在那里我开始与工作经理一起工作,该工作应该在早上 8 点每 24 小时开始一次。稳定开始时间的代码来自此链接https://stackoverflow.com/questions/50363541/schedule-a-work-on-a-specific-time-with-workmanager
long delay;
int SELF_REMINDER_HOUR = 8;
if (DateTime.now().getHourOfDay() < SELF_REMINDER_HOUR) {
delay = new Duration(DateTime.now(), DateTime.now().withTimeAtStartOfDay().plusHours(SELF_REMINDER_HOUR)).getStandardMinutes();
} else {
delay = new Duration(DateTime.now(), DateTime.now().withTimeAtStartOfDay().plusDays(1).plusHours(SELF_REMINDER_HOUR)).getStandardMinutes();
}
long minPeriodicFlexMillis = PeriodicWorkRequest.MIN_PERIODIC_FLEX_MILLIS;//5 minutos
long minPeriodicIntervalMillis = PeriodicWorkRequest.MIN_PERIODIC_INTERVAL_MILLIS;//15 minutos
//Establecemos las condiciones de ejecución de la tarea programada. En este caso que haya conexión.
Constraints condiciones = new Constraints.Builder().setRequiredNetworkType(NetworkType.CONNECTED).build();
PeriodicWorkRequest peticionPeriodica = new PeriodicWorkRequest.Builder(ComprobarRonda.class, 24, TimeUnit.HOURS, PeriodicWorkRequest.MIN_PERIODIC_FLEX_MILLIS, TimeUnit.MILLISECONDS)
.addTag("TareaPeriodica_hora")
.setConstraints(condiciones)
.setInitialDelay(delay, TimeUnit.MINUTES)//para que se ejecute siempre a las 8 de la mañana
.build();
WorkManager workManager = WorkManager.getInstance(application);
workManager.enqueueUniquePeriodicWork("comprobarRonda", ExistingPeriodicWorkPolicy.KEEP, peticionPeriodica);
ComprobarRonda 类扩展了 Worker 类,重写的 doWork 方法读取存储在领域数据库中的二维码并通过电子邮件发送。
首先,我禁用了我的应用程序的电池优化并启用了自动启动,以便即使在手机锁定的情况下也可以启动工作。
在将应用程序投入生产之前,我以 15 分钟为周期并且没有延迟地测试了时间表。起初它工作正常但在很多情况下频率大于 15 分钟,但它工作。
但是,当我以24小时为周期启动它时,它没有用,并且没有发送电子邮件。
项目使用的手机是alcatel 1,非常基础。