The Firebase JobDispatcher is a library for scheduling background jobs in your Android app. It provides a JobScheduler-compatible API that works on all recent versions of Android (API level 9+) that have Google Play services installed.
What's a JobScheduler?
The JobScheduler is an Android system service available on API levels 21
(Lollipop)+. It provides an API for scheduling units of work (represented by
JobService
subclasses) that will be executed in your app's
process.
Running apps in the background is expensive, which is especially harmful when
they're not actively doing work that's important to the user. That problem is
multiplied when those background services are listening for frequently sent
broadcasts (android.net.conn.CONNECTIVITY_CHANGE
and
android.hardware.action.NEW_PICTURE
are common examples). Even worse, there's
no way of specifying prerequisites for these broadcasts. Listening for
CONNECTIVITY_CHANGE
broadcasts does not guarantee that the device has an
active network connection, only that the connection was recently changed.
In recognition of these issues, the Android framework team created the JobScheduler. This provides developers a simple way of specifying runtime constraints on their jobs. Available constraints include network type, charging state, and idle state.
This library uses the scheduling engine inside Google Play services(formerly the GCM Network Manager component) to provide a backwards compatible (back to Gingerbread) JobScheduler-like API.
This I/O presentation has more information on why background services can be harmful and what you can do about them:
There's more information on upcoming changes to Android's approach to background services on the Android developer preview page.
The FirebaseJobDispatcher currently relies on the scheduling component in Google Play services. Because of that, it won't work on environments without Google Play services installed.
Library | Minimum API | Requires Google Play | Service API1 | Custom retry strategies |
---|---|---|---|---|
Framework JobScheduler | 21 | No | JobScheduler | Yes |
Firebase JobDispatcher | 9 | Yes | JobScheduler | Yes |
evernote/android-job | 14 | No2 | Custom | Yes |
1: Refers to the methods that need to be implemented in the
Service subclass.
2: Uses AlarmManager to support API levels <= 21 if Google
Play services is unavailable.
Add the following to your build.gradle
's dependencies section:
compile 'com.firebase:firebase-jobdispatcher:0.8.3'
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?"
}
}
<service
android:exported="false"
android:name=".MyJobService">
<intent-filter>
<action android:name="com.firebase.jobdispatcher.ACTION_EXECUTE"/>
</intent-filter>
</service>
// Create a new dispatcher using the Google Play driver.
FirebaseJobDispatcher dispatcher = new FirebaseJobDispatcher(new GooglePlayDriver(context));
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);
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);
dispatcher.cancel("my-unique-tag");
dispatcher.cancelAll();
See the CONTRIBUTING.md file.
This library is actively supported by Google engineers. If you encounter any problems, please create an issue in our tracker.
Apache, see the LICENSE file.