Reputation: 6788
I have a scenario where i have to give user notification using WorkManager at specific time.
How can i schedule Work at specific time, and it should show up even if user force kills the app. or app is not running.
My Current code is as below :
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);
Upvotes: 4
Views: 5208
Reputation: 1
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);
It's trigger correct on selected time when selected time > current time. If selected time < current time it triggers immediate.
To overcome immediate trigger, You can use below condition to trigger next day if selected selected time is less than current time.
if ((specificTimeToTrigger - currentTime) < 0) {
delayToPass = (86400000)-(currentTime - specificTimeToTrigger);
//24hr-(currentTime - specificTimeToTrigger)
} else {
delayToPass = specificTimeToTrigger - currentTime;
}
Upvotes: 0
Reputation: 6788
I think i have found an easy and working solution. It works 100%.
We have to get current time in milliseconds and required specific time to trigger it in milliseconds then you have to calculate specific time - current time.
I have my solution (working code below) :
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);
Main Logic is in the delayToPass = currentTime (in Millis) - specificTimeToTrigger (in Millis)
Upvotes: 9