I need to build a background task that runs every 10/15 minutes (doesn\'t really matter, either is good), even when the application is not running.
How can I accompl
Work manager is actually the best thing to do with periodically repeat, their default is 15 minutes which exactly like you need. Here is an example:
final PeriodicWorkRequest periodicWorkRequest
= new PeriodicWorkRequest.Builder(ApiWorker.class, 15, TimeUnit.MINUTES)
.build();
WorkManager.getInstance().enqueue(periodicWorkRequest);
Where ApiWorker is just the following class:
public class ApiWorker extends Worker implements iOnApiRequestSuccessful {
public ApiWorker(@NonNull Context context, @NonNull WorkerParameters workerParams) {
super(context, workerParams);
}
@NonNull
@Override
public Result doWork() {
return Result.success();
}
}
And fill whatever work you want to be done in the doWork() function before the return with success.
Return.success() makes it inserted to the queue again so it will be repeated every 15 minutes.
The best approach was introduced at Google I/O 2018 - WorkManager.
You can find documentation here.
You have have detemined the amount of time (interval) to execute a snippet of code, its better to use AlarmManager because its more energy effient. If your app needs to listen to some sort of a event , then Service is what you need.
public static void registerAlarm(Context context) {
Intent i = new Intent(context, YOURBROADCASTRECIEVER.class);
PendingIntent sender = PendingIntent.getBroadcast(context,REQUEST_CODE, i, 0);
// We want the alarm to go off 3 seconds from now.
long firstTime = SystemClock.elapsedRealtime();
firstTime += 3 * 1000;//start 3 seconds after first register.
// Schedule the alarm!
AlarmManager am = (AlarmManager) context
.getSystemService(ALARM_SERVICE);
am.setRepeating(AlarmManager.ELAPSED_REALTIME_WAKEUP, firstTime,
600000, sender);//10min interval
}
Alarm Manager (system service) vs Remote Service with inner alarm implementation (separate process)?
Alarm Manager is your choice, because it already has what you need, you just have to set alarm intervals
You can also achieve this via a SyncAdapter Here's a sample for your to look at and get inspired
SyncAdapter sample