286 lines
12 KiB
Plaintext
286 lines
12 KiB
Plaintext
page.title=Intelligent Job-Scheduling
|
||
@jd:body
|
||
|
||
<div id="qv-wrapper">
|
||
<div id="qv">
|
||
|
||
<h2>In this document</h2>
|
||
<ol>
|
||
<li><a href="#js">Android Framework JobScheduler</a></li>
|
||
<li><a href="#am">AlarmManager</a></li>
|
||
<li><a href="#fjd">Firebase JobDispatcher</a></li>
|
||
<li><a href="#gcmnm">GCM Network Manager</a></li>
|
||
<li><a href="#af">Additional Facilities</a></li>
|
||
<ul>
|
||
<li><a href="#sa">SyncAdapter</a></li>
|
||
<li><a href="#services">Services</a></li>
|
||
</ul>
|
||
<li><a href="#ap">Additional Points</a></li>
|
||
</ol>
|
||
|
||
</div>
|
||
</div>
|
||
|
||
<p>
|
||
Modern apps can perform many of their tasks asynchronously, outside the
|
||
direct flow of user interaction. Some examples of these asynchronous tasks are:
|
||
</p>
|
||
|
||
<ul>
|
||
<li>Updating network resources.</li>
|
||
<li>Downloading information.</li>
|
||
<li>Updating background tasks.</li>
|
||
<li>Scheduling system service calls.</li>
|
||
</ul>
|
||
|
||
<p>
|
||
Scheduling this work intelligently can improve your app’s performance,
|
||
along with aspects of system health such as battery life. {@link android.app.job.JobScheduler}
|
||
does this scheduling work for you.
|
||
<p>
|
||
|
||
<p>
|
||
There are several APIs that your app can use to schedule background work. Chief
|
||
among these options is {@link android.app.job.JobScheduler}.
|
||
The {@link android.app.job.JobScheduler} API allows you to specify robust
|
||
conditions for executing tasks,
|
||
along with centralized task scheduling across the device for optimal
|
||
system health. {@link android.app.job.JobScheduler} also offers highly
|
||
scalable functionality: it is suitable for small tasks like clearing a cache,
|
||
and for large ones such as syncing a database to the cloud.
|
||
<p>
|
||
|
||
<p>
|
||
In addition to {@link android.app.job.JobScheduler}, there are several other
|
||
facilities available to help your app schedule work. These include:
|
||
</p>
|
||
|
||
<ul>
|
||
<li><a href="{@docRoot}reference/android/app/AlarmManager.html">AlarmManager
|
||
</a></li>
|
||
<li><a href="https://github.com/firebase/firebase-jobdispatcher-android#user-content-firebase-jobdispatcher-">
|
||
Firebase JobDispatcher</a></li>
|
||
<li><a href="https://developers.google.com/cloud-messaging/network-manager">
|
||
GCM Network Manager</a></li>
|
||
<li><a href="{@docRoot}reference/android/content/AbstractThreadedSyncAdapter.html">
|
||
SyncAdapter</a></li>
|
||
<li><a href="{@docRoot}reference/android/content/AbstractThreadedSyncAdapter.html">
|
||
Additional Facilities</a></li>
|
||
</ul>
|
||
|
||
<p>
|
||
This page provides brief introductions to {@link android.app.job.JobScheduler}
|
||
and other APIs that can help your app schedule work to maximize app performance
|
||
and system health.
|
||
</p>
|
||
|
||
<h2 id="js">Android Framework JobScheduler</h2>
|
||
|
||
<p>
|
||
{@link android.app.job.JobScheduler} is the Android framework’s native platform
|
||
for scheduling tasks or work. It first became available in Android 5.0 (API
|
||
level 21), and remains under active development. Notably, Android N (API
|
||
level 24) added the ability to trigger jobs based on
|
||
{@link android.content.ContentProvider} changes.
|
||
</p>
|
||
|
||
<p>
|
||
{@link android.app.job.JobScheduler} is implemented in the platform, which
|
||
allows it to collect information about jobs that need to run across all apps.
|
||
This information is used to schedule jobs to run at, or around, the same time.
|
||
Batching job execution in this fashion allows the device to enter and stay in
|
||
sleep states longer, preserving battery life.
|
||
</p>
|
||
|
||
<p>
|
||
You use {@link android.app.job.JobScheduler} by registering jobs, specifying
|
||
their requirements for network and timing. The system then gracefully schedules
|
||
the jobs to execute at the appropriate times. At the same time, it also defers
|
||
job execution as necessary to comply with
|
||
<a href="{@docRoot}topic/performance/monitoring-device-state/doze-standby.html">
|
||
Doze and App Standby</a> restrictions.
|
||
{@link android.app.job.JobScheduler} provides many methods to define
|
||
job-execution conditions.
|
||
</p>
|
||
|
||
<p>
|
||
If your app targets Android 5.0 (API level 21), we recommend that you use the
|
||
{@link android.app.job.JobScheduler} to execute background tasks. For more
|
||
information about {@link android.app.job.JobScheduler}, see its
|
||
<a href="{@docRoot}reference/android/app/job/JobScheduler.html">API-reference
|
||
documentation.</a>
|
||
</p>
|
||
|
||
<h2 id="am">AlarmManager</h2>
|
||
|
||
<p>
|
||
The {@link android.app.AlarmManager} API is another option that the framework
|
||
provides for scheduling tasks. This API is useful in cases in which an app
|
||
needs to post a notification or set off an alarm at a very specific time.
|
||
</p>
|
||
|
||
<p>
|
||
You should only use this API for tasks that must execute at a specific time,
|
||
but do not require the other, more robust, execution conditions that
|
||
{@link android.app.job.JobScheduler} allows you to specify, such as device
|
||
idle and charging detect.
|
||
</p>
|
||
|
||
<p>
|
||
{@link android.app.AlarmManager} does not honor
|
||
<a href="{@docRoot}topic/performance/monitoring-device-state/doze-standby.html">
|
||
Doze and App Standby</a> restrictions; it runs tasks even during
|
||
<a href="{@docRoot}topic/performance/monitoring-device-state/doze-standby.html">
|
||
Doze or App Standby</a> mode. Additionally,
|
||
an app running during
|
||
<a href="{@docRoot}topic/performance/monitoring-device-state/doze-standby.html">
|
||
Doze or App Standby</a> mode cannot use the network.
|
||
</p>
|
||
|
||
<h2 id="fjd">Firebase JobDispatcher</h2>
|
||
|
||
<p>
|
||
<a href="https://github.com/firebase/firebase-jobdispatcher-android#user-content-firebase-jobdispatcher-">
|
||
Firebase JobDispatcher</a> is an open-source library that provides an API similar to
|
||
{@link android.app.job.JobScheduler} in the Android platform.
|
||
<a href="https://github.com/firebase/firebase-jobdispatcher-android#user-content-firebase-jobdispatcher-">
|
||
Firebase JobDispatcher</a> serves as a
|
||
{@link android.app.job.JobScheduler}-compatibility layer for apps targeting
|
||
versions of Android lower than 5.0 (API level 21).
|
||
</p>
|
||
|
||
<p>
|
||
<a href="https://github.com/firebase/firebase-jobdispatcher-android#user-content-firebase-jobdispatcher-">
|
||
Firebase JobDispatcher</a> supports the use of Google Play services as an
|
||
implementation for dispatching (running) jobs, but the library also allows you
|
||
to define and use other implementations: For example, you might decide to use
|
||
{@link android.app.job.JobScheduler} or write your own, custom code.
|
||
Because of this versatility, we recommend that you use this
|
||
<a href="https://github.com/firebase/firebase-jobdispatcher-android#user-content-firebase-jobdispatcher-">
|
||
Firebase JobDispatcher</a> if your app targets a version of Android lower
|
||
than 5.0 (API level 21).
|
||
</p>
|
||
|
||
<p>
|
||
For more information about
|
||
<a href="https://github.com/firebase/firebase-jobdispatcher-android#user-content-firebase-jobdispatcher-">
|
||
Firebase JobDispatcher</a>, refer to its
|
||
<a href="https://github.com/firebase/firebase-jobdispatcher-android#user-content-firebase-jobdispatcher-">
|
||
documentation and source code</a>.
|
||
</p>
|
||
|
||
<h2 id = "gcmnm">GCM Network Manager</h2>
|
||
|
||
<p>
|
||
<a href="https://developers.google.com/cloud-messaging/network-manager">GCM
|
||
Network Manager</a> is a compatibility port of the Android
|
||
{@link android.app.job.JobScheduler} for apps that support versions of Android
|
||
prior to 5.0 (API level 21). This API has all of the same advantages as
|
||
{@link android.app.job.JobScheduler}. However, it depends on Google Play
|
||
services, which acts like {@link android.app.job.JobScheduler} by taking care
|
||
of cross-app job scheduling to improve battery life. This client library is
|
||
part of the Google Play services GCM client library, but does not require
|
||
that an app use
|
||
<a href="https://developers.google.com/cloud-messaging/">Google Cloud
|
||
Messaging</a>.
|
||
</p>
|
||
|
||
<p>
|
||
This library is an earlier version of
|
||
<a href="https://github.com/firebase/firebase-jobdispatcher-android#user-content-firebase-jobdispatcher-">
|
||
Firebase JobDispatcher</a>. Forward development on GCM Network Manager has
|
||
stopped; we recommend that you use
|
||
<a href="https://github.com/firebase/firebase-jobdispatcher-android#user-content-firebase-jobdispatcher-">
|
||
Firebase JobDispatcher</a> going forward.
|
||
</p>
|
||
|
||
<h2 id="af">Additional Facilities</h2>
|
||
|
||
<p>
|
||
In addition to the APIs and libraries described above, there are also sync
|
||
adapters and services that can enable your app, under specific conditions,
|
||
to perform better and more robustly.
|
||
</p>
|
||
|
||
<h3 id="sa">SyncAdapter</h3>
|
||
|
||
<p>
|
||
The framework continues to provide the
|
||
{@link android.content.AbstractThreadedSyncAdapter SyncAdapter} class for
|
||
managing tasks that sync data between the device and a server. Sync adapters are
|
||
designed specifically for syncing data between a device and the cloud; you
|
||
should only use them for this type of task. Sync adapters are more complex to
|
||
implement than the libraries and APIs mentioned above, because they require at
|
||
least a fake
|
||
<a href="{@docRoot}training/sync-adapters/creating-authenticator.html">
|
||
authenticator</a>and
|
||
<a href="{@docRoot}training/sync-adapters/creating-stub-provider.html">
|
||
content provider</a> implementation. For these reasons, you typically should
|
||
not create a sync adapter just to sync data to the cloud in the
|
||
background. Wherever possible, you should instead use
|
||
{@link android.app.job.JobScheduler},
|
||
<a href="https://github.com/firebase/firebase-jobdispatcher-android#user-content-firebase-jobdispatcher-">
|
||
Firebase JobDispatcher</a>, or
|
||
<a href="https://developers.google.com/cloud-messaging/network-manager">GCM
|
||
Network Manager</a> .
|
||
</p>
|
||
|
||
<p>
|
||
In Android N (API level 24), the {@code SyncManager} sits on top of
|
||
the {@link android.app.job.JobScheduler}. You should only use the
|
||
{@link android.content.AbstractThreadedSyncAdapter SyncAdapter}
|
||
class if you require the additional functionality that it provides.
|
||
</p>
|
||
|
||
<h3 id="services">Services</h3>
|
||
|
||
<p>
|
||
The <a href="{@docRoot}guide/components/services.html">Services</a>
|
||
framework allows you to perform long-running operations in the background.
|
||
We recommend foreground services for tasks, such as playing
|
||
music, which need to stay resident for the user. Bound services also continue
|
||
to be useful for various use cases: for example, when a service needs to
|
||
run only when a user is viewing a fragment or activity.
|
||
</p>
|
||
|
||
<p>
|
||
You should avoid using started services that run perpetually or
|
||
perform periodic work, since they continue to use device resources
|
||
even when they are not performing useful tasks. Instead, you
|
||
should use other solutions that this page describes,
|
||
and that provide native lifecycle management. Use started services
|
||
only as a last resort. The Android platform may not support
|
||
started services in the future.
|
||
</p>
|
||
|
||
<h2 id="ap">Additional Points</h2>
|
||
|
||
<p>
|
||
Regardless of the solution you adopt, keep the following points in mind:
|
||
</p>
|
||
|
||
<ul>
|
||
<li>Captive Internet Portals, VPNs, and proxies can pose
|
||
Internet-connectivity detection problems. A library or API may think the
|
||
Internet is available, but your service may not be accessible. Fail
|
||
gracefully and reschedule as few of your tasks as possible.</li>
|
||
<li>Depending on the conditions you assign for running a task,
|
||
such as network availability, after the task is triggered, a
|
||
change may occur so that those conditions are no longer met.
|
||
In such a case, your operation may fail unexpectedly and repeatedly.
|
||
For this reason, you
|
||
should code your background task logic to notice when tasks are failing
|
||
persistently, and perform exponential back-off to avoid
|
||
inadvertently over-using resources.</li>
|
||
|
||
|
||
|
||
<li>Remember to use exponential backoff when rescheduling any work,
|
||
especially when using {@link android.app.AlarmManager}. If your app uses
|
||
{@link android.app.job.JobScheduler},
|
||
<a href="https://developers.google.com/cloud-messaging/network-manager">GCM
|
||
Network Manager</a>,
|
||
<a href="https://github.com/firebase/firebase-jobdispatcher-android#user-content-firebase-jobdispatcher-">
|
||
Firebase JobDispatcher</a>, or sync adapters, exponential backoff is automatically used.</li>
|
||
</ul>
|