如何在特定时间将WorkManager OneTimeWorkRequest入队

时间:2018-08-05 11:18:27

标签: java android android-workmanager

我有一种情况,我必须在特定时间使用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);

3 个答案:

答案 0 :(得分:3)

我认为我已经找到了一个简单且可行的解决方案。 它可以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为单位)

答案 1 :(得分:0)

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;
}

答案 2 :(得分:-1)

公认的答案准确无误,但我认为其中有一个细节令人误解
delayToPass = currentTime (in Millis) - specificTimeToTrigger (in Millis) 在我看来,这行不通,应该像:
delayToPass = specificTimeToTrigger (in Millis)-currentTime (in Millis)