如何在特定时间排队 WorkManager OneTimeWorkRequest
How to enqueue WorkManager OneTimeWorkRequest at specific time
我有一个场景,我必须在特定时间使用 WorkManager 向用户发出通知。
我如何在特定时间安排工作,即使用户强制终止应用程序,它也应该显示。或者应用不是 运行.
我目前的代码如下:
Data d = new Data.Builder().putInt(IntentConstants.SCHEDULE_ID, scheduleData.getScheduleID()).build();
OneTimeWorkRequest compressionWork =
new OneTimeWorkRequest.Builder(ScheduleWorker.class)
.setInputData(d)
.build();
WorkManager.getInstance().enqueue(compressionWork);
我想我找到了一个简单有效的解决方案。
它 100% 有效。
我们必须以毫秒为单位获取当前时间,并且需要特定时间以毫秒为单位触发它,然后您必须计算特定时间 - 当前时间。
我有我的解决方案(下面的工作代码):
Data d = new Data.Builder()
.putInt(IntentConstants.SCHEDULE_ID, scheduleData.getScheduleID())
.build();
long currentTime= System.currentTimeMillis();
long specificTimeToTrigger = c.getTimeInMillis();
long delayToPass = specificTimeToTrigger - currentTime;
OneTimeWorkRequest compressionWork =
new OneTimeWorkRequest.Builder(ScheduleWorker.class)
.setInputData(d)
.setInitialDelay(delayToPass, TimeUnit.MILLISECONDS)
.build();
WorkManager.getInstance().enqueue(compressionWork);
主要逻辑在 delayToPass = currentTime(以 Millis 为单位) - specificTimeToTrigger(以 Millis 为单位)
接受的答案是准确的,但我认为有一个小细节具有误导性
delayToPass = currentTime (in Millis) - specificTimeToTrigger (in Millis)
这在我看来是行不通的,它应该是这样的:
delayToPass = specificTimeToTrigger (in Millis)-currentTime (in Millis)
long currentTime= System.currentTimeMillis();
long specificTimeToTrigger = c.getTimeInMillis();
long delayToPass = specificTimeToTrigger - currentTime;
OneTimeWorkRequest compressionWork =
new OneTimeWorkRequest.Builder(ScheduleWorker.class)
.setInitialDelay(delayToPass, TimeUnit.MILLISECONDS)
.build();
WorkManager.getInstance().enqueue(compressionWork);
当所选时间>当前时间时,在所选时间正确触发。
如果选择的时间 < 当前时间它立即触发。
为了克服立即触发,如果选择的时间小于当前时间,您可以使用以下条件在第二天触发。
if ((specificTimeToTrigger - currentTime) < 0) {
delayToPass = (86400000)-(currentTime - specificTimeToTrigger);
//24hr-(currentTime - specificTimeToTrigger)
} else {
delayToPass = specificTimeToTrigger - currentTime;
}
我有一个场景,我必须在特定时间使用 WorkManager 向用户发出通知。
我如何在特定时间安排工作,即使用户强制终止应用程序,它也应该显示。或者应用不是 运行.
我目前的代码如下:
Data d = new Data.Builder().putInt(IntentConstants.SCHEDULE_ID, scheduleData.getScheduleID()).build();
OneTimeWorkRequest compressionWork =
new OneTimeWorkRequest.Builder(ScheduleWorker.class)
.setInputData(d)
.build();
WorkManager.getInstance().enqueue(compressionWork);
我想我找到了一个简单有效的解决方案。 它 100% 有效。
我们必须以毫秒为单位获取当前时间,并且需要特定时间以毫秒为单位触发它,然后您必须计算特定时间 - 当前时间。
我有我的解决方案(下面的工作代码):
Data d = new Data.Builder()
.putInt(IntentConstants.SCHEDULE_ID, scheduleData.getScheduleID())
.build();
long currentTime= System.currentTimeMillis();
long specificTimeToTrigger = c.getTimeInMillis();
long delayToPass = specificTimeToTrigger - currentTime;
OneTimeWorkRequest compressionWork =
new OneTimeWorkRequest.Builder(ScheduleWorker.class)
.setInputData(d)
.setInitialDelay(delayToPass, TimeUnit.MILLISECONDS)
.build();
WorkManager.getInstance().enqueue(compressionWork);
主要逻辑在 delayToPass = currentTime(以 Millis 为单位) - specificTimeToTrigger(以 Millis 为单位)
接受的答案是准确的,但我认为有一个小细节具有误导性
delayToPass = currentTime (in Millis) - specificTimeToTrigger (in Millis)
这在我看来是行不通的,它应该是这样的:
delayToPass = specificTimeToTrigger (in Millis)-currentTime (in Millis)
long currentTime= System.currentTimeMillis();
long specificTimeToTrigger = c.getTimeInMillis();
long delayToPass = specificTimeToTrigger - currentTime;
OneTimeWorkRequest compressionWork =
new OneTimeWorkRequest.Builder(ScheduleWorker.class)
.setInitialDelay(delayToPass, TimeUnit.MILLISECONDS)
.build();
WorkManager.getInstance().enqueue(compressionWork);
当所选时间>当前时间时,在所选时间正确触发。 如果选择的时间 < 当前时间它立即触发。
为了克服立即触发,如果选择的时间小于当前时间,您可以使用以下条件在第二天触发。
if ((specificTimeToTrigger - currentTime) < 0) {
delayToPass = (86400000)-(currentTime - specificTimeToTrigger);
//24hr-(currentTime - specificTimeToTrigger)
} else {
delayToPass = specificTimeToTrigger - currentTime;
}