Merge "Docs: Job-scheduling doc for new DAC Performance section." into nyc-dev
This commit is contained in:
committed by
Android (Google) Code Review
commit
1f64ea546b
285
docs/html/topic/performance/scheduling.jd
Normal file
285
docs/html/topic/performance/scheduling.jd
Normal file
@@ -0,0 +1,285 @@
|
|||||||
|
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>
|
||||||
Reference in New Issue
Block a user