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