| 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> |