JobScheduler
. The JobScheduler
API allows you to specify robust conditions for executing tasks, along with centralized task scheduling across the device for optimal system health. JobScheduler
is the Android framework API for scheduling tasks or work. It first became available in Android 5.0 (API level 21), This is a bit of a challenge for Android phones running pre lollipop especially users from Africa. Today I will discover for an alternative method that can schedule background work same as JobScheduler and that is called Firebase JobDispatcher.Firebase JobDispatcher is an open-source library that provides an API similar to
JobScheduler
in the Android platform. Firebase JobDispatcher serves as a JobScheduler
-compatibility layer for apps targeting versions of Android lower than 5.0 (API level 21).Compared to a custom
SyncAdapter
or the alarm manager
, the JobScheduler supports batch scheduling of jobs. The Android system can combine jobs so that battery consumption is reduced. JobManager makes handling uploads easier as it handles automatically the unreliability of the network. It also survives application restarts. Here are example when you would use this job scheduler:A unit of work is encapsulated by a
JobInfo
object. This object specifies the scheduling criteria. The job scheduler allows to consider the state of the device, e.g., if it is idle or if network is available at the moment. Use the JobInfo.Builder
class to configure how the scheduled task should run. You can schedule the task to run under specific conditions, such as:- Device is charging
- Device is connected to an unmetered network
- Device is idle
- Start before a certain deadline
- Start within a predefined time window, e.g., within the next hour
- Start after a minimal delay, e.g., wait a minimum of 10 minutes
Getting started
Add the following to your
build.gradle
's dependencies section:compile 'com.firebase:firebase-jobdispatcher:0.8.1'
Writing a new JobService
The simplest possible
JobService
:import com.firebase.jobdispatcher.JobParameters;
import com.firebase.jobdispatcher.JobService;
public class MyJobService extends JobService {
@Override
public boolean onStartJob(JobParameters job) {
// Do some work here
return false; // Answers the question: "Is there still work going on?"
}
@Override
public boolean onStopJob(JobParameters job) {
return false; // Answers the question: "Should this job be retried?"
}
}
Adding MyJobService to the Manifest
<service
android:exported="false"
android:name=".MyJobService">
<intent-filter>
<action android:name="com.firebase.jobdispatcher.ACTION_EXECUTE"/>
</intent-filter>
</service>
Creating a Dispatcher
// Create a new dispatcher using the Google Play driver.
FirebaseJobDispatcher dispatcher = new FirebaseJobDispatcher(new GooglePlayDriver(context));
Scheduling a simple job
Job myJob = dispatcher.newJobBuilder()
.setService(MyJobService.class) // the JobService that will be called
.setTag("my-unique-tag") // uniquely identifies the job
.build();
dispatcher.mustSchedule(myJob);
Scheduling a more complex job
Bundle myExtrasBundle = new Bundle();
myExtrasBundle.putString("some_key", "some_value");
Job myJob = dispatcher.newJobBuilder()
// the JobService that will be called
.setService(MyJobService.class)
// uniquely identifies the job
.setTag("my-unique-tag")
// one-off job
.setRecurring(false)
// don't persist past a device reboot
.setLifetime(Lifetime.UNTIL_NEXT_BOOT)
// start between 0 and 60 seconds from now
.setTrigger(Trigger.executionWindow(0, 60))
// don't overwrite an existing job with the same tag
.setReplaceCurrent(false)
// retry with exponential backoff
.setRetryStrategy(RetryStrategy.DEFAULT_EXPONENTIAL)
// constraints that need to be satisfied for the job to run
.setConstraints(
// only run on an unmetered network
Constraint.ON_UNMETERED_NETWORK,
// only run when the device is charging
Constraint.DEVICE_CHARGING
)
.setExtras(myExtrasBundle)
.build();
dispatcher.mustSchedule(myJob);
Cancelling a job
dispatcher.cancel("my-unique-tag");
Cancelling all jobs
dispatcher.cancelAll();