CINXE.COM

WorkManager  |  Jetpack  |  Android Developers

<!doctype html> <html lang="en" dir="ltr"> <head> <meta name="google-signin-client-id" content="721724668570-nbkv1cfusk7kk4eni4pjvepaus73b13t.apps.googleusercontent.com"> <meta name="google-signin-scope" content="profile email https://www.googleapis.com/auth/developerprofiles https://www.googleapis.com/auth/developerprofiles.award"> <meta property="og:site_name" content="Android Developers"> <meta property="og:type" content="website"><meta name="theme-color" content="#34a853"><meta charset="utf-8"> <meta content="IE=Edge" http-equiv="X-UA-Compatible"> <meta name="viewport" content="width=device-width, initial-scale=1"> <link rel="manifest" href="/_pwa/android/manifest.json" crossorigin="use-credentials"> <link rel="preconnect" href="//www.gstatic.com" crossorigin> <link rel="preconnect" href="//fonts.gstatic.com" crossorigin> <link rel="preconnect" href="//fonts.googleapis.com" crossorigin> <link rel="preconnect" href="//apis.google.com" crossorigin> <link rel="preconnect" href="//www.google-analytics.com" crossorigin><link rel="stylesheet" href="//fonts.googleapis.com/css?family=Google+Sans:400,500,600,700|Google+Sans+Text:400,400italic,500,500italic,600,600italic,700,700italic|Roboto+Mono:400,500,700&display=swap"> <link rel="stylesheet" href="//fonts.googleapis.com/css2?family=Material+Icons&family=Material+Symbols+Outlined&display=block"><link rel="stylesheet" href="https://www.gstatic.com/devrel-devsite/prod/v870e399c64f7c43c99a3043db4b3a74327bb93d0914e84a0c3dba90bbfd67625/android/css/app.css"> <link rel="stylesheet" href="https://www.gstatic.com/devrel-devsite/prod/v870e399c64f7c43c99a3043db4b3a74327bb93d0914e84a0c3dba90bbfd67625/android/css/dark-theme.css" disabled> <link rel="shortcut icon" href="https://www.gstatic.com/devrel-devsite/prod/v870e399c64f7c43c99a3043db4b3a74327bb93d0914e84a0c3dba90bbfd67625/android/images/favicon.svg"> <link rel="apple-touch-icon" href="https://www.gstatic.com/devrel-devsite/prod/v870e399c64f7c43c99a3043db4b3a74327bb93d0914e84a0c3dba90bbfd67625/android/images/touchicon-180.png"><link rel="canonical" href="https://developer.android.com/jetpack/androidx/releases/work"><link rel="search" type="application/opensearchdescription+xml" title="Android Developers" href="https://developer.android.com/s/opensearch.xml"> <link rel="alternate" hreflang="en" href="https://developer.android.com/jetpack/androidx/releases/work" /><link rel="alternate" hreflang="x-default" href="https://developer.android.com/jetpack/androidx/releases/work" /><link rel="alternate" hreflang="ar" href="https://developer.android.com/jetpack/androidx/releases/work?hl=ar" /><link rel="alternate" hreflang="bn" href="https://developer.android.com/jetpack/androidx/releases/work?hl=bn" /><link rel="alternate" hreflang="zh-Hans" href="https://developer.android.com/jetpack/androidx/releases/work?hl=zh-cn" /><link rel="alternate" hreflang="zh-Hant" href="https://developer.android.com/jetpack/androidx/releases/work?hl=zh-tw" /><link rel="alternate" hreflang="fa" href="https://developer.android.com/jetpack/androidx/releases/work?hl=fa" /><link rel="alternate" hreflang="fr" href="https://developer.android.com/jetpack/androidx/releases/work?hl=fr" /><link rel="alternate" hreflang="de" href="https://developer.android.com/jetpack/androidx/releases/work?hl=de" /><link rel="alternate" hreflang="he" href="https://developer.android.com/jetpack/androidx/releases/work?hl=he" /><link rel="alternate" hreflang="hi" href="https://developer.android.com/jetpack/androidx/releases/work?hl=hi" /><link rel="alternate" hreflang="id" href="https://developer.android.com/jetpack/androidx/releases/work?hl=id" /><link rel="alternate" hreflang="it" href="https://developer.android.com/jetpack/androidx/releases/work?hl=it" /><link rel="alternate" hreflang="ja" href="https://developer.android.com/jetpack/androidx/releases/work?hl=ja" /><link rel="alternate" hreflang="ko" href="https://developer.android.com/jetpack/androidx/releases/work?hl=ko" /><link rel="alternate" hreflang="pl" href="https://developer.android.com/jetpack/androidx/releases/work?hl=pl" /><link rel="alternate" hreflang="pt-BR" href="https://developer.android.com/jetpack/androidx/releases/work?hl=pt-br" /><link rel="alternate" hreflang="ru" href="https://developer.android.com/jetpack/androidx/releases/work?hl=ru" /><link rel="alternate" hreflang="es-419" href="https://developer.android.com/jetpack/androidx/releases/work?hl=es-419" /><link rel="alternate" hreflang="th" href="https://developer.android.com/jetpack/androidx/releases/work?hl=th" /><link rel="alternate" hreflang="tr" href="https://developer.android.com/jetpack/androidx/releases/work?hl=tr" /><link rel="alternate" hreflang="vi" href="https://developer.android.com/jetpack/androidx/releases/work?hl=vi" /><title>WorkManager &nbsp;|&nbsp; Jetpack &nbsp;|&nbsp; Android Developers</title> <meta property="og:title" content="WorkManager &nbsp;|&nbsp; Jetpack &nbsp;|&nbsp; Android Developers"><meta property="og:url" content="https://developer.android.com/jetpack/androidx/releases/work"><meta property="og:image" content="https://developer.android.com/static/images/social/android-developers.png"> <meta property="og:image:width" content="1200"> <meta property="og:image:height" content="675"><meta property="og:locale" content="en"><meta name="twitter:card" content="summary_large_image"><script type="application/ld+json"> { "@context": "https://schema.org", "@type": "Article", "headline": "WorkManager" } </script><script type="application/ld+json"> { "@context": "https://schema.org", "@type": "BreadcrumbList", "itemListElement": [{ "@type": "ListItem", "position": 1, "name": "Get started", "item": "https://developer.android.com/get-started/overview" },{ "@type": "ListItem", "position": 2, "name": "Jetpack", "item": "https://developer.android.com/jetpack" },{ "@type": "ListItem", "position": 3, "name": "WorkManager", "item": "https://developer.android.com/jetpack/androidx/releases/work" }] } </script> <link rel="stylesheet" href="/extras.css"></head> <body class="" template="page" theme="android-theme" type="article" appearance layout="docs" display-toc pending> <devsite-progress type="indeterminate" id="app-progress"></devsite-progress> <section class="devsite-wrapper"> <devsite-cookie-notification-bar></devsite-cookie-notification-bar><devsite-header role="banner"> <div class="devsite-header--inner nocontent"> <div class="devsite-top-logo-row-wrapper-wrapper"> <div class="devsite-top-logo-row-wrapper"> <div class="devsite-top-logo-row"> <button type="button" id="devsite-hamburger-menu" class="devsite-header-icon-button button-flat material-icons gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Navigation menu button" visually-hidden aria-label="Open menu"> </button> <div class="devsite-product-name-wrapper"> <a href="/" class="devsite-site-logo-link gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Site logo" track-type="globalNav" track-name="androidDevelopers" track-metadata-position="nav" track-metadata-eventDetail="nav"> <picture> <source srcset="https://www.gstatic.com/devrel-devsite/prod/v870e399c64f7c43c99a3043db4b3a74327bb93d0914e84a0c3dba90bbfd67625/android/images/lockup-dark-theme.svg" media="(prefers-color-scheme: dark)" class="devsite-dark-theme" alt="Android Developers"> <img src="https://www.gstatic.com/devrel-devsite/prod/v870e399c64f7c43c99a3043db4b3a74327bb93d0914e84a0c3dba90bbfd67625/android/images/lockup.svg" class="devsite-site-logo" alt="Android Developers"> </picture> </a> <span class="devsite-product-name"> <ul class="devsite-breadcrumb-list" > <li class="devsite-breadcrumb-item "> </li> </ul> </span> </div> <div class="devsite-top-logo-row-middle"> <div class="devsite-header-upper-tabs"> <devsite-tabs class="upper-tabs"> <nav class="devsite-tabs-wrapper" aria-label="Upper tabs"> <tab class="devsite-dropdown devsite-dropdown-full devsite-active "> <a href="https://developer.android.com/jetpack" track-metadata-eventdetail="https://developer.android.com/jetpack" class="devsite-tabs-content gc-analytics-event android-dropdown-tab" track-type="nav" track-metadata-position="nav - essentials" track-metadata-module="primary nav" aria-label="Essentials, selected" data-category="Site-Wide Custom Events" data-label="Tab: Essentials" track-name="essentials" > Essentials </a> <a href="#" role="button" aria-haspopup="true" aria-expanded="false" aria-label="Dropdown menu for Essentials" track-type="nav" track-metadata-eventdetail="https://developer.android.com/jetpack" track-metadata-position="nav - essentials" track-metadata-module="primary nav" data-category="Site-Wide Custom Events" data-label="Tab: Essentials" track-name="essentials" class="devsite-tabs-dropdown-toggle devsite-icon devsite-icon-arrow-drop-down"></a> <div class="devsite-tabs-dropdown" aria-label="submenu" hidden> <div class="devsite-tabs-dropdown-content"> <div class="devsite-tabs-dropdown-column android-dropdown android-dropdown-primary android-dropdown-studio"> <ul class="devsite-tabs-dropdown-section "> <li class="devsite-nav-title" role="heading" tooltip>Gemini in Android Studio</li> <li class="devsite-nav-description">Your AI development companion for Android development. </li> <li class="devsite-nav-item"> <a href="https://developer.android.com/gemini-in-android" track-type="nav" track-metadata-eventdetail="https://developer.android.com/gemini-in-android" track-metadata-position="nav - essentials" track-metadata-module="tertiary nav" track-metadata-module_headline="gemini in android studio" tooltip class="button button-primary" > <div class="devsite-nav-item-title"> Learn more </div> </a> </li> <li class="devsite-nav-item"> <a href="https://developer.android.com/studio" track-type="nav" track-metadata-eventdetail="https://developer.android.com/studio" track-metadata-position="nav - essentials" track-metadata-module="tertiary nav" track-metadata-module_headline="gemini in android studio" tooltip class="button button-white" > <div class="devsite-nav-item-title"> Get Android Studio </div> </a> </li> </ul> </div> <div class="devsite-tabs-dropdown-column android-dropdown"> <ul class="devsite-tabs-dropdown-section android-dropdown-section-icon android-dropdown-section-icon-launch"> <li class="devsite-nav-title" role="heading" tooltip>Get started</li> <li class="devsite-nav-description">Start by creating your first app. Go deeper with our training courses or explore app development on your own. </li> <li class="devsite-nav-item"> <a href="https://developer.android.com/get-started/overview" track-type="nav" track-metadata-eventdetail="https://developer.android.com/get-started/overview" track-metadata-position="nav - essentials" track-metadata-module="tertiary nav" track-metadata-module_headline="get started" tooltip > <div class="devsite-nav-item-title"> Hello world </div> </a> </li> <li class="devsite-nav-item"> <a href="https://developer.android.com/courses" track-type="nav" track-metadata-eventdetail="https://developer.android.com/courses" track-metadata-position="nav - essentials" track-metadata-module="tertiary nav" track-metadata-module_headline="get started" tooltip > <div class="devsite-nav-item-title"> Training courses </div> </a> </li> <li class="devsite-nav-item"> <a href="https://developer.android.com/get-started/codelabs" track-type="nav" track-metadata-eventdetail="https://developer.android.com/get-started/codelabs" track-metadata-position="nav - essentials" track-metadata-module="tertiary nav" track-metadata-module_headline="get started" tooltip > <div class="devsite-nav-item-title"> Tutorials </div> </a> </li> <li class="devsite-nav-item"> <a href="https://developer.android.com/kotlin" track-type="nav" track-metadata-eventdetail="https://developer.android.com/kotlin" track-metadata-position="nav - essentials" track-metadata-module="tertiary nav" track-metadata-module_headline="get started" tooltip > <div class="devsite-nav-item-title"> Kotlin for Android </div> </a> </li> <li class="devsite-nav-item"> <a href="https://play.google.com/console/about/guides/monetize/" track-type="nav" track-metadata-eventdetail="https://play.google.com/console/about/guides/monetize/" track-metadata-position="nav - essentials" track-metadata-module="tertiary nav" track-metadata-module_headline="get started" tooltip > <div class="devsite-nav-item-title"> Monetization with Play ↗️ </div> </a> </li> </ul> </div> <div class="devsite-tabs-dropdown-column android-dropdown"> <ul class="devsite-tabs-dropdown-section android-dropdown-section-icon android-dropdown-section-icon-multiple-screens"> <li class="devsite-nav-title" role="heading" tooltip>Extend by device</li> <li class="devsite-nav-description">Build apps that give your users seamless experiences from phones to tablets, watches, and more. </li> <li class="devsite-nav-item"> <a href="https://developer.android.com/adaptive-apps" track-type="nav" track-metadata-eventdetail="https://developer.android.com/adaptive-apps" track-metadata-position="nav - essentials" track-metadata-module="tertiary nav" track-metadata-module_headline="extend by device" tooltip > <div class="devsite-nav-item-title"> Adaptive apps </div> </a> </li> <li class="devsite-nav-item"> <a href="https://developer.android.com/wear" track-type="nav" track-metadata-eventdetail="https://developer.android.com/wear" track-metadata-position="nav - essentials" track-metadata-module="tertiary nav" track-metadata-module_headline="extend by device" tooltip > <div class="devsite-nav-item-title"> Wear OS </div> </a> </li> <li class="devsite-nav-item"> <a href="https://developer.android.com/cars" track-type="nav" track-metadata-eventdetail="https://developer.android.com/cars" track-metadata-position="nav - essentials" track-metadata-module="tertiary nav" track-metadata-module_headline="extend by device" tooltip > <div class="devsite-nav-item-title"> Android for Cars </div> </a> </li> <li class="devsite-nav-item"> <a href="https://developer.android.com/tv" track-type="nav" track-metadata-eventdetail="https://developer.android.com/tv" track-metadata-position="nav - essentials" track-metadata-module="tertiary nav" track-metadata-module_headline="extend by device" tooltip > <div class="devsite-nav-item-title"> Android TV </div> </a> </li> <li class="devsite-nav-item"> <a href="https://developer.android.com/chrome-os" track-type="nav" track-metadata-eventdetail="https://developer.android.com/chrome-os" track-metadata-position="nav - essentials" track-metadata-module="tertiary nav" track-metadata-module_headline="extend by device" tooltip > <div class="devsite-nav-item-title"> ChromeOS </div> </a> </li> <li class="devsite-nav-item"> <a href="https://developer.android.com/multi-device-development" track-type="nav" track-metadata-eventdetail="https://developer.android.com/multi-device-development" track-metadata-position="nav - essentials" track-metadata-module="tertiary nav" track-metadata-module_headline="extend by device" tooltip > <div class="devsite-nav-item-title"> Cross-device SDK </div> </a> </li> </ul> </div> <div class="devsite-tabs-dropdown-column android-dropdown"> <ul class="devsite-tabs-dropdown-section android-dropdown-section-icon android-dropdown-section-icon-platform"> <li class="devsite-nav-title" role="heading" tooltip>Build by category</li> <li class="devsite-nav-description">Learn to build for your use case by following Google&#39;s prescriptive and opinionated guidance. </li> <li class="devsite-nav-item"> <a href="https://developer.android.com/games" track-type="nav" track-metadata-eventdetail="https://developer.android.com/games" track-metadata-position="nav - essentials" track-metadata-module="tertiary nav" track-metadata-module_headline="build by category" tooltip > <div class="devsite-nav-item-title"> Games </div> </a> </li> <li class="devsite-nav-item"> <a href="https://developer.android.com/media" track-type="nav" track-metadata-eventdetail="https://developer.android.com/media" track-metadata-position="nav - essentials" track-metadata-module="tertiary nav" track-metadata-module_headline="build by category" tooltip > <div class="devsite-nav-item-title"> Camera & Media </div> </a> </li> <li class="devsite-nav-item"> <a href="https://developer.android.com/social-and-messaging" track-type="nav" track-metadata-eventdetail="https://developer.android.com/social-and-messaging" track-metadata-position="nav - essentials" track-metadata-module="tertiary nav" track-metadata-module_headline="build by category" tooltip > <div class="devsite-nav-item-title"> Social & messaging </div> </a> </li> <li class="devsite-nav-item"> <a href="https://developer.android.com/health-and-fitness" track-type="nav" track-metadata-eventdetail="https://developer.android.com/health-and-fitness" track-metadata-position="nav - essentials" track-metadata-module="tertiary nav" track-metadata-module_headline="build by category" tooltip > <div class="devsite-nav-item-title"> Health & Fitness </div> </a> </li> <li class="devsite-nav-item"> <a href="https://developer.android.com/productivity" track-type="nav" track-metadata-eventdetail="https://developer.android.com/productivity" track-metadata-position="nav - essentials" track-metadata-module="tertiary nav" track-metadata-module_headline="build by category" tooltip > <div class="devsite-nav-item-title"> Productivity </div> </a> </li> <li class="devsite-nav-item"> <a href="https://developer.android.com/work/overview" track-type="nav" track-metadata-eventdetail="https://developer.android.com/work/overview" track-metadata-position="nav - essentials" track-metadata-module="tertiary nav" track-metadata-module_headline="build by category" tooltip > <div class="devsite-nav-item-title"> Enterprise apps </div> </a> </li> </ul> </div> <div class="devsite-tabs-dropdown-column android-dropdown"> <ul class="devsite-tabs-dropdown-section android-dropdown-section-icon android-dropdown-section-icon-stars"> <li class="devsite-nav-title" role="heading" tooltip>Get the latest</li> <li class="devsite-nav-description">Stay in touch with the latest releases throughout the year, join our preview programs, and give us your feedback. </li> <li class="devsite-nav-item"> <a href="https://developer.android.com/latest-updates" track-type="nav" track-metadata-eventdetail="https://developer.android.com/latest-updates" track-metadata-position="nav - essentials" track-metadata-module="tertiary nav" track-metadata-module_headline="get the latest" tooltip > <div class="devsite-nav-item-title"> Latest updates </div> </a> </li> <li class="devsite-nav-item"> <a href="https://developer.android.com/latest-updates/experimental" track-type="nav" track-metadata-eventdetail="https://developer.android.com/latest-updates/experimental" track-metadata-position="nav - essentials" track-metadata-module="tertiary nav" track-metadata-module_headline="get the latest" tooltip > <div class="devsite-nav-item-title"> Experimental updates </div> </a> </li> <li class="devsite-nav-item"> <a href="https://developer.android.com/studio/preview" track-type="nav" track-metadata-eventdetail="https://developer.android.com/studio/preview" track-metadata-position="nav - essentials" track-metadata-module="tertiary nav" track-metadata-module_headline="get the latest" tooltip > <div class="devsite-nav-item-title"> Android Studio preview </div> </a> </li> <li class="devsite-nav-item"> <a href="https://developer.android.com/jetpack/androidx/versions" track-type="nav" track-metadata-eventdetail="https://developer.android.com/jetpack/androidx/versions" track-metadata-position="nav - essentials" track-metadata-module="tertiary nav" track-metadata-module_headline="get the latest" tooltip > <div class="devsite-nav-item-title"> Jetpack & Compose libraries </div> </a> </li> <li class="devsite-nav-item"> <a href="https://developer.android.com/training/wearables/versions/4" track-type="nav" track-metadata-eventdetail="https://developer.android.com/training/wearables/versions/4" track-metadata-position="nav - essentials" track-metadata-module="tertiary nav" track-metadata-module_headline="get the latest" tooltip > <div class="devsite-nav-item-title"> Wear OS preview </div> </a> </li> <li class="devsite-nav-item"> <a href="https://developer.android.com/design-for-safety/privacy-sandbox" track-type="nav" track-metadata-eventdetail="https://developer.android.com/design-for-safety/privacy-sandbox" track-metadata-position="nav - essentials" track-metadata-module="tertiary nav" track-metadata-module_headline="get the latest" tooltip > <div class="devsite-nav-item-title"> Privacy Sandbox </div> </a> </li> </ul> </div> </div> </div> </tab> <tab class="devsite-dropdown devsite-dropdown-full "> <a href="https://developer.android.com/design" track-metadata-eventdetail="https://developer.android.com/design" class="devsite-tabs-content gc-analytics-event android-dropdown-tab" track-type="nav" track-metadata-position="nav - design &amp; plan" track-metadata-module="primary nav" data-category="Site-Wide Custom Events" data-label="Tab: Design &amp; Plan" track-name="design &amp; plan" > Design &amp; Plan </a> <a href="#" role="button" aria-haspopup="true" aria-expanded="false" aria-label="Dropdown menu for Design &amp; Plan" track-type="nav" track-metadata-eventdetail="https://developer.android.com/design" track-metadata-position="nav - design &amp; plan" track-metadata-module="primary nav" data-category="Site-Wide Custom Events" data-label="Tab: Design &amp; Plan" track-name="design &amp; plan" class="devsite-tabs-dropdown-toggle devsite-icon devsite-icon-arrow-drop-down"></a> <div class="devsite-tabs-dropdown" aria-label="submenu" hidden> <div class="devsite-tabs-dropdown-content"> <div class="devsite-tabs-dropdown-column android-dropdown"> <ul class="devsite-tabs-dropdown-section android-dropdown-section-icon android-dropdown-section-icon-layout"> <li class="devsite-nav-title" role="heading" tooltip>UI Design</li> <li class="devsite-nav-description">Design a beautiful user interface using Android best practices.</li> <li class="devsite-nav-item"> <a href="https://developer.android.com/design/ui" track-type="nav" track-metadata-eventdetail="https://developer.android.com/design/ui" track-metadata-position="nav - design &amp; plan" track-metadata-module="tertiary nav" track-metadata-module_headline="ui design" tooltip > <div class="devsite-nav-item-title"> Design for Android </div> </a> </li> <li class="devsite-nav-item"> <a href="https://developer.android.com/design/ui/mobile" track-type="nav" track-metadata-eventdetail="https://developer.android.com/design/ui/mobile" track-metadata-position="nav - design &amp; plan" track-metadata-module="tertiary nav" track-metadata-module_headline="ui design" tooltip > <div class="devsite-nav-item-title"> Mobile </div> </a> </li> <li class="devsite-nav-item"> <a href="https://developer.android.com/design/ui/large-screens" track-type="nav" track-metadata-eventdetail="https://developer.android.com/design/ui/large-screens" track-metadata-position="nav - design &amp; plan" track-metadata-module="tertiary nav" track-metadata-module_headline="ui design" tooltip > <div class="devsite-nav-item-title"> Large screens (e.g., tablets) </div> </a> </li> <li class="devsite-nav-item"> <a href="https://developer.android.com/design/ui/widget" track-type="nav" track-metadata-eventdetail="https://developer.android.com/design/ui/widget" track-metadata-position="nav - design &amp; plan" track-metadata-module="tertiary nav" track-metadata-module_headline="ui design" tooltip > <div class="devsite-nav-item-title"> Widgets </div> </a> </li> <li class="devsite-nav-item"> <a href="https://developer.android.com/design/ui/wear" track-type="nav" track-metadata-eventdetail="https://developer.android.com/design/ui/wear" track-metadata-position="nav - design &amp; plan" track-metadata-module="tertiary nav" track-metadata-module_headline="ui design" tooltip > <div class="devsite-nav-item-title"> Wear OS </div> </a> </li> <li class="devsite-nav-item"> <a href="https://developer.android.com/design/ui/tv" track-type="nav" track-metadata-eventdetail="https://developer.android.com/design/ui/tv" track-metadata-position="nav - design &amp; plan" track-metadata-module="tertiary nav" track-metadata-module_headline="ui design" tooltip > <div class="devsite-nav-item-title"> Android TV </div> </a> </li> </ul> </div> <div class="devsite-tabs-dropdown-column android-dropdown"> <ul class="devsite-tabs-dropdown-section android-dropdown-section-icon android-dropdown-section-icon-design"> <li class="devsite-nav-title" role="heading" tooltip>Architecture</li> <li class="devsite-nav-description">Design robust, testable, and maintainable app logic and services.</li> <li class="devsite-nav-item"> <a href="https://developer.android.com/topic/architecture/intro" track-type="nav" track-metadata-eventdetail="https://developer.android.com/topic/architecture/intro" track-metadata-position="nav - design &amp; plan" track-metadata-module="tertiary nav" track-metadata-module_headline="architecture" tooltip > <div class="devsite-nav-item-title"> Introduction </div> </a> </li> <li class="devsite-nav-item"> <a href="https://developer.android.com/topic/libraries/view-binding" track-type="nav" track-metadata-eventdetail="https://developer.android.com/topic/libraries/view-binding" track-metadata-position="nav - design &amp; plan" track-metadata-module="tertiary nav" track-metadata-module_headline="architecture" tooltip > <div class="devsite-nav-item-title"> Libraries </div> </a> </li> <li class="devsite-nav-item"> <a href="https://developer.android.com/guide/navigation/navigation-principles" track-type="nav" track-metadata-eventdetail="https://developer.android.com/guide/navigation/navigation-principles" track-metadata-position="nav - design &amp; plan" track-metadata-module="tertiary nav" track-metadata-module_headline="architecture" tooltip > <div class="devsite-nav-item-title"> Navigation </div> </a> </li> <li class="devsite-nav-item"> <a href="https://developer.android.com/topic/modularization" track-type="nav" track-metadata-eventdetail="https://developer.android.com/topic/modularization" track-metadata-position="nav - design &amp; plan" track-metadata-module="tertiary nav" track-metadata-module_headline="architecture" tooltip > <div class="devsite-nav-item-title"> Modularization </div> </a> </li> <li class="devsite-nav-item"> <a href="https://developer.android.com/training/testing/fundamentals" track-type="nav" track-metadata-eventdetail="https://developer.android.com/training/testing/fundamentals" track-metadata-position="nav - design &amp; plan" track-metadata-module="tertiary nav" track-metadata-module_headline="architecture" tooltip > <div class="devsite-nav-item-title"> Testing </div> </a> </li> </ul> </div> <div class="devsite-tabs-dropdown-column android-dropdown"> <ul class="devsite-tabs-dropdown-section android-dropdown-section-icon android-dropdown-section-icon-vitals"> <li class="devsite-nav-title" role="heading" tooltip>Quality</li> <li class="devsite-nav-description">Plan for app quality and align with Play store guidelines.</li> <li class="devsite-nav-item"> <a href="https://developer.android.com/quality" track-type="nav" track-metadata-eventdetail="https://developer.android.com/quality" track-metadata-position="nav - design &amp; plan" track-metadata-module="tertiary nav" track-metadata-module_headline="quality" tooltip > <div class="devsite-nav-item-title"> Overview </div> </a> </li> <li class="devsite-nav-item"> <a href="https://developer.android.com/quality/core-value" track-type="nav" track-metadata-eventdetail="https://developer.android.com/quality/core-value" track-metadata-position="nav - design &amp; plan" track-metadata-module="tertiary nav" track-metadata-module_headline="quality" tooltip > <div class="devsite-nav-item-title"> Core value </div> </a> </li> <li class="devsite-nav-item"> <a href="https://developer.android.com/quality/user-experience" track-type="nav" track-metadata-eventdetail="https://developer.android.com/quality/user-experience" track-metadata-position="nav - design &amp; plan" track-metadata-module="tertiary nav" track-metadata-module_headline="quality" tooltip > <div class="devsite-nav-item-title"> User experience </div> </a> </li> <li class="devsite-nav-item"> <a href="https://developer.android.com/quality/technical" track-type="nav" track-metadata-eventdetail="https://developer.android.com/quality/technical" track-metadata-position="nav - design &amp; plan" track-metadata-module="tertiary nav" track-metadata-module_headline="quality" tooltip > <div class="devsite-nav-item-title"> Technical quality </div> </a> </li> <li class="devsite-nav-item"> <a href="https://developer.android.com/quality/privacy-and-security" track-type="nav" track-metadata-eventdetail="https://developer.android.com/quality/privacy-and-security" track-metadata-position="nav - design &amp; plan" track-metadata-module="tertiary nav" track-metadata-module_headline="quality" tooltip > <div class="devsite-nav-item-title"> Security </div> </a> </li> </ul> </div> <div class="devsite-tabs-dropdown-column android-dropdown"> <ul class="devsite-tabs-dropdown-section android-dropdown-section-icon android-dropdown-section-icon-security-2"> <li class="devsite-nav-title" role="heading" tooltip>Security</li> <li class="devsite-nav-description">Safeguard users against threats and ensure a secure Android experience.</li> <li class="devsite-nav-item"> <a href="https://developer.android.com/security" track-type="nav" track-metadata-eventdetail="https://developer.android.com/security" track-metadata-position="nav - design &amp; plan" track-metadata-module="tertiary nav" track-metadata-module_headline="security" tooltip > <div class="devsite-nav-item-title"> Overview </div> </a> </li> <li class="devsite-nav-item"> <a href="https://developer.android.com/privacy-and-security/about" track-type="nav" track-metadata-eventdetail="https://developer.android.com/privacy-and-security/about" track-metadata-position="nav - design &amp; plan" track-metadata-module="tertiary nav" track-metadata-module_headline="security" tooltip > <div class="devsite-nav-item-title"> Privacy </div> </a> </li> <li class="devsite-nav-item"> <a href="https://developer.android.com/identity" track-type="nav" track-metadata-eventdetail="https://developer.android.com/identity" track-metadata-position="nav - design &amp; plan" track-metadata-module="tertiary nav" track-metadata-module_headline="security" tooltip > <div class="devsite-nav-item-title"> Identity </div> </a> </li> <li class="devsite-nav-item"> <a href="https://developer.android.com/security/fraud-prevention" track-type="nav" track-metadata-eventdetail="https://developer.android.com/security/fraud-prevention" track-metadata-position="nav - design &amp; plan" track-metadata-module="tertiary nav" track-metadata-module_headline="security" tooltip > <div class="devsite-nav-item-title"> Fraud prevention </div> </a> </li> </ul> </div> <div class="devsite-tabs-dropdown-column android-dropdown"> <ul class="devsite-tabs-dropdown-section android-dropdown-section-icon android-dropdown-section-icon-earth"> <li class="devsite-nav-title" role="heading" tooltip>Build for Billions</li> <li class="devsite-nav-description">Create the best experience for entry-level devices</li> <li class="devsite-nav-item"> <a href="https://developer.android.com/build-for-billions" track-type="nav" track-metadata-eventdetail="https://developer.android.com/build-for-billions" track-metadata-position="nav - design &amp; plan" track-metadata-module="tertiary nav" track-metadata-module_headline="build for billions" tooltip > <div class="devsite-nav-item-title"> Overview </div> </a> </li> <li class="devsite-nav-item"> <a href="https://developer.android.com/docs/quality-guidelines/build-for-billions" track-type="nav" track-metadata-eventdetail="https://developer.android.com/docs/quality-guidelines/build-for-billions" track-metadata-position="nav - design &amp; plan" track-metadata-module="tertiary nav" track-metadata-module_headline="build for billions" tooltip > <div class="devsite-nav-item-title"> About new markets </div> </a> </li> <li class="devsite-nav-item"> <a href="https://developer.android.com/guide/topics/androidgo" track-type="nav" track-metadata-eventdetail="https://developer.android.com/guide/topics/androidgo" track-metadata-position="nav - design &amp; plan" track-metadata-module="tertiary nav" track-metadata-module_headline="build for billions" tooltip > <div class="devsite-nav-item-title"> Android (Go edition) </div> </a> </li> </ul> </div> </div> </div> </tab> <tab class="devsite-dropdown devsite-dropdown-full "> <a href="https://developer.android.com/develop" track-metadata-eventdetail="https://developer.android.com/develop" class="devsite-tabs-content gc-analytics-event android-dropdown-tab" track-type="nav" track-metadata-position="nav - develop" track-metadata-module="primary nav" data-category="Site-Wide Custom Events" data-label="Tab: Develop" track-name="develop" > Develop </a> <a href="#" role="button" aria-haspopup="true" aria-expanded="false" aria-label="Dropdown menu for Develop" track-type="nav" track-metadata-eventdetail="https://developer.android.com/develop" track-metadata-position="nav - develop" track-metadata-module="primary nav" data-category="Site-Wide Custom Events" data-label="Tab: Develop" track-name="develop" class="devsite-tabs-dropdown-toggle devsite-icon devsite-icon-arrow-drop-down"></a> <div class="devsite-tabs-dropdown" aria-label="submenu" hidden> <div class="devsite-tabs-dropdown-content"> <div class="devsite-tabs-dropdown-column android-dropdown android-dropdown-primary android-dropdown-ai"> <ul class="devsite-tabs-dropdown-section "> <li class="devsite-nav-title" role="heading" tooltip>Build AI experiences</li> <li class="devsite-nav-description">Build AI-powered Android apps with Gemini APIs and more. </li> <li class="devsite-nav-item"> <a href="https://developer.android.com/ai" track-type="nav" track-metadata-eventdetail="https://developer.android.com/ai" track-metadata-position="nav - develop" track-metadata-module="tertiary nav" track-metadata-module_headline="build ai experiences" tooltip class="button button-primary" > <div class="devsite-nav-item-title"> Get started </div> </a> </li> </ul> </div> <div class="devsite-tabs-dropdown-column android-dropdown"> <ul class="devsite-tabs-dropdown-section android-dropdown-section-icon android-dropdown-section-icon-flag"> <li class="devsite-nav-title" role="heading" tooltip>Core areas</li> <li class="devsite-nav-description">Get the samples and docs for the features you need.</li> <li class="devsite-nav-item"> <a href="https://developer.android.com/samples" track-type="nav" track-metadata-eventdetail="https://developer.android.com/samples" track-metadata-position="nav - develop" track-metadata-module="tertiary nav" track-metadata-module_headline="core areas" tooltip > <div class="devsite-nav-item-title"> Samples </div> </a> </li> <li class="devsite-nav-item"> <a href="https://developer.android.com/quick-guides" track-type="nav" track-metadata-eventdetail="https://developer.android.com/quick-guides" track-metadata-position="nav - develop" track-metadata-module="tertiary nav" track-metadata-module_headline="core areas" tooltip > <div class="devsite-nav-item-title"> Try Quick Guidesᵇᵉᵗᵃ </div> </a> </li> <li class="devsite-nav-item"> <a href="https://developer.android.com/develop/ui" track-type="nav" track-metadata-eventdetail="https://developer.android.com/develop/ui" track-metadata-position="nav - develop" track-metadata-module="tertiary nav" track-metadata-module_headline="core areas" tooltip > <div class="devsite-nav-item-title"> User interfaces </div> </a> </li> <li class="devsite-nav-item"> <a href="https://developer.android.com/guide/topics/permissions/overview" track-type="nav" track-metadata-eventdetail="https://developer.android.com/guide/topics/permissions/overview" track-metadata-position="nav - develop" track-metadata-module="tertiary nav" track-metadata-module_headline="core areas" tooltip > <div class="devsite-nav-item-title"> Permissions </div> </a> </li> <li class="devsite-nav-item"> <a href="https://developer.android.com/develop/background-work" track-type="nav" track-metadata-eventdetail="https://developer.android.com/develop/background-work" track-metadata-position="nav - develop" track-metadata-module="tertiary nav" track-metadata-module_headline="core areas" tooltip > <div class="devsite-nav-item-title"> Background work </div> </a> </li> <li class="devsite-nav-item"> <a href="https://developer.android.com/guide/topics/data" track-type="nav" track-metadata-eventdetail="https://developer.android.com/guide/topics/data" track-metadata-position="nav - develop" track-metadata-module="tertiary nav" track-metadata-module_headline="core areas" tooltip > <div class="devsite-nav-item-title"> Data and files </div> </a> </li> <li class="devsite-nav-item"> <a href="https://developer.android.com/develop#core-areas" track-type="nav" track-metadata-eventdetail="https://developer.android.com/develop#core-areas" track-metadata-position="nav - develop" track-metadata-module="tertiary nav" track-metadata-module_headline="core areas" tooltip > <div class="devsite-nav-item-title"> All core areas ⤵️ </div> </a> </li> </ul> </div> <div class="devsite-tabs-dropdown-column android-dropdown"> <ul class="devsite-tabs-dropdown-section android-dropdown-section-icon android-dropdown-section-icon-tools-2"> <li class="devsite-nav-title" role="heading" tooltip>Tools and workflow</li> <li class="devsite-nav-description">Use the IDE to write and build your app, or create your own pipeline.</li> <li class="devsite-nav-item"> <a href="https://developer.android.com/studio/write" track-type="nav" track-metadata-eventdetail="https://developer.android.com/studio/write" track-metadata-position="nav - develop" track-metadata-module="tertiary nav" track-metadata-module_headline="tools and workflow" tooltip > <div class="devsite-nav-item-title"> Write and debug code </div> </a> </li> <li class="devsite-nav-item"> <a href="https://developer.android.com/build/gradle-build-overview" track-type="nav" track-metadata-eventdetail="https://developer.android.com/build/gradle-build-overview" track-metadata-position="nav - develop" track-metadata-module="tertiary nav" track-metadata-module_headline="tools and workflow" tooltip > <div class="devsite-nav-item-title"> Build projects </div> </a> </li> <li class="devsite-nav-item"> <a href="https://developer.android.com/training/testing" track-type="nav" track-metadata-eventdetail="https://developer.android.com/training/testing" track-metadata-position="nav - develop" track-metadata-module="tertiary nav" track-metadata-module_headline="tools and workflow" tooltip > <div class="devsite-nav-item-title"> Test your app </div> </a> </li> <li class="devsite-nav-item"> <a href="https://developer.android.com/topic/performance/overview" track-type="nav" track-metadata-eventdetail="https://developer.android.com/topic/performance/overview" track-metadata-position="nav - develop" track-metadata-module="tertiary nav" track-metadata-module_headline="tools and workflow" tooltip > <div class="devsite-nav-item-title"> Performance </div> </a> </li> <li class="devsite-nav-item"> <a href="https://developer.android.com/tools" track-type="nav" track-metadata-eventdetail="https://developer.android.com/tools" track-metadata-position="nav - develop" track-metadata-module="tertiary nav" track-metadata-module_headline="tools and workflow" tooltip > <div class="devsite-nav-item-title"> Command-line tools </div> </a> </li> <li class="devsite-nav-item"> <a href="https://developer.android.com/reference/tools/gradle-api" track-type="nav" track-metadata-eventdetail="https://developer.android.com/reference/tools/gradle-api" track-metadata-position="nav - develop" track-metadata-module="tertiary nav" track-metadata-module_headline="tools and workflow" tooltip > <div class="devsite-nav-item-title"> Gradle plugin API </div> </a> </li> </ul> </div> <div class="devsite-tabs-dropdown-column android-dropdown"> <ul class="devsite-tabs-dropdown-section android-dropdown-section-icon android-dropdown-section-icon-multiple-screens"> <li class="devsite-nav-title" role="heading" tooltip>Device tech</li> <li class="devsite-nav-description">Write code for form factors. Connect devices and share data.</li> <li class="devsite-nav-item"> <a href="https://developer.android.com/guide/topics/large-screens/get-started-with-large-screens" track-type="nav" track-metadata-eventdetail="https://developer.android.com/guide/topics/large-screens/get-started-with-large-screens" track-metadata-position="nav - develop" track-metadata-module="tertiary nav" track-metadata-module_headline="device tech" tooltip > <div class="devsite-nav-item-title"> Large screens (e.g., tablets) </div> </a> </li> <li class="devsite-nav-item"> <a href="https://developer.android.com/training/wearables" track-type="nav" track-metadata-eventdetail="https://developer.android.com/training/wearables" track-metadata-position="nav - develop" track-metadata-module="tertiary nav" track-metadata-module_headline="device tech" tooltip > <div class="devsite-nav-item-title"> Wear OS </div> </a> </li> <li class="devsite-nav-item"> <a href="https://developer.android.com/health-and-fitness/guides" track-type="nav" track-metadata-eventdetail="https://developer.android.com/health-and-fitness/guides" track-metadata-position="nav - develop" track-metadata-module="tertiary nav" track-metadata-module_headline="device tech" tooltip > <div class="devsite-nav-item-title"> Android Health </div> </a> </li> <li class="devsite-nav-item"> <a href="https://developer.android.com/guide/topics/connectivity/cross-device-sdk/overview" track-type="nav" track-metadata-eventdetail="https://developer.android.com/guide/topics/connectivity/cross-device-sdk/overview" track-metadata-position="nav - develop" track-metadata-module="tertiary nav" track-metadata-module_headline="device tech" tooltip > <div class="devsite-nav-item-title"> Cross-device SDK </div> </a> </li> <li class="devsite-nav-item"> <a href="https://developer.android.com/training/cars" track-type="nav" track-metadata-eventdetail="https://developer.android.com/training/cars" track-metadata-position="nav - develop" track-metadata-module="tertiary nav" track-metadata-module_headline="device tech" tooltip > <div class="devsite-nav-item-title"> Android for Cars </div> </a> </li> <li class="devsite-nav-item"> <a href="https://developer.android.com/training/tv" track-type="nav" track-metadata-eventdetail="https://developer.android.com/training/tv" track-metadata-position="nav - develop" track-metadata-module="tertiary nav" track-metadata-module_headline="device tech" tooltip > <div class="devsite-nav-item-title"> Android TV </div> </a> </li> <li class="devsite-nav-item"> <a href="https://developer.android.com/chrome-os/intro" track-type="nav" track-metadata-eventdetail="https://developer.android.com/chrome-os/intro" track-metadata-position="nav - develop" track-metadata-module="tertiary nav" track-metadata-module_headline="device tech" tooltip > <div class="devsite-nav-item-title"> ChromeOS </div> </a> </li> </ul> </div> <div class="devsite-tabs-dropdown-column android-dropdown"> <ul class="devsite-tabs-dropdown-section android-dropdown-section-icon android-dropdown-section-icon-core-library"> <li class="devsite-nav-title" role="heading" tooltip>Libraries</li> <li class="devsite-nav-description">Browse API reference documentation with all the details.</li> <li class="devsite-nav-item"> <a href="https://developer.android.com/reference/packages" track-type="nav" track-metadata-eventdetail="https://developer.android.com/reference/packages" track-metadata-position="nav - develop" track-metadata-module="tertiary nav" track-metadata-module_headline="libraries" tooltip > <div class="devsite-nav-item-title"> Android platform </div> </a> </li> <li class="devsite-nav-item"> <a href="https://developer.android.com/jetpack/androidx/explorer" track-type="nav" track-metadata-eventdetail="https://developer.android.com/jetpack/androidx/explorer" track-metadata-position="nav - develop" track-metadata-module="tertiary nav" track-metadata-module_headline="libraries" tooltip > <div class="devsite-nav-item-title"> Jetpack libraries </div> </a> </li> <li class="devsite-nav-item"> <a href="https://developer.android.com/jetpack/androidx/releases/compose" track-type="nav" track-metadata-eventdetail="https://developer.android.com/jetpack/androidx/releases/compose" track-metadata-position="nav - develop" track-metadata-module="tertiary nav" track-metadata-module_headline="libraries" tooltip > <div class="devsite-nav-item-title"> Compose libraries </div> </a> </li> <li class="devsite-nav-item"> <a href="https://developers.google.com/android/reference/packages" track-type="nav" track-metadata-eventdetail="https://developers.google.com/android/reference/packages" track-metadata-position="nav - develop" track-metadata-module="tertiary nav" track-metadata-module_headline="libraries" tooltip > <div class="devsite-nav-item-title"> Google Play services ↗️ </div> </a> </li> <li class="devsite-nav-item"> <a href="https://play.google.com/sdks" track-type="nav" track-metadata-eventdetail="https://play.google.com/sdks" track-metadata-position="nav - develop" track-metadata-module="tertiary nav" track-metadata-module_headline="libraries" tooltip > <div class="devsite-nav-item-title"> Google Play SDK index ↗️ </div> </a> </li> </ul> </div> </div> </div> </tab> <tab > <a href="https://developer.android.com/distribute" track-metadata-eventdetail="https://developer.android.com/distribute" class="devsite-tabs-content gc-analytics-event " track-type="nav" track-metadata-position="nav - google play" track-metadata-module="primary nav" data-category="Site-Wide Custom Events" data-label="Tab: Google Play" track-name="google play" > Google Play </a> </tab> <tab > <a href="https://developer.android.com/community" track-metadata-eventdetail="https://developer.android.com/community" class="devsite-tabs-content gc-analytics-event " track-type="nav" track-metadata-position="nav - community" track-metadata-module="primary nav" data-category="Site-Wide Custom Events" data-label="Tab: Community" track-name="community" > Community </a> </tab> </nav> </devsite-tabs> </div> <devsite-search enable-signin enable-search enable-suggestions enable-query-completion project-name="Jetpack" tenant-name="Android Developers" > <form class="devsite-search-form" action="https://developer.android.com/s/results" method="GET"> <div class="devsite-search-container"> <button type="button" search-open class="devsite-search-button devsite-header-icon-button button-flat material-icons" aria-label="Open search"></button> <div class="devsite-searchbox"> <input aria-activedescendant="" aria-autocomplete="list" aria-label="Search" aria-expanded="false" aria-haspopup="listbox" autocomplete="off" class="devsite-search-field devsite-search-query" name="q" placeholder="Search" role="combobox" type="text" value="" > <div class="devsite-search-image material-icons" aria-hidden="true"> </div> <div class="devsite-search-shortcut-icon-container" aria-hidden="true"> <kbd class="devsite-search-shortcut-icon">/</kbd> </div> </div> </div> </form> <button type="button" search-close class="devsite-search-button devsite-header-icon-button button-flat material-icons" aria-label="Close search"></button> </devsite-search> </div> <devsite-appearance-selector></devsite-appearance-selector> <devsite-language-selector> <ul role="presentation"> <li role="presentation"> <a role="menuitem" lang="en" >English</a> </li> <li role="presentation"> <a role="menuitem" lang="de" >Deutsch</a> </li> <li role="presentation"> <a role="menuitem" lang="es_419" >Español – América Latina</a> </li> <li role="presentation"> <a role="menuitem" lang="fr" >Français</a> </li> <li role="presentation"> <a role="menuitem" lang="id" >Indonesia</a> </li> <li role="presentation"> <a role="menuitem" lang="it" >Italiano</a> </li> <li role="presentation"> <a role="menuitem" lang="pl" >Polski</a> </li> <li role="presentation"> <a role="menuitem" lang="pt_br" >Português – Brasil</a> </li> <li role="presentation"> <a role="menuitem" lang="vi" >Tiếng Việt</a> </li> <li role="presentation"> <a role="menuitem" lang="tr" >Türkçe</a> </li> <li role="presentation"> <a role="menuitem" lang="ru" >Русский</a> </li> <li role="presentation"> <a role="menuitem" lang="he" >עברית</a> </li> <li role="presentation"> <a role="menuitem" lang="ar" >العربيّة</a> </li> <li role="presentation"> <a role="menuitem" lang="fa" >فارسی</a> </li> <li role="presentation"> <a role="menuitem" lang="hi" >हिंदी</a> </li> <li role="presentation"> <a role="menuitem" lang="bn" >বাংলা</a> </li> <li role="presentation"> <a role="menuitem" lang="th" >ภาษาไทย</a> </li> <li role="presentation"> <a role="menuitem" lang="zh_cn" >中文 – 简体</a> </li> <li role="presentation"> <a role="menuitem" lang="zh_tw" >中文 – 繁體</a> </li> <li role="presentation"> <a role="menuitem" lang="ja" >日本語</a> </li> <li role="presentation"> <a role="menuitem" lang="ko" >한국어</a> </li> </ul> </devsite-language-selector> <a class="devsite-header-link devsite-top-button button gc-analytics-event" href="https://developer.android.com/studio" data-category="Site-Wide Custom Events" data-label="Site header link" > Android Studio </a> <devsite-user enable-profiles id="devsite-user"> <span class="button devsite-top-button" aria-hidden="true" visually-hidden>Sign in</span> </devsite-user> </div> </div> </div> <div class="devsite-collapsible-section "> <div class="devsite-header-background"> <div class="devsite-product-id-row" > <div class="devsite-product-description-row"> <ul class="devsite-breadcrumb-list" aria-label="Lower header breadcrumb"> <li class="devsite-breadcrumb-item "> <a href="https://developer.android.com/get-started/overview" class="devsite-breadcrumb-link gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Lower Header" data-value="1" track-type="globalNav" track-name="breadcrumb" track-metadata-position="1" track-metadata-eventdetail="Get started" > Get started </a> </li> <li class="devsite-breadcrumb-item "> <div class="devsite-breadcrumb-guillemet material-icons" aria-hidden="true"></div> <a href="https://developer.android.com/jetpack" class="devsite-breadcrumb-link gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Lower Header" data-value="2" track-type="globalNav" track-name="breadcrumb" track-metadata-position="2" track-metadata-eventdetail="Jetpack" > Jetpack </a> </li> </ul> </div> </div> <div class="devsite-doc-set-nav-row"> <devsite-tabs class="lower-tabs"> <nav class="devsite-tabs-wrapper" aria-label="Lower tabs"> <tab > <a href="https://developer.android.com/jetpack" track-metadata-eventdetail="https://developer.android.com/jetpack" class="devsite-tabs-content gc-analytics-event " track-type="nav" track-metadata-position="nav - overview" track-metadata-module="primary nav" data-category="Site-Wide Custom Events" data-label="Tab: Overview" track-name="overview" > Overview </a> </tab> <tab > <a href="https://developer.android.com/jetpack/getting-started" track-metadata-eventdetail="https://developer.android.com/jetpack/getting-started" class="devsite-tabs-content gc-analytics-event " track-type="nav" track-metadata-position="nav - guides" track-metadata-module="primary nav" data-category="Site-Wide Custom Events" data-label="Tab: Guides" track-name="guides" > Guides </a> </tab> <tab > <a href="https://developer.android.com/jetpack/samples" track-metadata-eventdetail="https://developer.android.com/jetpack/samples" class="devsite-tabs-content gc-analytics-event " track-type="nav" track-metadata-position="nav - samples" track-metadata-module="primary nav" data-category="Site-Wide Custom Events" data-label="Tab: Samples" track-name="samples" > Samples </a> </tab> <tab class="devsite-active"> <a href="https://developer.android.com/jetpack/androidx/explorer" track-metadata-eventdetail="https://developer.android.com/jetpack/androidx/explorer" class="devsite-tabs-content gc-analytics-event " track-type="nav" track-metadata-position="nav - libraries" track-metadata-module="primary nav" aria-label="Libraries, selected" data-category="Site-Wide Custom Events" data-label="Tab: Libraries" track-name="libraries" > Libraries </a> </tab> </nav> </devsite-tabs> </div> </div> </div> </div> </devsite-header> <devsite-book-nav scrollbars > <div class="devsite-book-nav-filter" > <span class="filter-list-icon material-icons" aria-hidden="true"></span> <input type="text" placeholder="Filter" aria-label="Type to filter" role="searchbox"> <span class="filter-clear-button hidden" data-title="Clear filter" aria-label="Clear filter" role="button" tabindex="0"></span> </div> <nav class="devsite-book-nav devsite-nav nocontent" aria-label="Side menu"> <div class="devsite-mobile-header"> <button type="button" id="devsite-close-nav" class="devsite-header-icon-button button-flat material-icons gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Close navigation" aria-label="Close navigation"> </button> <div class="devsite-product-name-wrapper"> <a href="/" class="devsite-site-logo-link gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Site logo" track-type="globalNav" track-name="androidDevelopers" track-metadata-position="nav" track-metadata-eventDetail="nav"> <picture> <source srcset="https://www.gstatic.com/devrel-devsite/prod/v870e399c64f7c43c99a3043db4b3a74327bb93d0914e84a0c3dba90bbfd67625/android/images/lockup-dark-theme.svg" media="(prefers-color-scheme: dark)" class="devsite-dark-theme" alt="Android Developers"> <img src="https://www.gstatic.com/devrel-devsite/prod/v870e399c64f7c43c99a3043db4b3a74327bb93d0914e84a0c3dba90bbfd67625/android/images/lockup.svg" class="devsite-site-logo" alt="Android Developers"> </picture> </a> <span class="devsite-product-name"> <ul class="devsite-breadcrumb-list" > <li class="devsite-breadcrumb-item "> </li> </ul> </span> </div> </div> <div class="devsite-book-nav-wrapper"> <div class="devsite-mobile-nav-top"> <ul class="devsite-nav-list"> <li class="devsite-nav-item"> <a href="/jetpack" class="devsite-nav-title gc-analytics-event devsite-nav-active" data-category="Site-Wide Custom Events" data-label="Tab: Essentials" track-name="essentials" data-category="Site-Wide Custom Events" data-label="Responsive Tab: Essentials" track-type="globalNav" track-metadata-eventDetail="globalMenu" track-metadata-position="nav"> <span class="devsite-nav-text" tooltip > Essentials </span> </a> <ul class="devsite-nav-responsive-tabs devsite-nav-has-menu "> <li class="devsite-nav-item"> <span class="devsite-nav-title" tooltip data-category="Site-Wide Custom Events" data-label="Tab: Essentials" track-name="essentials" > <span class="devsite-nav-text" tooltip menu="Essentials"> More </span> <span class="devsite-nav-icon material-icons" data-icon="forward" menu="Essentials"> </span> </span> </li> </ul> <ul class="devsite-nav-responsive-tabs"> <li class="devsite-nav-item"> <a href="/jetpack" class="devsite-nav-title gc-analytics-event " data-category="Site-Wide Custom Events" data-label="Tab: Overview" track-name="overview" data-category="Site-Wide Custom Events" data-label="Responsive Tab: Overview" track-type="globalNav" track-metadata-eventDetail="globalMenu" track-metadata-position="nav"> <span class="devsite-nav-text" tooltip > Overview </span> </a> </li> <li class="devsite-nav-item"> <a href="/jetpack/getting-started" class="devsite-nav-title gc-analytics-event devsite-nav-has-children " data-category="Site-Wide Custom Events" data-label="Tab: Guides" track-name="guides" data-category="Site-Wide Custom Events" data-label="Responsive Tab: Guides" track-type="globalNav" track-metadata-eventDetail="globalMenu" track-metadata-position="nav"> <span class="devsite-nav-text" tooltip > Guides </span> <span class="devsite-nav-icon material-icons" data-icon="forward" > </span> </a> </li> <li class="devsite-nav-item"> <a href="/jetpack/samples" class="devsite-nav-title gc-analytics-event " data-category="Site-Wide Custom Events" data-label="Tab: Samples" track-name="samples" data-category="Site-Wide Custom Events" data-label="Responsive Tab: Samples" track-type="globalNav" track-metadata-eventDetail="globalMenu" track-metadata-position="nav"> <span class="devsite-nav-text" tooltip > Samples </span> </a> </li> <li class="devsite-nav-item"> <a href="/jetpack/androidx/explorer" class="devsite-nav-title gc-analytics-event devsite-nav-has-children devsite-nav-active" data-category="Site-Wide Custom Events" data-label="Tab: Libraries" track-name="libraries" data-category="Site-Wide Custom Events" data-label="Responsive Tab: Libraries" track-type="globalNav" track-metadata-eventDetail="globalMenu" track-metadata-position="nav"> <span class="devsite-nav-text" tooltip menu="_book"> Libraries </span> <span class="devsite-nav-icon material-icons" data-icon="forward" menu="_book"> </span> </a> </li> </ul> </li> <li class="devsite-nav-item"> <a href="/design" class="devsite-nav-title gc-analytics-event " data-category="Site-Wide Custom Events" data-label="Tab: Design &amp; Plan" track-name="design &amp; plan" data-category="Site-Wide Custom Events" data-label="Responsive Tab: Design &amp; Plan" track-type="globalNav" track-metadata-eventDetail="globalMenu" track-metadata-position="nav"> <span class="devsite-nav-text" tooltip > Design &amp; Plan </span> </a> <ul class="devsite-nav-responsive-tabs devsite-nav-has-menu "> <li class="devsite-nav-item"> <span class="devsite-nav-title" tooltip data-category="Site-Wide Custom Events" data-label="Tab: Design &amp; Plan" track-name="design &amp; plan" > <span class="devsite-nav-text" tooltip menu="Design &amp; Plan"> More </span> <span class="devsite-nav-icon material-icons" data-icon="forward" menu="Design &amp; Plan"> </span> </span> </li> </ul> </li> <li class="devsite-nav-item"> <a href="/develop" class="devsite-nav-title gc-analytics-event " data-category="Site-Wide Custom Events" data-label="Tab: Develop" track-name="develop" data-category="Site-Wide Custom Events" data-label="Responsive Tab: Develop" track-type="globalNav" track-metadata-eventDetail="globalMenu" track-metadata-position="nav"> <span class="devsite-nav-text" tooltip > Develop </span> </a> <ul class="devsite-nav-responsive-tabs devsite-nav-has-menu "> <li class="devsite-nav-item"> <span class="devsite-nav-title" tooltip data-category="Site-Wide Custom Events" data-label="Tab: Develop" track-name="develop" > <span class="devsite-nav-text" tooltip menu="Develop"> More </span> <span class="devsite-nav-icon material-icons" data-icon="forward" menu="Develop"> </span> </span> </li> </ul> </li> <li class="devsite-nav-item"> <a href="/distribute" class="devsite-nav-title gc-analytics-event " data-category="Site-Wide Custom Events" data-label="Tab: Google Play" track-name="google play" data-category="Site-Wide Custom Events" data-label="Responsive Tab: Google Play" track-type="globalNav" track-metadata-eventDetail="globalMenu" track-metadata-position="nav"> <span class="devsite-nav-text" tooltip > Google Play </span> </a> </li> <li class="devsite-nav-item"> <a href="/community" class="devsite-nav-title gc-analytics-event " data-category="Site-Wide Custom Events" data-label="Tab: Community" track-name="community" data-category="Site-Wide Custom Events" data-label="Responsive Tab: Community" track-type="globalNav" track-metadata-eventDetail="globalMenu" track-metadata-position="nav"> <span class="devsite-nav-text" tooltip > Community </span> </a> </li> <li class="devsite-nav-item"> <a href="/studio" class="devsite-nav-title gc-analytics-event " data-category="Site-Wide Custom Events" data-label="Responsive Tab: Android Studio" track-type="navMenu" track-metadata-eventDetail="globalMenu" track-metadata-position="nav"> <span class="devsite-nav-text" tooltip > Android Studio </span> </a> </li> </ul> </div> <div class="devsite-mobile-nav-bottom"> <ul class="devsite-nav-list" menu="_book"> <li class="devsite-nav-item"><a href="/jetpack/androidx/explorer" class="devsite-nav-title gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Book nav link, pathname: /jetpack/androidx/explorer" track-type="bookNav" track-name="click" track-metadata-eventdetail="/jetpack/androidx/explorer" ><span class="devsite-nav-text" tooltip>Explore the libraries</span></a></li> <li class="devsite-nav-item devsite-nav-expandable"><div class="devsite-expandable-nav"> <a class="devsite-nav-toggle" aria-hidden="true"></a><div class="devsite-nav-title devsite-nav-title-no-path" tabindex="0" role="button"> <span class="devsite-nav-text" tooltip>Library Releases</span> </div><ul class="devsite-nav-section"><li class="devsite-nav-item"><a href="/jetpack/androidx/versions" class="devsite-nav-title gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Book nav link, pathname: /jetpack/androidx/versions" track-type="bookNav" track-name="click" track-metadata-eventdetail="/jetpack/androidx/versions" ><span class="devsite-nav-text" tooltip>Overview</span></a></li><li class="devsite-nav-item"><a href="/jetpack/androidx/versions/all-channel" class="devsite-nav-title gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Book nav link, pathname: /jetpack/androidx/versions/all-channel" track-type="bookNav" track-name="click" track-metadata-eventdetail="/jetpack/androidx/versions/all-channel" ><span class="devsite-nav-text" tooltip>All Channels</span></a></li><li class="devsite-nav-item"><a href="/jetpack/androidx/versions/stable-channel" class="devsite-nav-title gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Book nav link, pathname: /jetpack/androidx/versions/stable-channel" track-type="bookNav" track-name="click" track-metadata-eventdetail="/jetpack/androidx/versions/stable-channel" ><span class="devsite-nav-text" tooltip>Stable Channel</span></a></li><li class="devsite-nav-item"><a href="/jetpack/androidx/versions/rc-channel" class="devsite-nav-title gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Book nav link, pathname: /jetpack/androidx/versions/rc-channel" track-type="bookNav" track-name="click" track-metadata-eventdetail="/jetpack/androidx/versions/rc-channel" ><span class="devsite-nav-text" tooltip>RC Channel</span></a></li><li class="devsite-nav-item"><a href="/jetpack/androidx/versions/beta-channel" class="devsite-nav-title gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Book nav link, pathname: /jetpack/androidx/versions/beta-channel" track-type="bookNav" track-name="click" track-metadata-eventdetail="/jetpack/androidx/versions/beta-channel" ><span class="devsite-nav-text" tooltip>Beta Channel</span></a></li><li class="devsite-nav-item"><a href="/jetpack/androidx/versions/alpha-channel" class="devsite-nav-title gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Book nav link, pathname: /jetpack/androidx/versions/alpha-channel" track-type="bookNav" track-name="click" track-metadata-eventdetail="/jetpack/androidx/versions/alpha-channel" ><span class="devsite-nav-text" tooltip>Alpha Channel</span></a></li></ul></div></li> <li class="devsite-nav-item devsite-nav-expandable"><div class="devsite-expandable-nav"> <a class="devsite-nav-toggle" aria-hidden="true"></a><div class="devsite-nav-title devsite-nav-title-no-path" tabindex="0" role="button"> <span class="devsite-nav-text" tooltip>Release Notes</span> </div><ul class="devsite-nav-section"><li class="devsite-nav-item"><a href="/jetpack/androidx/releases/activity" class="devsite-nav-title gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Book nav link, pathname: /jetpack/androidx/releases/activity" track-type="bookNav" track-name="click" track-metadata-eventdetail="/jetpack/androidx/releases/activity" ><span class="devsite-nav-text" tooltip>androidx.activity</span></a></li><li class="devsite-nav-item"><a href="/jetpack/androidx/releases/ads" class="devsite-nav-title gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Book nav link, pathname: /jetpack/androidx/releases/ads" track-type="bookNav" track-name="click" track-metadata-eventdetail="/jetpack/androidx/releases/ads" ><span class="devsite-nav-text" tooltip>androidx.ads</span></a></li><li class="devsite-nav-item"><a href="/jetpack/androidx/releases/annotation" class="devsite-nav-title gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Book nav link, pathname: /jetpack/androidx/releases/annotation" track-type="bookNav" track-name="click" track-metadata-eventdetail="/jetpack/androidx/releases/annotation" ><span class="devsite-nav-text" tooltip>androidx.annotation</span></a></li><li class="devsite-nav-item"><a href="/jetpack/androidx/releases/appcompat" class="devsite-nav-title gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Book nav link, pathname: /jetpack/androidx/releases/appcompat" track-type="bookNav" track-name="click" track-metadata-eventdetail="/jetpack/androidx/releases/appcompat" ><span class="devsite-nav-text" tooltip>androidx.appcompat</span></a></li><li class="devsite-nav-item"><a href="/jetpack/androidx/releases/appsearch" class="devsite-nav-title gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Book nav link, pathname: /jetpack/androidx/releases/appsearch" track-type="bookNav" track-name="click" track-metadata-eventdetail="/jetpack/androidx/releases/appsearch" ><span class="devsite-nav-text" tooltip>androidx.appsearch</span></a></li><li class="devsite-nav-item"><a href="/jetpack/androidx/releases/arch-core" class="devsite-nav-title gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Book nav link, pathname: /jetpack/androidx/releases/arch-core" track-type="bookNav" track-name="click" track-metadata-eventdetail="/jetpack/androidx/releases/arch-core" ><span class="devsite-nav-text" tooltip>androidx.arch.core</span></a></li><li class="devsite-nav-item"><a href="/jetpack/androidx/releases/asynclayoutinflater" class="devsite-nav-title gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Book nav link, pathname: /jetpack/androidx/releases/asynclayoutinflater" track-type="bookNav" track-name="click" track-metadata-eventdetail="/jetpack/androidx/releases/asynclayoutinflater" ><span class="devsite-nav-text" tooltip>androidx.asynclayoutinflater</span></a></li><li class="devsite-nav-item"><a href="/jetpack/androidx/releases/autofill" class="devsite-nav-title gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Book nav link, pathname: /jetpack/androidx/releases/autofill" track-type="bookNav" track-name="click" track-metadata-eventdetail="/jetpack/androidx/releases/autofill" ><span class="devsite-nav-text" tooltip>androidx.autofill</span></a></li><li class="devsite-nav-item"><a href="/jetpack/androidx/releases/benchmark" class="devsite-nav-title gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Book nav link, pathname: /jetpack/androidx/releases/benchmark" track-type="bookNav" track-name="click" track-metadata-eventdetail="/jetpack/androidx/releases/benchmark" ><span class="devsite-nav-text" tooltip>androidx.benchmark</span></a></li><li class="devsite-nav-item"><a href="/jetpack/androidx/releases/biometric" class="devsite-nav-title gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Book nav link, pathname: /jetpack/androidx/releases/biometric" track-type="bookNav" track-name="click" track-metadata-eventdetail="/jetpack/androidx/releases/biometric" ><span class="devsite-nav-text" tooltip>androidx.biometric</span></a></li><li class="devsite-nav-item"><a href="/jetpack/androidx/releases/bluetooth" class="devsite-nav-title gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Book nav link, pathname: /jetpack/androidx/releases/bluetooth" track-type="bookNav" track-name="click" track-metadata-eventdetail="/jetpack/androidx/releases/bluetooth" ><span class="devsite-nav-text" tooltip>androidx.bluetooth</span></a></li><li class="devsite-nav-item"><a href="/jetpack/androidx/releases/browser" class="devsite-nav-title gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Book nav link, pathname: /jetpack/androidx/releases/browser" track-type="bookNav" track-name="click" track-metadata-eventdetail="/jetpack/androidx/releases/browser" ><span class="devsite-nav-text" tooltip>androidx.browser</span></a></li><li class="devsite-nav-item"><a href="/jetpack/androidx/releases/camera" class="devsite-nav-title gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Book nav link, pathname: /jetpack/androidx/releases/camera" track-type="bookNav" track-name="click" track-metadata-eventdetail="/jetpack/androidx/releases/camera" ><span class="devsite-nav-text" tooltip>androidx.camera</span></a></li><li class="devsite-nav-item"><a href="/jetpack/androidx/releases/camera-viewfinder" class="devsite-nav-title gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Book nav link, pathname: /jetpack/androidx/releases/camera-viewfinder" track-type="bookNav" track-name="click" track-metadata-eventdetail="/jetpack/androidx/releases/camera-viewfinder" ><span class="devsite-nav-text" tooltip>androidx.camera.viewfinder</span></a></li><li class="devsite-nav-item"><a href="/jetpack/androidx/releases/car" class="devsite-nav-title gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Book nav link, pathname: /jetpack/androidx/releases/car" track-type="bookNav" track-name="click" track-metadata-eventdetail="/jetpack/androidx/releases/car" ><span class="devsite-nav-text" tooltip>androidx.car</span></a></li><li class="devsite-nav-item"><a href="/jetpack/androidx/releases/car-app" class="devsite-nav-title gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Book nav link, pathname: /jetpack/androidx/releases/car-app" track-type="bookNav" track-name="click" track-metadata-eventdetail="/jetpack/androidx/releases/car-app" ><span class="devsite-nav-text" tooltip>androidx.car.app</span></a></li><li class="devsite-nav-item"><a href="/jetpack/androidx/releases/cardview" class="devsite-nav-title gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Book nav link, pathname: /jetpack/androidx/releases/cardview" track-type="bookNav" track-name="click" track-metadata-eventdetail="/jetpack/androidx/releases/cardview" ><span class="devsite-nav-text" tooltip>androidx.cardview</span></a></li><li class="devsite-nav-item"><a href="/jetpack/androidx/releases/collection" class="devsite-nav-title gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Book nav link, pathname: /jetpack/androidx/releases/collection" track-type="bookNav" track-name="click" track-metadata-eventdetail="/jetpack/androidx/releases/collection" ><span class="devsite-nav-text" tooltip>androidx.collection</span></a></li><li class="devsite-nav-item"><a href="/jetpack/androidx/releases/compose" class="devsite-nav-title gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Book nav link, pathname: /jetpack/androidx/releases/compose" track-type="bookNav" track-name="click" track-metadata-eventdetail="/jetpack/androidx/releases/compose" ><span class="devsite-nav-text" tooltip>androidx.compose</span></a></li><li class="devsite-nav-item"><a href="/jetpack/androidx/releases/compose-animation" class="devsite-nav-title gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Book nav link, pathname: /jetpack/androidx/releases/compose-animation" track-type="bookNav" track-name="click" track-metadata-eventdetail="/jetpack/androidx/releases/compose-animation" ><span class="devsite-nav-text" tooltip>androidx.compose.animation</span></a></li><li class="devsite-nav-item"><a href="/jetpack/androidx/releases/compose-compiler" class="devsite-nav-title gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Book nav link, pathname: /jetpack/androidx/releases/compose-compiler" track-type="bookNav" track-name="click" track-metadata-eventdetail="/jetpack/androidx/releases/compose-compiler" ><span class="devsite-nav-text" tooltip>androidx.compose.compiler</span></a></li><li class="devsite-nav-item"><a href="/jetpack/androidx/releases/compose-foundation" class="devsite-nav-title gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Book nav link, pathname: /jetpack/androidx/releases/compose-foundation" track-type="bookNav" track-name="click" track-metadata-eventdetail="/jetpack/androidx/releases/compose-foundation" ><span class="devsite-nav-text" tooltip>androidx.compose.foundation</span></a></li><li class="devsite-nav-item"><a href="/jetpack/androidx/releases/compose-material" class="devsite-nav-title gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Book nav link, pathname: /jetpack/androidx/releases/compose-material" track-type="bookNav" track-name="click" track-metadata-eventdetail="/jetpack/androidx/releases/compose-material" ><span class="devsite-nav-text" tooltip>androidx.compose.material</span></a></li><li class="devsite-nav-item"><a href="/jetpack/androidx/releases/compose-material3" class="devsite-nav-title gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Book nav link, pathname: /jetpack/androidx/releases/compose-material3" track-type="bookNav" track-name="click" track-metadata-eventdetail="/jetpack/androidx/releases/compose-material3" ><span class="devsite-nav-text" tooltip>androidx.compose.material3</span></a></li><li class="devsite-nav-item"><a href="/jetpack/androidx/releases/compose-material3-adaptive" class="devsite-nav-title gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Book nav link, pathname: /jetpack/androidx/releases/compose-material3-adaptive" track-type="bookNav" track-name="click" track-metadata-eventdetail="/jetpack/androidx/releases/compose-material3-adaptive" ><span class="devsite-nav-text" tooltip>androidx.compose.material3.adaptive</span></a></li><li class="devsite-nav-item"><a href="/jetpack/androidx/releases/compose-runtime" class="devsite-nav-title gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Book nav link, pathname: /jetpack/androidx/releases/compose-runtime" track-type="bookNav" track-name="click" track-metadata-eventdetail="/jetpack/androidx/releases/compose-runtime" ><span class="devsite-nav-text" tooltip>androidx.compose.runtime</span></a></li><li class="devsite-nav-item"><a href="/jetpack/androidx/releases/compose-ui" class="devsite-nav-title gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Book nav link, pathname: /jetpack/androidx/releases/compose-ui" track-type="bookNav" track-name="click" track-metadata-eventdetail="/jetpack/androidx/releases/compose-ui" ><span class="devsite-nav-text" tooltip>androidx.compose.ui</span></a></li><li class="devsite-nav-item"><a href="/jetpack/androidx/releases/concurrent" class="devsite-nav-title gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Book nav link, pathname: /jetpack/androidx/releases/concurrent" track-type="bookNav" track-name="click" track-metadata-eventdetail="/jetpack/androidx/releases/concurrent" ><span class="devsite-nav-text" tooltip>androidx.concurrent</span></a></li><li class="devsite-nav-item"><a href="/jetpack/androidx/releases/constraintlayout" class="devsite-nav-title gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Book nav link, pathname: /jetpack/androidx/releases/constraintlayout" track-type="bookNav" track-name="click" track-metadata-eventdetail="/jetpack/androidx/releases/constraintlayout" ><span class="devsite-nav-text" tooltip>androidx.constraintlayout</span></a></li><li class="devsite-nav-item"><a href="/jetpack/androidx/releases/contentpager" class="devsite-nav-title gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Book nav link, pathname: /jetpack/androidx/releases/contentpager" track-type="bookNav" track-name="click" track-metadata-eventdetail="/jetpack/androidx/releases/contentpager" ><span class="devsite-nav-text" tooltip>androidx.contentpager</span></a></li><li class="devsite-nav-item"><a href="/jetpack/androidx/releases/coordinatorlayout" class="devsite-nav-title gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Book nav link, pathname: /jetpack/androidx/releases/coordinatorlayout" track-type="bookNav" track-name="click" track-metadata-eventdetail="/jetpack/androidx/releases/coordinatorlayout" ><span class="devsite-nav-text" tooltip>androidx.coordinatorlayout</span></a></li><li class="devsite-nav-item"><a href="/jetpack/androidx/releases/core" class="devsite-nav-title gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Book nav link, pathname: /jetpack/androidx/releases/core" track-type="bookNav" track-name="click" track-metadata-eventdetail="/jetpack/androidx/releases/core" ><span class="devsite-nav-text" tooltip>androidx.core</span></a></li><li class="devsite-nav-item"><a href="/jetpack/androidx/releases/core-uwb" class="devsite-nav-title gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Book nav link, pathname: /jetpack/androidx/releases/core-uwb" track-type="bookNav" track-name="click" track-metadata-eventdetail="/jetpack/androidx/releases/core-uwb" ><span class="devsite-nav-text" tooltip>androidx.core.uwb</span></a></li><li class="devsite-nav-item"><a href="/jetpack/androidx/releases/credentials" class="devsite-nav-title gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Book nav link, pathname: /jetpack/androidx/releases/credentials" track-type="bookNav" track-name="click" track-metadata-eventdetail="/jetpack/androidx/releases/credentials" ><span class="devsite-nav-text" tooltip>androidx.credentials</span></a></li><li class="devsite-nav-item"><a href="/jetpack/androidx/releases/credentials/registry" class="devsite-nav-title gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Book nav link, pathname: /jetpack/androidx/releases/credentials/registry" track-type="bookNav" track-name="click" track-metadata-eventdetail="/jetpack/androidx/releases/credentials/registry" ><span class="devsite-nav-text" tooltip>androidx.credentials.registry</span></a></li><li class="devsite-nav-item"><a href="/jetpack/androidx/releases/cursoradapter" class="devsite-nav-title gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Book nav link, pathname: /jetpack/androidx/releases/cursoradapter" track-type="bookNav" track-name="click" track-metadata-eventdetail="/jetpack/androidx/releases/cursoradapter" ><span class="devsite-nav-text" tooltip>androidx.cursoradapter</span></a></li><li class="devsite-nav-item"><a href="/jetpack/androidx/releases/customview" class="devsite-nav-title gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Book nav link, pathname: /jetpack/androidx/releases/customview" track-type="bookNav" track-name="click" track-metadata-eventdetail="/jetpack/androidx/releases/customview" ><span class="devsite-nav-text" tooltip>androidx.customview</span></a></li><li class="devsite-nav-item"><a href="/jetpack/androidx/releases/databinding" class="devsite-nav-title gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Book nav link, pathname: /jetpack/androidx/releases/databinding" track-type="bookNav" track-name="click" track-metadata-eventdetail="/jetpack/androidx/releases/databinding" ><span class="devsite-nav-text" tooltip>androidx.databinding</span></a></li><li class="devsite-nav-item"><a href="/jetpack/androidx/releases/datastore" class="devsite-nav-title gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Book nav link, pathname: /jetpack/androidx/releases/datastore" track-type="bookNav" track-name="click" track-metadata-eventdetail="/jetpack/androidx/releases/datastore" ><span class="devsite-nav-text" tooltip>androidx.datastore</span></a></li><li class="devsite-nav-item"><a href="/jetpack/androidx/releases/documentfile" class="devsite-nav-title gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Book nav link, pathname: /jetpack/androidx/releases/documentfile" track-type="bookNav" track-name="click" track-metadata-eventdetail="/jetpack/androidx/releases/documentfile" ><span class="devsite-nav-text" tooltip>androidx.documentfile</span></a></li><li class="devsite-nav-item"><a href="/jetpack/androidx/releases/draganddrop" class="devsite-nav-title gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Book nav link, pathname: /jetpack/androidx/releases/draganddrop" track-type="bookNav" track-name="click" track-metadata-eventdetail="/jetpack/androidx/releases/draganddrop" ><span class="devsite-nav-text" tooltip>androidx.draganddrop</span></a></li><li class="devsite-nav-item"><a href="/jetpack/androidx/releases/drawerlayout" class="devsite-nav-title gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Book nav link, pathname: /jetpack/androidx/releases/drawerlayout" track-type="bookNav" track-name="click" track-metadata-eventdetail="/jetpack/androidx/releases/drawerlayout" ><span class="devsite-nav-text" tooltip>androidx.drawerlayout</span></a></li><li class="devsite-nav-item"><a href="/jetpack/androidx/releases/dynamicanimation" class="devsite-nav-title gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Book nav link, pathname: /jetpack/androidx/releases/dynamicanimation" track-type="bookNav" track-name="click" track-metadata-eventdetail="/jetpack/androidx/releases/dynamicanimation" ><span class="devsite-nav-text" tooltip>androidx.dynamicanimation</span></a></li><li class="devsite-nav-item"><a href="/jetpack/androidx/releases/emoji" class="devsite-nav-title gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Book nav link, pathname: /jetpack/androidx/releases/emoji" track-type="bookNav" track-name="click" track-metadata-eventdetail="/jetpack/androidx/releases/emoji" ><span class="devsite-nav-text" tooltip>androidx.emoji</span></a></li><li class="devsite-nav-item"><a href="/jetpack/androidx/releases/emoji2" class="devsite-nav-title gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Book nav link, pathname: /jetpack/androidx/releases/emoji2" track-type="bookNav" track-name="click" track-metadata-eventdetail="/jetpack/androidx/releases/emoji2" ><span class="devsite-nav-text" tooltip>androidx.emoji2</span></a></li><li class="devsite-nav-item"><a href="/jetpack/androidx/releases/enterprise" class="devsite-nav-title gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Book nav link, pathname: /jetpack/androidx/releases/enterprise" track-type="bookNav" track-name="click" track-metadata-eventdetail="/jetpack/androidx/releases/enterprise" ><span class="devsite-nav-text" tooltip>androidx.enterprise</span></a></li><li class="devsite-nav-item"><a href="/jetpack/androidx/releases/exifinterface" class="devsite-nav-title gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Book nav link, pathname: /jetpack/androidx/releases/exifinterface" track-type="bookNav" track-name="click" track-metadata-eventdetail="/jetpack/androidx/releases/exifinterface" ><span class="devsite-nav-text" tooltip>androidx.exifinterface</span></a></li><li class="devsite-nav-item"><a href="/jetpack/androidx/releases/fragment" class="devsite-nav-title gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Book nav link, pathname: /jetpack/androidx/releases/fragment" track-type="bookNav" track-name="click" track-metadata-eventdetail="/jetpack/androidx/releases/fragment" ><span class="devsite-nav-text" tooltip>androidx.fragment</span></a></li><li class="devsite-nav-item"><a href="/jetpack/androidx/releases/games" class="devsite-nav-title gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Book nav link, pathname: /jetpack/androidx/releases/games" track-type="bookNav" track-name="click" track-metadata-eventdetail="/jetpack/androidx/releases/games" ><span class="devsite-nav-text" tooltip>androidx.games</span></a></li><li class="devsite-nav-item"><a href="/jetpack/androidx/releases/glance" class="devsite-nav-title gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Book nav link, pathname: /jetpack/androidx/releases/glance" track-type="bookNav" track-name="click" track-metadata-eventdetail="/jetpack/androidx/releases/glance" ><span class="devsite-nav-text" tooltip>androidx.glance</span></a></li><li class="devsite-nav-item"><a href="/jetpack/androidx/releases/graphics" class="devsite-nav-title gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Book nav link, pathname: /jetpack/androidx/releases/graphics" track-type="bookNav" track-name="click" track-metadata-eventdetail="/jetpack/androidx/releases/graphics" ><span class="devsite-nav-text" tooltip>androidx.graphics</span></a></li><li class="devsite-nav-item"><a href="/jetpack/androidx/releases/gridlayout" class="devsite-nav-title gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Book nav link, pathname: /jetpack/androidx/releases/gridlayout" track-type="bookNav" track-name="click" track-metadata-eventdetail="/jetpack/androidx/releases/gridlayout" ><span class="devsite-nav-text" tooltip>androidx.gridlayout</span></a></li><li class="devsite-nav-item"><a href="/jetpack/androidx/releases/health" class="devsite-nav-title gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Book nav link, pathname: /jetpack/androidx/releases/health" track-type="bookNav" track-name="click" track-metadata-eventdetail="/jetpack/androidx/releases/health" ><span class="devsite-nav-text" tooltip>androidx.health</span></a></li><li class="devsite-nav-item"><a href="/jetpack/androidx/releases/health-connect" class="devsite-nav-title gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Book nav link, pathname: /jetpack/androidx/releases/health-connect" track-type="bookNav" track-name="click" track-metadata-eventdetail="/jetpack/androidx/releases/health-connect" ><span class="devsite-nav-text" tooltip>androidx.health.connect</span></a></li><li class="devsite-nav-item"><a href="/jetpack/androidx/releases/heifwriter" class="devsite-nav-title gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Book nav link, pathname: /jetpack/androidx/releases/heifwriter" track-type="bookNav" track-name="click" track-metadata-eventdetail="/jetpack/androidx/releases/heifwriter" ><span class="devsite-nav-text" tooltip>androidx.heifwriter</span></a></li><li class="devsite-nav-item"><a href="/jetpack/androidx/releases/hilt" class="devsite-nav-title gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Book nav link, pathname: /jetpack/androidx/releases/hilt" track-type="bookNav" track-name="click" track-metadata-eventdetail="/jetpack/androidx/releases/hilt" ><span class="devsite-nav-text" tooltip>androidx.hilt</span></a></li><li class="devsite-nav-item"><a href="/jetpack/androidx/releases/ink" class="devsite-nav-title gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Book nav link, pathname: /jetpack/androidx/releases/ink" track-type="bookNav" track-name="click" track-metadata-eventdetail="/jetpack/androidx/releases/ink" ><span class="devsite-nav-text" tooltip>androidx.ink</span></a></li><li class="devsite-nav-item"><a href="/jetpack/androidx/releases/input" class="devsite-nav-title gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Book nav link, pathname: /jetpack/androidx/releases/input" track-type="bookNav" track-name="click" track-metadata-eventdetail="/jetpack/androidx/releases/input" ><span class="devsite-nav-text" tooltip>androidx.input</span></a></li><li class="devsite-nav-item"><a href="/jetpack/androidx/releases/interpolator" class="devsite-nav-title gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Book nav link, pathname: /jetpack/androidx/releases/interpolator" track-type="bookNav" track-name="click" track-metadata-eventdetail="/jetpack/androidx/releases/interpolator" ><span class="devsite-nav-text" tooltip>androidx.interpolator</span></a></li><li class="devsite-nav-item"><a href="/jetpack/androidx/releases/javascriptengine" class="devsite-nav-title gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Book nav link, pathname: /jetpack/androidx/releases/javascriptengine" track-type="bookNav" track-name="click" track-metadata-eventdetail="/jetpack/androidx/releases/javascriptengine" ><span class="devsite-nav-text" tooltip>androidx.javascriptengine</span></a></li><li class="devsite-nav-item"><a href="/jetpack/androidx/releases/leanback" class="devsite-nav-title gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Book nav link, pathname: /jetpack/androidx/releases/leanback" track-type="bookNav" track-name="click" track-metadata-eventdetail="/jetpack/androidx/releases/leanback" ><span class="devsite-nav-text" tooltip>androidx.leanback</span></a></li><li class="devsite-nav-item"><a href="/jetpack/androidx/releases/legacy" class="devsite-nav-title gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Book nav link, pathname: /jetpack/androidx/releases/legacy" track-type="bookNav" track-name="click" track-metadata-eventdetail="/jetpack/androidx/releases/legacy" ><span class="devsite-nav-text" tooltip>androidx.legacy</span></a></li><li class="devsite-nav-item"><a href="/jetpack/androidx/releases/lifecycle" class="devsite-nav-title gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Book nav link, pathname: /jetpack/androidx/releases/lifecycle" track-type="bookNav" track-name="click" track-metadata-eventdetail="/jetpack/androidx/releases/lifecycle" ><span class="devsite-nav-text" tooltip>androidx.lifecycle</span></a></li><li class="devsite-nav-item"><a href="/jetpack/androidx/releases/lint" class="devsite-nav-title gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Book nav link, pathname: /jetpack/androidx/releases/lint" track-type="bookNav" track-name="click" track-metadata-eventdetail="/jetpack/androidx/releases/lint" ><span class="devsite-nav-text" tooltip>androidx.lint</span></a></li><li class="devsite-nav-item"><a href="/jetpack/androidx/releases/loader" class="devsite-nav-title gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Book nav link, pathname: /jetpack/androidx/releases/loader" track-type="bookNav" track-name="click" track-metadata-eventdetail="/jetpack/androidx/releases/loader" ><span class="devsite-nav-text" tooltip>androidx.loader</span></a></li><li class="devsite-nav-item"><a href="/jetpack/androidx/releases/localbroadcastmanager" class="devsite-nav-title gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Book nav link, pathname: /jetpack/androidx/releases/localbroadcastmanager" track-type="bookNav" track-name="click" track-metadata-eventdetail="/jetpack/androidx/releases/localbroadcastmanager" ><span class="devsite-nav-text" tooltip>androidx.localbroadcastmanager</span></a></li><li class="devsite-nav-item"><a href="/jetpack/androidx/releases/media" class="devsite-nav-title gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Book nav link, pathname: /jetpack/androidx/releases/media" track-type="bookNav" track-name="click" track-metadata-eventdetail="/jetpack/androidx/releases/media" ><span class="devsite-nav-text" tooltip>androidx.media</span></a></li><li class="devsite-nav-item"><a href="/jetpack/androidx/releases/media2" class="devsite-nav-title gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Book nav link, pathname: /jetpack/androidx/releases/media2" track-type="bookNav" track-name="click" track-metadata-eventdetail="/jetpack/androidx/releases/media2" ><span class="devsite-nav-text" tooltip>androidx.media2</span></a></li><li class="devsite-nav-item"><a href="/jetpack/androidx/releases/media3" class="devsite-nav-title gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Book nav link, pathname: /jetpack/androidx/releases/media3" track-type="bookNav" track-name="click" track-metadata-eventdetail="/jetpack/androidx/releases/media3" ><span class="devsite-nav-text" tooltip>androidx.media3</span></a></li><li class="devsite-nav-item"><a href="/jetpack/androidx/releases/mediarouter" class="devsite-nav-title gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Book nav link, pathname: /jetpack/androidx/releases/mediarouter" track-type="bookNav" track-name="click" track-metadata-eventdetail="/jetpack/androidx/releases/mediarouter" ><span class="devsite-nav-text" tooltip>androidx.mediarouter</span></a></li><li class="devsite-nav-item"><a href="/jetpack/androidx/releases/multidex" class="devsite-nav-title gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Book nav link, pathname: /jetpack/androidx/releases/multidex" track-type="bookNav" track-name="click" track-metadata-eventdetail="/jetpack/androidx/releases/multidex" ><span class="devsite-nav-text" tooltip>androidx.multidex</span></a></li><li class="devsite-nav-item"><a href="/jetpack/androidx/releases/metrics" class="devsite-nav-title gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Book nav link, pathname: /jetpack/androidx/releases/metrics" track-type="bookNav" track-name="click" track-metadata-eventdetail="/jetpack/androidx/releases/metrics" ><span class="devsite-nav-text" tooltip>androidx.metrics</span></a></li><li class="devsite-nav-item"><a href="/jetpack/androidx/releases/navigation" class="devsite-nav-title gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Book nav link, pathname: /jetpack/androidx/releases/navigation" track-type="bookNav" track-name="click" track-metadata-eventdetail="/jetpack/androidx/releases/navigation" ><span class="devsite-nav-text" tooltip>androidx.navigation</span></a></li><li class="devsite-nav-item"><a href="/jetpack/androidx/releases/paging" class="devsite-nav-title gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Book nav link, pathname: /jetpack/androidx/releases/paging" track-type="bookNav" track-name="click" track-metadata-eventdetail="/jetpack/androidx/releases/paging" ><span class="devsite-nav-text" tooltip>androidx.paging</span></a></li><li class="devsite-nav-item"><a href="/jetpack/androidx/releases/palette" class="devsite-nav-title gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Book nav link, pathname: /jetpack/androidx/releases/palette" track-type="bookNav" track-name="click" track-metadata-eventdetail="/jetpack/androidx/releases/palette" ><span class="devsite-nav-text" tooltip>androidx.palette</span></a></li><li class="devsite-nav-item"><a href="/jetpack/androidx/releases/pdf" class="devsite-nav-title gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Book nav link, pathname: /jetpack/androidx/releases/pdf" track-type="bookNav" track-name="click" track-metadata-eventdetail="/jetpack/androidx/releases/pdf" ><span class="devsite-nav-text" tooltip>androidx.pdf</span></a></li><li class="devsite-nav-item"><a href="/jetpack/androidx/releases/percentlayout" class="devsite-nav-title gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Book nav link, pathname: /jetpack/androidx/releases/percentlayout" track-type="bookNav" track-name="click" track-metadata-eventdetail="/jetpack/androidx/releases/percentlayout" ><span class="devsite-nav-text" tooltip>androidx.percentlayout</span></a></li><li class="devsite-nav-item"><a href="/jetpack/androidx/releases/preference" class="devsite-nav-title gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Book nav link, pathname: /jetpack/androidx/releases/preference" track-type="bookNav" track-name="click" track-metadata-eventdetail="/jetpack/androidx/releases/preference" ><span class="devsite-nav-text" tooltip>androidx.preference</span></a></li><li class="devsite-nav-item"><a href="/jetpack/androidx/releases/print" class="devsite-nav-title gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Book nav link, pathname: /jetpack/androidx/releases/print" track-type="bookNav" track-name="click" track-metadata-eventdetail="/jetpack/androidx/releases/print" ><span class="devsite-nav-text" tooltip>androidx.print</span></a></li><li class="devsite-nav-item"><a href="/jetpack/androidx/releases/privacysandbox-activity" class="devsite-nav-title gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Book nav link, pathname: /jetpack/androidx/releases/privacysandbox-activity" track-type="bookNav" track-name="click" track-metadata-eventdetail="/jetpack/androidx/releases/privacysandbox-activity" ><span class="devsite-nav-text" tooltip>androidx.privacysandbox.activity</span></a></li><li class="devsite-nav-item"><a href="/jetpack/androidx/releases/privacysandbox-ads" class="devsite-nav-title gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Book nav link, pathname: /jetpack/androidx/releases/privacysandbox-ads" track-type="bookNav" track-name="click" track-metadata-eventdetail="/jetpack/androidx/releases/privacysandbox-ads" ><span class="devsite-nav-text" tooltip>androidx.privacysandbox.ads</span></a></li><li class="devsite-nav-item"><a href="/jetpack/androidx/releases/privacysandbox-plugins" class="devsite-nav-title gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Book nav link, pathname: /jetpack/androidx/releases/privacysandbox-plugins" track-type="bookNav" track-name="click" track-metadata-eventdetail="/jetpack/androidx/releases/privacysandbox-plugins" ><span class="devsite-nav-text" tooltip>androidx.privacysandbox.plugins</span></a></li><li class="devsite-nav-item"><a href="/jetpack/androidx/releases/privacysandbox-sdkruntime" class="devsite-nav-title gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Book nav link, pathname: /jetpack/androidx/releases/privacysandbox-sdkruntime" track-type="bookNav" track-name="click" track-metadata-eventdetail="/jetpack/androidx/releases/privacysandbox-sdkruntime" ><span class="devsite-nav-text" tooltip>androidx.privacysandbox.sdkruntime</span></a></li><li class="devsite-nav-item"><a href="/jetpack/androidx/releases/privacysandbox-tools" class="devsite-nav-title gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Book nav link, pathname: /jetpack/androidx/releases/privacysandbox-tools" track-type="bookNav" track-name="click" track-metadata-eventdetail="/jetpack/androidx/releases/privacysandbox-tools" ><span class="devsite-nav-text" tooltip>androidx.privacysandbox.tools</span></a></li><li class="devsite-nav-item"><a href="/jetpack/androidx/releases/privacysandbox-ui" class="devsite-nav-title gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Book nav link, pathname: /jetpack/androidx/releases/privacysandbox-ui" track-type="bookNav" track-name="click" track-metadata-eventdetail="/jetpack/androidx/releases/privacysandbox-ui" ><span class="devsite-nav-text" tooltip>androidx.privacysandbox.ui</span></a></li><li class="devsite-nav-item"><a href="/jetpack/androidx/releases/profileinstaller" class="devsite-nav-title gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Book nav link, pathname: /jetpack/androidx/releases/profileinstaller" track-type="bookNav" track-name="click" track-metadata-eventdetail="/jetpack/androidx/releases/profileinstaller" ><span class="devsite-nav-text" tooltip>androidx.profileinstaller</span></a></li><li class="devsite-nav-item"><a href="/jetpack/androidx/releases/recommendation" class="devsite-nav-title gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Book nav link, pathname: /jetpack/androidx/releases/recommendation" track-type="bookNav" track-name="click" track-metadata-eventdetail="/jetpack/androidx/releases/recommendation" ><span class="devsite-nav-text" tooltip>androidx.recommendation</span></a></li><li class="devsite-nav-item"><a href="/jetpack/androidx/releases/recyclerview" class="devsite-nav-title gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Book nav link, pathname: /jetpack/androidx/releases/recyclerview" track-type="bookNav" track-name="click" track-metadata-eventdetail="/jetpack/androidx/releases/recyclerview" ><span class="devsite-nav-text" tooltip>androidx.recyclerview</span></a></li><li class="devsite-nav-item"><a href="/jetpack/androidx/releases/remotecallback" class="devsite-nav-title gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Book nav link, pathname: /jetpack/androidx/releases/remotecallback" track-type="bookNav" track-name="click" track-metadata-eventdetail="/jetpack/androidx/releases/remotecallback" ><span class="devsite-nav-text" tooltip>androidx.remotecallback</span></a></li><li class="devsite-nav-item"><a href="/jetpack/androidx/releases/resourceinspection" class="devsite-nav-title gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Book nav link, pathname: /jetpack/androidx/releases/resourceinspection" track-type="bookNav" track-name="click" track-metadata-eventdetail="/jetpack/androidx/releases/resourceinspection" ><span class="devsite-nav-text" tooltip>androidx.resourceinspection</span></a></li><li class="devsite-nav-item"><a href="/jetpack/androidx/releases/room" class="devsite-nav-title gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Book nav link, pathname: /jetpack/androidx/releases/room" track-type="bookNav" track-name="click" track-metadata-eventdetail="/jetpack/androidx/releases/room" ><span class="devsite-nav-text" tooltip>androidx.room</span></a></li><li class="devsite-nav-item"><a href="/jetpack/androidx/releases/savedstate" class="devsite-nav-title gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Book nav link, pathname: /jetpack/androidx/releases/savedstate" track-type="bookNav" track-name="click" track-metadata-eventdetail="/jetpack/androidx/releases/savedstate" ><span class="devsite-nav-text" tooltip>androidx.savedstate</span></a></li><li class="devsite-nav-item"><a href="/jetpack/androidx/releases/security" class="devsite-nav-title gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Book nav link, pathname: /jetpack/androidx/releases/security" track-type="bookNav" track-name="click" track-metadata-eventdetail="/jetpack/androidx/releases/security" ><span class="devsite-nav-text" tooltip>androidx.security</span></a></li><li class="devsite-nav-item"><a href="/jetpack/androidx/releases/sharetarget" class="devsite-nav-title gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Book nav link, pathname: /jetpack/androidx/releases/sharetarget" track-type="bookNav" track-name="click" track-metadata-eventdetail="/jetpack/androidx/releases/sharetarget" ><span class="devsite-nav-text" tooltip>androidx.sharetarget</span></a></li><li class="devsite-nav-item"><a href="/jetpack/androidx/releases/slice" class="devsite-nav-title gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Book nav link, pathname: /jetpack/androidx/releases/slice" track-type="bookNav" track-name="click" track-metadata-eventdetail="/jetpack/androidx/releases/slice" ><span class="devsite-nav-text" tooltip>androidx.slice</span></a></li><li class="devsite-nav-item"><a href="/jetpack/androidx/releases/slidingpanelayout" class="devsite-nav-title gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Book nav link, pathname: /jetpack/androidx/releases/slidingpanelayout" track-type="bookNav" track-name="click" track-metadata-eventdetail="/jetpack/androidx/releases/slidingpanelayout" ><span class="devsite-nav-text" tooltip>androidx.slidingpanelayout</span></a></li><li class="devsite-nav-item"><a href="/jetpack/androidx/releases/sqlite" class="devsite-nav-title gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Book nav link, pathname: /jetpack/androidx/releases/sqlite" track-type="bookNav" track-name="click" track-metadata-eventdetail="/jetpack/androidx/releases/sqlite" ><span class="devsite-nav-text" tooltip>androidx.sqlite</span></a></li><li class="devsite-nav-item"><a href="/jetpack/androidx/releases/startup" class="devsite-nav-title gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Book nav link, pathname: /jetpack/androidx/releases/startup" track-type="bookNav" track-name="click" track-metadata-eventdetail="/jetpack/androidx/releases/startup" ><span class="devsite-nav-text" tooltip>androidx.startup</span></a></li><li class="devsite-nav-item"><a href="/jetpack/androidx/releases/swiperefreshlayout" class="devsite-nav-title gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Book nav link, pathname: /jetpack/androidx/releases/swiperefreshlayout" track-type="bookNav" track-name="click" track-metadata-eventdetail="/jetpack/androidx/releases/swiperefreshlayout" ><span class="devsite-nav-text" tooltip>androidx.swiperefreshlayout</span></a></li><li class="devsite-nav-item"><a href="/jetpack/androidx/releases/test" class="devsite-nav-title gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Book nav link, pathname: /jetpack/androidx/releases/test" track-type="bookNav" track-name="click" track-metadata-eventdetail="/jetpack/androidx/releases/test" ><span class="devsite-nav-text" tooltip>androidx.test</span></a></li><li class="devsite-nav-item"><a href="/jetpack/androidx/releases/test-uiautomator" class="devsite-nav-title gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Book nav link, pathname: /jetpack/androidx/releases/test-uiautomator" track-type="bookNav" track-name="click" track-metadata-eventdetail="/jetpack/androidx/releases/test-uiautomator" ><span class="devsite-nav-text" tooltip>androidx.test.uiautomator</span></a></li><li class="devsite-nav-item"><a href="/jetpack/androidx/releases/textclassifier" class="devsite-nav-title gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Book nav link, pathname: /jetpack/androidx/releases/textclassifier" track-type="bookNav" track-name="click" track-metadata-eventdetail="/jetpack/androidx/releases/textclassifier" ><span class="devsite-nav-text" tooltip>androidx.textclassifier</span></a></li><li class="devsite-nav-item"><a href="/jetpack/androidx/releases/tracing" class="devsite-nav-title gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Book nav link, pathname: /jetpack/androidx/releases/tracing" track-type="bookNav" track-name="click" track-metadata-eventdetail="/jetpack/androidx/releases/tracing" ><span class="devsite-nav-text" tooltip>androidx.tracing</span></a></li><li class="devsite-nav-item"><a href="/jetpack/androidx/releases/transition" class="devsite-nav-title gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Book nav link, pathname: /jetpack/androidx/releases/transition" track-type="bookNav" track-name="click" track-metadata-eventdetail="/jetpack/androidx/releases/transition" ><span class="devsite-nav-text" tooltip>androidx.transition</span></a></li><li class="devsite-nav-item"><a href="/jetpack/androidx/releases/tv" class="devsite-nav-title gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Book nav link, pathname: /jetpack/androidx/releases/tv" track-type="bookNav" track-name="click" track-metadata-eventdetail="/jetpack/androidx/releases/tv" ><span class="devsite-nav-text" tooltip>androidx.tv</span></a></li><li class="devsite-nav-item"><a href="/jetpack/androidx/releases/tvprovider" class="devsite-nav-title gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Book nav link, pathname: /jetpack/androidx/releases/tvprovider" track-type="bookNav" track-name="click" track-metadata-eventdetail="/jetpack/androidx/releases/tvprovider" ><span class="devsite-nav-text" tooltip>androidx.tvprovider</span></a></li><li class="devsite-nav-item"><a href="/jetpack/androidx/releases/vectordrawable" class="devsite-nav-title gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Book nav link, pathname: /jetpack/androidx/releases/vectordrawable" track-type="bookNav" track-name="click" track-metadata-eventdetail="/jetpack/androidx/releases/vectordrawable" ><span class="devsite-nav-text" tooltip>androidx.vectordrawable</span></a></li><li class="devsite-nav-item"><a href="/jetpack/androidx/releases/versionedparcelable" class="devsite-nav-title gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Book nav link, pathname: /jetpack/androidx/releases/versionedparcelable" track-type="bookNav" track-name="click" track-metadata-eventdetail="/jetpack/androidx/releases/versionedparcelable" ><span class="devsite-nav-text" tooltip>androidx.versionedparcelable</span></a></li><li class="devsite-nav-item"><a href="/jetpack/androidx/releases/viewpager" class="devsite-nav-title gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Book nav link, pathname: /jetpack/androidx/releases/viewpager" track-type="bookNav" track-name="click" track-metadata-eventdetail="/jetpack/androidx/releases/viewpager" ><span class="devsite-nav-text" tooltip>androidx.viewpager</span></a></li><li class="devsite-nav-item"><a href="/jetpack/androidx/releases/viewpager2" class="devsite-nav-title gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Book nav link, pathname: /jetpack/androidx/releases/viewpager2" track-type="bookNav" track-name="click" track-metadata-eventdetail="/jetpack/androidx/releases/viewpager2" ><span class="devsite-nav-text" tooltip>androidx.viewpager2</span></a></li><li class="devsite-nav-item"><a href="/jetpack/androidx/releases/wear" class="devsite-nav-title gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Book nav link, pathname: /jetpack/androidx/releases/wear" track-type="bookNav" track-name="click" track-metadata-eventdetail="/jetpack/androidx/releases/wear" ><span class="devsite-nav-text" tooltip>androidx.wear</span></a></li><li class="devsite-nav-item"><a href="/jetpack/androidx/releases/wear-compose" class="devsite-nav-title gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Book nav link, pathname: /jetpack/androidx/releases/wear-compose" track-type="bookNav" track-name="click" track-metadata-eventdetail="/jetpack/androidx/releases/wear-compose" ><span class="devsite-nav-text" tooltip>androidx.wear.compose</span></a></li><li class="devsite-nav-item"><a href="/jetpack/androidx/releases/wear-protolayout" class="devsite-nav-title gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Book nav link, pathname: /jetpack/androidx/releases/wear-protolayout" track-type="bookNav" track-name="click" track-metadata-eventdetail="/jetpack/androidx/releases/wear-protolayout" ><span class="devsite-nav-text" tooltip>androidx.wear.protolayout</span></a></li><li class="devsite-nav-item"><a href="/jetpack/androidx/releases/wear-tiles" class="devsite-nav-title gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Book nav link, pathname: /jetpack/androidx/releases/wear-tiles" track-type="bookNav" track-name="click" track-metadata-eventdetail="/jetpack/androidx/releases/wear-tiles" ><span class="devsite-nav-text" tooltip>androidx.wear.tiles</span></a></li><li class="devsite-nav-item"><a href="/jetpack/androidx/releases/wear-watchface" class="devsite-nav-title gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Book nav link, pathname: /jetpack/androidx/releases/wear-watchface" track-type="bookNav" track-name="click" track-metadata-eventdetail="/jetpack/androidx/releases/wear-watchface" ><span class="devsite-nav-text" tooltip>androidx.wear.watchface</span></a></li><li class="devsite-nav-item"><a href="/jetpack/androidx/releases/webkit" class="devsite-nav-title gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Book nav link, pathname: /jetpack/androidx/releases/webkit" track-type="bookNav" track-name="click" track-metadata-eventdetail="/jetpack/androidx/releases/webkit" ><span class="devsite-nav-text" tooltip>androidx.webkit</span></a></li><li class="devsite-nav-item"><a href="/jetpack/androidx/releases/window" class="devsite-nav-title gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Book nav link, pathname: /jetpack/androidx/releases/window" track-type="bookNav" track-name="click" track-metadata-eventdetail="/jetpack/androidx/releases/window" ><span class="devsite-nav-text" tooltip>androidx.window</span></a></li><li class="devsite-nav-item"><a href="/jetpack/androidx/releases/window-extensions-core" class="devsite-nav-title gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Book nav link, pathname: /jetpack/androidx/releases/window-extensions-core" track-type="bookNav" track-name="click" track-metadata-eventdetail="/jetpack/androidx/releases/window-extensions-core" ><span class="devsite-nav-text" tooltip>androidx.window.extensions.core</span></a></li><li class="devsite-nav-item"><a href="/jetpack/androidx/releases/work" class="devsite-nav-title gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Book nav link, pathname: /jetpack/androidx/releases/work" track-type="bookNav" track-name="click" track-metadata-eventdetail="/jetpack/androidx/releases/work" ><span class="devsite-nav-text" tooltip>androidx.work</span></a></li><li class="devsite-nav-item"><a href="/jetpack/androidx/releases/jetifier" class="devsite-nav-title gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Book nav link, pathname: /jetpack/androidx/releases/jetifier" track-type="bookNav" track-name="click" track-metadata-eventdetail="/jetpack/androidx/releases/jetifier" ><span class="devsite-nav-text" tooltip>tools.build.jetifier</span></a></li></ul></div></li> <li class="devsite-nav-item devsite-nav-expandable"><div class="devsite-expandable-nav"> <a class="devsite-nav-toggle" aria-hidden="true"></a><div class="devsite-nav-title devsite-nav-title-no-path" tabindex="0" role="button"> <span class="devsite-nav-text" tooltip>Release Note Archive</span> </div><ul class="devsite-nav-section"><li class="devsite-nav-item"><a href="/jetpack/androidx/releases/archive" class="devsite-nav-title gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Book nav link, pathname: /jetpack/androidx/releases/archive" track-type="bookNav" track-name="click" track-metadata-eventdetail="/jetpack/androidx/releases/archive" ><span class="devsite-nav-text" tooltip>Overview</span></a></li><li class="devsite-nav-item"><a href="/jetpack/androidx/releases/archive/test" class="devsite-nav-title gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Book nav link, pathname: /jetpack/androidx/releases/archive/test" track-type="bookNav" track-name="click" track-metadata-eventdetail="/jetpack/androidx/releases/archive/test" ><span class="devsite-nav-text" tooltip>Test</span></a></li><li class="devsite-nav-item"><a href="/jetpack/androidx/releases/archive/arch" class="devsite-nav-title gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Book nav link, pathname: /jetpack/androidx/releases/archive/arch" track-type="bookNav" track-name="click" track-metadata-eventdetail="/jetpack/androidx/releases/archive/arch" ><span class="devsite-nav-text" tooltip>Architecture Components</span></a></li><li class="devsite-nav-item"><a href="/jetpack/androidx/releases/archive/androidx" class="devsite-nav-title gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Book nav link, pathname: /jetpack/androidx/releases/archive/androidx" track-type="bookNav" track-name="click" track-metadata-eventdetail="/jetpack/androidx/releases/archive/androidx" ><span class="devsite-nav-text" tooltip>AndroidX</span></a></li></ul></div></li> <li class="devsite-nav-item"><a href="/jetpack/androidx/compose-roadmap" class="devsite-nav-title gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Book nav link, pathname: /jetpack/androidx/compose-roadmap" track-type="bookNav" track-name="click" track-metadata-eventdetail="/jetpack/androidx/compose-roadmap" ><span class="devsite-nav-text" tooltip>Jetpack Compose Roadmap</span></a></li> <li class="devsite-nav-item"><a href="/jetpack/androidx/releases/compose-kotlin" class="devsite-nav-title gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Book nav link, pathname: /jetpack/androidx/releases/compose-kotlin" track-type="bookNav" track-name="click" track-metadata-eventdetail="/jetpack/androidx/releases/compose-kotlin" ><span class="devsite-nav-text" tooltip>Jetpack Compose Kotlin Compatibility</span></a></li> </ul> <ul class="devsite-nav-list" menu="Essentials" aria-label="Side menu" hidden> <li class="devsite-nav-item devsite-nav-heading"> <span class="devsite-nav-title" tooltip > <span class="devsite-nav-text" tooltip > Gemini in Android Studio </span> </span> </li> <li class="devsite-nav-item"> <a href="/gemini-in-android" class="devsite-nav-title gc-analytics-event " data-category="Site-Wide Custom Events" data-label="Responsive Tab: Learn more" track-type="navMenu" track-metadata-eventDetail="globalMenu" track-metadata-position="nav"> <span class="devsite-nav-text" tooltip > Learn more </span> </a> </li> <li class="devsite-nav-item"> <a href="/studio" class="devsite-nav-title gc-analytics-event " data-category="Site-Wide Custom Events" data-label="Responsive Tab: Get Android Studio" track-type="navMenu" track-metadata-eventDetail="globalMenu" track-metadata-position="nav"> <span class="devsite-nav-text" tooltip > Get Android Studio </span> </a> </li> <li class="devsite-nav-item devsite-nav-heading"> <span class="devsite-nav-title" tooltip > <span class="devsite-nav-text" tooltip > Get started </span> </span> </li> <li class="devsite-nav-item"> <a href="/get-started/overview" class="devsite-nav-title gc-analytics-event " data-category="Site-Wide Custom Events" data-label="Responsive Tab: Hello world" track-type="navMenu" track-metadata-eventDetail="globalMenu" track-metadata-position="nav"> <span class="devsite-nav-text" tooltip > Hello world </span> </a> </li> <li class="devsite-nav-item"> <a href="/courses" class="devsite-nav-title gc-analytics-event " data-category="Site-Wide Custom Events" data-label="Responsive Tab: Training courses" track-type="navMenu" track-metadata-eventDetail="globalMenu" track-metadata-position="nav"> <span class="devsite-nav-text" tooltip > Training courses </span> </a> </li> <li class="devsite-nav-item"> <a href="/get-started/codelabs" class="devsite-nav-title gc-analytics-event " data-category="Site-Wide Custom Events" data-label="Responsive Tab: Tutorials" track-type="navMenu" track-metadata-eventDetail="globalMenu" track-metadata-position="nav"> <span class="devsite-nav-text" tooltip > Tutorials </span> </a> </li> <li class="devsite-nav-item"> <a href="/kotlin" class="devsite-nav-title gc-analytics-event " data-category="Site-Wide Custom Events" data-label="Responsive Tab: Kotlin for Android" track-type="navMenu" track-metadata-eventDetail="globalMenu" track-metadata-position="nav"> <span class="devsite-nav-text" tooltip > Kotlin for Android </span> </a> </li> <li class="devsite-nav-item"> <a href="https://play.google.com/console/about/guides/monetize/" class="devsite-nav-title gc-analytics-event " data-category="Site-Wide Custom Events" data-label="Responsive Tab: Monetization with Play ↗️" track-type="navMenu" track-metadata-eventDetail="globalMenu" track-metadata-position="nav"> <span class="devsite-nav-text" tooltip > Monetization with Play ↗️ </span> </a> </li> <li class="devsite-nav-item devsite-nav-heading"> <span class="devsite-nav-title" tooltip > <span class="devsite-nav-text" tooltip > Extend by device </span> </span> </li> <li class="devsite-nav-item"> <a href="/adaptive-apps" class="devsite-nav-title gc-analytics-event " data-category="Site-Wide Custom Events" data-label="Responsive Tab: Adaptive apps" track-type="navMenu" track-metadata-eventDetail="globalMenu" track-metadata-position="nav"> <span class="devsite-nav-text" tooltip > Adaptive apps </span> </a> </li> <li class="devsite-nav-item"> <a href="/wear" class="devsite-nav-title gc-analytics-event " data-category="Site-Wide Custom Events" data-label="Responsive Tab: Wear OS" track-type="navMenu" track-metadata-eventDetail="globalMenu" track-metadata-position="nav"> <span class="devsite-nav-text" tooltip > Wear OS </span> </a> </li> <li class="devsite-nav-item"> <a href="/cars" class="devsite-nav-title gc-analytics-event " data-category="Site-Wide Custom Events" data-label="Responsive Tab: Android for Cars" track-type="navMenu" track-metadata-eventDetail="globalMenu" track-metadata-position="nav"> <span class="devsite-nav-text" tooltip > Android for Cars </span> </a> </li> <li class="devsite-nav-item"> <a href="/tv" class="devsite-nav-title gc-analytics-event " data-category="Site-Wide Custom Events" data-label="Responsive Tab: Android TV" track-type="navMenu" track-metadata-eventDetail="globalMenu" track-metadata-position="nav"> <span class="devsite-nav-text" tooltip > Android TV </span> </a> </li> <li class="devsite-nav-item"> <a href="/chrome-os" class="devsite-nav-title gc-analytics-event " data-category="Site-Wide Custom Events" data-label="Responsive Tab: ChromeOS" track-type="navMenu" track-metadata-eventDetail="globalMenu" track-metadata-position="nav"> <span class="devsite-nav-text" tooltip > ChromeOS </span> </a> </li> <li class="devsite-nav-item"> <a href="/multi-device-development" class="devsite-nav-title gc-analytics-event " data-category="Site-Wide Custom Events" data-label="Responsive Tab: Cross-device SDK" track-type="navMenu" track-metadata-eventDetail="globalMenu" track-metadata-position="nav"> <span class="devsite-nav-text" tooltip > Cross-device SDK </span> </a> </li> <li class="devsite-nav-item devsite-nav-heading"> <span class="devsite-nav-title" tooltip > <span class="devsite-nav-text" tooltip > Build by category </span> </span> </li> <li class="devsite-nav-item"> <a href="/games" class="devsite-nav-title gc-analytics-event " data-category="Site-Wide Custom Events" data-label="Responsive Tab: Games" track-type="navMenu" track-metadata-eventDetail="globalMenu" track-metadata-position="nav"> <span class="devsite-nav-text" tooltip > Games </span> </a> </li> <li class="devsite-nav-item"> <a href="/media" class="devsite-nav-title gc-analytics-event " data-category="Site-Wide Custom Events" data-label="Responsive Tab: Camera &amp; Media" track-type="navMenu" track-metadata-eventDetail="globalMenu" track-metadata-position="nav"> <span class="devsite-nav-text" tooltip > Camera &amp; Media </span> </a> </li> <li class="devsite-nav-item"> <a href="/social-and-messaging" class="devsite-nav-title gc-analytics-event " data-category="Site-Wide Custom Events" data-label="Responsive Tab: Social &amp; messaging" track-type="navMenu" track-metadata-eventDetail="globalMenu" track-metadata-position="nav"> <span class="devsite-nav-text" tooltip > Social &amp; messaging </span> </a> </li> <li class="devsite-nav-item"> <a href="/health-and-fitness" class="devsite-nav-title gc-analytics-event " data-category="Site-Wide Custom Events" data-label="Responsive Tab: Health &amp; Fitness" track-type="navMenu" track-metadata-eventDetail="globalMenu" track-metadata-position="nav"> <span class="devsite-nav-text" tooltip > Health &amp; Fitness </span> </a> </li> <li class="devsite-nav-item"> <a href="/productivity" class="devsite-nav-title gc-analytics-event " data-category="Site-Wide Custom Events" data-label="Responsive Tab: Productivity" track-type="navMenu" track-metadata-eventDetail="globalMenu" track-metadata-position="nav"> <span class="devsite-nav-text" tooltip > Productivity </span> </a> </li> <li class="devsite-nav-item"> <a href="/work/overview" class="devsite-nav-title gc-analytics-event " data-category="Site-Wide Custom Events" data-label="Responsive Tab: Enterprise apps" track-type="navMenu" track-metadata-eventDetail="globalMenu" track-metadata-position="nav"> <span class="devsite-nav-text" tooltip > Enterprise apps </span> </a> </li> <li class="devsite-nav-item devsite-nav-heading"> <span class="devsite-nav-title" tooltip > <span class="devsite-nav-text" tooltip > Get the latest </span> </span> </li> <li class="devsite-nav-item"> <a href="/latest-updates" class="devsite-nav-title gc-analytics-event " data-category="Site-Wide Custom Events" data-label="Responsive Tab: Latest updates" track-type="navMenu" track-metadata-eventDetail="globalMenu" track-metadata-position="nav"> <span class="devsite-nav-text" tooltip > Latest updates </span> </a> </li> <li class="devsite-nav-item"> <a href="/latest-updates/experimental" class="devsite-nav-title gc-analytics-event " data-category="Site-Wide Custom Events" data-label="Responsive Tab: Experimental updates" track-type="navMenu" track-metadata-eventDetail="globalMenu" track-metadata-position="nav"> <span class="devsite-nav-text" tooltip > Experimental updates </span> </a> </li> <li class="devsite-nav-item"> <a href="/studio/preview" class="devsite-nav-title gc-analytics-event " data-category="Site-Wide Custom Events" data-label="Responsive Tab: Android Studio preview" track-type="navMenu" track-metadata-eventDetail="globalMenu" track-metadata-position="nav"> <span class="devsite-nav-text" tooltip > Android Studio preview </span> </a> </li> <li class="devsite-nav-item"> <a href="/jetpack/androidx/versions" class="devsite-nav-title gc-analytics-event " data-category="Site-Wide Custom Events" data-label="Responsive Tab: Jetpack &amp; Compose libraries" track-type="navMenu" track-metadata-eventDetail="globalMenu" track-metadata-position="nav"> <span class="devsite-nav-text" tooltip > Jetpack &amp; Compose libraries </span> </a> </li> <li class="devsite-nav-item"> <a href="/training/wearables/versions/4" class="devsite-nav-title gc-analytics-event " data-category="Site-Wide Custom Events" data-label="Responsive Tab: Wear OS preview" track-type="navMenu" track-metadata-eventDetail="globalMenu" track-metadata-position="nav"> <span class="devsite-nav-text" tooltip > Wear OS preview </span> </a> </li> <li class="devsite-nav-item"> <a href="/design-for-safety/privacy-sandbox" class="devsite-nav-title gc-analytics-event " data-category="Site-Wide Custom Events" data-label="Responsive Tab: Privacy Sandbox" track-type="navMenu" track-metadata-eventDetail="globalMenu" track-metadata-position="nav"> <span class="devsite-nav-text" tooltip > Privacy Sandbox </span> </a> </li> </ul> <ul class="devsite-nav-list" menu="Design &amp; Plan" aria-label="Side menu" hidden> <li class="devsite-nav-item devsite-nav-heading"> <span class="devsite-nav-title" tooltip > <span class="devsite-nav-text" tooltip > UI Design </span> </span> </li> <li class="devsite-nav-item"> <a href="/design/ui" class="devsite-nav-title gc-analytics-event " data-category="Site-Wide Custom Events" data-label="Responsive Tab: Design for Android" track-type="navMenu" track-metadata-eventDetail="globalMenu" track-metadata-position="nav"> <span class="devsite-nav-text" tooltip > Design for Android </span> </a> </li> <li class="devsite-nav-item"> <a href="/design/ui/mobile" class="devsite-nav-title gc-analytics-event " data-category="Site-Wide Custom Events" data-label="Responsive Tab: Mobile" track-type="navMenu" track-metadata-eventDetail="globalMenu" track-metadata-position="nav"> <span class="devsite-nav-text" tooltip > Mobile </span> </a> </li> <li class="devsite-nav-item"> <a href="/design/ui/large-screens" class="devsite-nav-title gc-analytics-event " data-category="Site-Wide Custom Events" data-label="Responsive Tab: Large screens (e.g., tablets)" track-type="navMenu" track-metadata-eventDetail="globalMenu" track-metadata-position="nav"> <span class="devsite-nav-text" tooltip > Large screens (e.g., tablets) </span> </a> </li> <li class="devsite-nav-item"> <a href="/design/ui/widget" class="devsite-nav-title gc-analytics-event " data-category="Site-Wide Custom Events" data-label="Responsive Tab: Widgets" track-type="navMenu" track-metadata-eventDetail="globalMenu" track-metadata-position="nav"> <span class="devsite-nav-text" tooltip > Widgets </span> </a> </li> <li class="devsite-nav-item"> <a href="/design/ui/wear" class="devsite-nav-title gc-analytics-event " data-category="Site-Wide Custom Events" data-label="Responsive Tab: Wear OS" track-type="navMenu" track-metadata-eventDetail="globalMenu" track-metadata-position="nav"> <span class="devsite-nav-text" tooltip > Wear OS </span> </a> </li> <li class="devsite-nav-item"> <a href="/design/ui/tv" class="devsite-nav-title gc-analytics-event " data-category="Site-Wide Custom Events" data-label="Responsive Tab: Android TV" track-type="navMenu" track-metadata-eventDetail="globalMenu" track-metadata-position="nav"> <span class="devsite-nav-text" tooltip > Android TV </span> </a> </li> <li class="devsite-nav-item devsite-nav-heading"> <span class="devsite-nav-title" tooltip > <span class="devsite-nav-text" tooltip > Architecture </span> </span> </li> <li class="devsite-nav-item"> <a href="/topic/architecture/intro" class="devsite-nav-title gc-analytics-event " data-category="Site-Wide Custom Events" data-label="Responsive Tab: Introduction" track-type="navMenu" track-metadata-eventDetail="globalMenu" track-metadata-position="nav"> <span class="devsite-nav-text" tooltip > Introduction </span> </a> </li> <li class="devsite-nav-item"> <a href="/topic/libraries/view-binding" class="devsite-nav-title gc-analytics-event " data-category="Site-Wide Custom Events" data-label="Responsive Tab: Libraries" track-type="navMenu" track-metadata-eventDetail="globalMenu" track-metadata-position="nav"> <span class="devsite-nav-text" tooltip > Libraries </span> </a> </li> <li class="devsite-nav-item"> <a href="/guide/navigation/navigation-principles" class="devsite-nav-title gc-analytics-event " data-category="Site-Wide Custom Events" data-label="Responsive Tab: Navigation" track-type="navMenu" track-metadata-eventDetail="globalMenu" track-metadata-position="nav"> <span class="devsite-nav-text" tooltip > Navigation </span> </a> </li> <li class="devsite-nav-item"> <a href="/topic/modularization" class="devsite-nav-title gc-analytics-event " data-category="Site-Wide Custom Events" data-label="Responsive Tab: Modularization" track-type="navMenu" track-metadata-eventDetail="globalMenu" track-metadata-position="nav"> <span class="devsite-nav-text" tooltip > Modularization </span> </a> </li> <li class="devsite-nav-item"> <a href="/training/testing/fundamentals" class="devsite-nav-title gc-analytics-event " data-category="Site-Wide Custom Events" data-label="Responsive Tab: Testing" track-type="navMenu" track-metadata-eventDetail="globalMenu" track-metadata-position="nav"> <span class="devsite-nav-text" tooltip > Testing </span> </a> </li> <li class="devsite-nav-item devsite-nav-heading"> <span class="devsite-nav-title" tooltip > <span class="devsite-nav-text" tooltip > Quality </span> </span> </li> <li class="devsite-nav-item"> <a href="/quality" class="devsite-nav-title gc-analytics-event " data-category="Site-Wide Custom Events" data-label="Responsive Tab: Overview" track-type="navMenu" track-metadata-eventDetail="globalMenu" track-metadata-position="nav"> <span class="devsite-nav-text" tooltip > Overview </span> </a> </li> <li class="devsite-nav-item"> <a href="/quality/core-value" class="devsite-nav-title gc-analytics-event " data-category="Site-Wide Custom Events" data-label="Responsive Tab: Core value" track-type="navMenu" track-metadata-eventDetail="globalMenu" track-metadata-position="nav"> <span class="devsite-nav-text" tooltip > Core value </span> </a> </li> <li class="devsite-nav-item"> <a href="/quality/user-experience" class="devsite-nav-title gc-analytics-event " data-category="Site-Wide Custom Events" data-label="Responsive Tab: User experience" track-type="navMenu" track-metadata-eventDetail="globalMenu" track-metadata-position="nav"> <span class="devsite-nav-text" tooltip > User experience </span> </a> </li> <li class="devsite-nav-item"> <a href="/quality/technical" class="devsite-nav-title gc-analytics-event " data-category="Site-Wide Custom Events" data-label="Responsive Tab: Technical quality" track-type="navMenu" track-metadata-eventDetail="globalMenu" track-metadata-position="nav"> <span class="devsite-nav-text" tooltip > Technical quality </span> </a> </li> <li class="devsite-nav-item"> <a href="/quality/privacy-and-security" class="devsite-nav-title gc-analytics-event " data-category="Site-Wide Custom Events" data-label="Responsive Tab: Security" track-type="navMenu" track-metadata-eventDetail="globalMenu" track-metadata-position="nav"> <span class="devsite-nav-text" tooltip > Security </span> </a> </li> <li class="devsite-nav-item devsite-nav-heading"> <span class="devsite-nav-title" tooltip > <span class="devsite-nav-text" tooltip > Security </span> </span> </li> <li class="devsite-nav-item"> <a href="/security" class="devsite-nav-title gc-analytics-event " data-category="Site-Wide Custom Events" data-label="Responsive Tab: Overview" track-type="navMenu" track-metadata-eventDetail="globalMenu" track-metadata-position="nav"> <span class="devsite-nav-text" tooltip > Overview </span> </a> </li> <li class="devsite-nav-item"> <a href="/privacy-and-security/about" class="devsite-nav-title gc-analytics-event " data-category="Site-Wide Custom Events" data-label="Responsive Tab: Privacy" track-type="navMenu" track-metadata-eventDetail="globalMenu" track-metadata-position="nav"> <span class="devsite-nav-text" tooltip > Privacy </span> </a> </li> <li class="devsite-nav-item"> <a href="/identity" class="devsite-nav-title gc-analytics-event " data-category="Site-Wide Custom Events" data-label="Responsive Tab: Identity" track-type="navMenu" track-metadata-eventDetail="globalMenu" track-metadata-position="nav"> <span class="devsite-nav-text" tooltip > Identity </span> </a> </li> <li class="devsite-nav-item"> <a href="/security/fraud-prevention" class="devsite-nav-title gc-analytics-event " data-category="Site-Wide Custom Events" data-label="Responsive Tab: Fraud prevention" track-type="navMenu" track-metadata-eventDetail="globalMenu" track-metadata-position="nav"> <span class="devsite-nav-text" tooltip > Fraud prevention </span> </a> </li> <li class="devsite-nav-item devsite-nav-heading"> <span class="devsite-nav-title" tooltip > <span class="devsite-nav-text" tooltip > Build for Billions </span> </span> </li> <li class="devsite-nav-item"> <a href="/build-for-billions" class="devsite-nav-title gc-analytics-event " data-category="Site-Wide Custom Events" data-label="Responsive Tab: Overview" track-type="navMenu" track-metadata-eventDetail="globalMenu" track-metadata-position="nav"> <span class="devsite-nav-text" tooltip > Overview </span> </a> </li> <li class="devsite-nav-item"> <a href="/docs/quality-guidelines/build-for-billions" class="devsite-nav-title gc-analytics-event " data-category="Site-Wide Custom Events" data-label="Responsive Tab: About new markets" track-type="navMenu" track-metadata-eventDetail="globalMenu" track-metadata-position="nav"> <span class="devsite-nav-text" tooltip > About new markets </span> </a> </li> <li class="devsite-nav-item"> <a href="/guide/topics/androidgo" class="devsite-nav-title gc-analytics-event " data-category="Site-Wide Custom Events" data-label="Responsive Tab: Android (Go edition)" track-type="navMenu" track-metadata-eventDetail="globalMenu" track-metadata-position="nav"> <span class="devsite-nav-text" tooltip > Android (Go edition) </span> </a> </li> </ul> <ul class="devsite-nav-list" menu="Develop" aria-label="Side menu" hidden> <li class="devsite-nav-item devsite-nav-heading"> <span class="devsite-nav-title" tooltip > <span class="devsite-nav-text" tooltip > Build AI experiences </span> </span> </li> <li class="devsite-nav-item"> <a href="/ai" class="devsite-nav-title gc-analytics-event " data-category="Site-Wide Custom Events" data-label="Responsive Tab: Get started" track-type="navMenu" track-metadata-eventDetail="globalMenu" track-metadata-position="nav"> <span class="devsite-nav-text" tooltip > Get started </span> </a> </li> <li class="devsite-nav-item devsite-nav-heading"> <span class="devsite-nav-title" tooltip > <span class="devsite-nav-text" tooltip > Core areas </span> </span> </li> <li class="devsite-nav-item"> <a href="/samples" class="devsite-nav-title gc-analytics-event " data-category="Site-Wide Custom Events" data-label="Responsive Tab: Samples" track-type="navMenu" track-metadata-eventDetail="globalMenu" track-metadata-position="nav"> <span class="devsite-nav-text" tooltip > Samples </span> </a> </li> <li class="devsite-nav-item"> <a href="/quick-guides" class="devsite-nav-title gc-analytics-event " data-category="Site-Wide Custom Events" data-label="Responsive Tab: Try Quick Guidesᵇᵉᵗᵃ" track-type="navMenu" track-metadata-eventDetail="globalMenu" track-metadata-position="nav"> <span class="devsite-nav-text" tooltip > Try Quick Guidesᵇᵉᵗᵃ </span> </a> </li> <li class="devsite-nav-item"> <a href="/develop/ui" class="devsite-nav-title gc-analytics-event " data-category="Site-Wide Custom Events" data-label="Responsive Tab: User interfaces" track-type="navMenu" track-metadata-eventDetail="globalMenu" track-metadata-position="nav"> <span class="devsite-nav-text" tooltip > User interfaces </span> </a> </li> <li class="devsite-nav-item"> <a href="/guide/topics/permissions/overview" class="devsite-nav-title gc-analytics-event " data-category="Site-Wide Custom Events" data-label="Responsive Tab: Permissions" track-type="navMenu" track-metadata-eventDetail="globalMenu" track-metadata-position="nav"> <span class="devsite-nav-text" tooltip > Permissions </span> </a> </li> <li class="devsite-nav-item"> <a href="/develop/background-work" class="devsite-nav-title gc-analytics-event " data-category="Site-Wide Custom Events" data-label="Responsive Tab: Background work" track-type="navMenu" track-metadata-eventDetail="globalMenu" track-metadata-position="nav"> <span class="devsite-nav-text" tooltip > Background work </span> </a> </li> <li class="devsite-nav-item"> <a href="/guide/topics/data" class="devsite-nav-title gc-analytics-event " data-category="Site-Wide Custom Events" data-label="Responsive Tab: Data and files" track-type="navMenu" track-metadata-eventDetail="globalMenu" track-metadata-position="nav"> <span class="devsite-nav-text" tooltip > Data and files </span> </a> </li> <li class="devsite-nav-item"> <a href="/develop#core-areas" class="devsite-nav-title gc-analytics-event " data-category="Site-Wide Custom Events" data-label="Responsive Tab: All core areas ⤵️" track-type="navMenu" track-metadata-eventDetail="globalMenu" track-metadata-position="nav"> <span class="devsite-nav-text" tooltip > All core areas ⤵️ </span> </a> </li> <li class="devsite-nav-item devsite-nav-heading"> <span class="devsite-nav-title" tooltip > <span class="devsite-nav-text" tooltip > Tools and workflow </span> </span> </li> <li class="devsite-nav-item"> <a href="/studio/write" class="devsite-nav-title gc-analytics-event " data-category="Site-Wide Custom Events" data-label="Responsive Tab: Write and debug code" track-type="navMenu" track-metadata-eventDetail="globalMenu" track-metadata-position="nav"> <span class="devsite-nav-text" tooltip > Write and debug code </span> </a> </li> <li class="devsite-nav-item"> <a href="/build/gradle-build-overview" class="devsite-nav-title gc-analytics-event " data-category="Site-Wide Custom Events" data-label="Responsive Tab: Build projects" track-type="navMenu" track-metadata-eventDetail="globalMenu" track-metadata-position="nav"> <span class="devsite-nav-text" tooltip > Build projects </span> </a> </li> <li class="devsite-nav-item"> <a href="/training/testing" class="devsite-nav-title gc-analytics-event " data-category="Site-Wide Custom Events" data-label="Responsive Tab: Test your app" track-type="navMenu" track-metadata-eventDetail="globalMenu" track-metadata-position="nav"> <span class="devsite-nav-text" tooltip > Test your app </span> </a> </li> <li class="devsite-nav-item"> <a href="/topic/performance/overview" class="devsite-nav-title gc-analytics-event " data-category="Site-Wide Custom Events" data-label="Responsive Tab: Performance" track-type="navMenu" track-metadata-eventDetail="globalMenu" track-metadata-position="nav"> <span class="devsite-nav-text" tooltip > Performance </span> </a> </li> <li class="devsite-nav-item"> <a href="/tools" class="devsite-nav-title gc-analytics-event " data-category="Site-Wide Custom Events" data-label="Responsive Tab: Command-line tools" track-type="navMenu" track-metadata-eventDetail="globalMenu" track-metadata-position="nav"> <span class="devsite-nav-text" tooltip > Command-line tools </span> </a> </li> <li class="devsite-nav-item"> <a href="/reference/tools/gradle-api" class="devsite-nav-title gc-analytics-event " data-category="Site-Wide Custom Events" data-label="Responsive Tab: Gradle plugin API" track-type="navMenu" track-metadata-eventDetail="globalMenu" track-metadata-position="nav"> <span class="devsite-nav-text" tooltip > Gradle plugin API </span> </a> </li> <li class="devsite-nav-item devsite-nav-heading"> <span class="devsite-nav-title" tooltip > <span class="devsite-nav-text" tooltip > Device tech </span> </span> </li> <li class="devsite-nav-item"> <a href="/guide/topics/large-screens/get-started-with-large-screens" class="devsite-nav-title gc-analytics-event " data-category="Site-Wide Custom Events" data-label="Responsive Tab: Large screens (e.g., tablets)" track-type="navMenu" track-metadata-eventDetail="globalMenu" track-metadata-position="nav"> <span class="devsite-nav-text" tooltip > Large screens (e.g., tablets) </span> </a> </li> <li class="devsite-nav-item"> <a href="/training/wearables" class="devsite-nav-title gc-analytics-event " data-category="Site-Wide Custom Events" data-label="Responsive Tab: Wear OS" track-type="navMenu" track-metadata-eventDetail="globalMenu" track-metadata-position="nav"> <span class="devsite-nav-text" tooltip > Wear OS </span> </a> </li> <li class="devsite-nav-item"> <a href="/health-and-fitness/guides" class="devsite-nav-title gc-analytics-event " data-category="Site-Wide Custom Events" data-label="Responsive Tab: Android Health" track-type="navMenu" track-metadata-eventDetail="globalMenu" track-metadata-position="nav"> <span class="devsite-nav-text" tooltip > Android Health </span> </a> </li> <li class="devsite-nav-item"> <a href="/guide/topics/connectivity/cross-device-sdk/overview" class="devsite-nav-title gc-analytics-event " data-category="Site-Wide Custom Events" data-label="Responsive Tab: Cross-device SDK" track-type="navMenu" track-metadata-eventDetail="globalMenu" track-metadata-position="nav"> <span class="devsite-nav-text" tooltip > Cross-device SDK </span> </a> </li> <li class="devsite-nav-item"> <a href="/training/cars" class="devsite-nav-title gc-analytics-event " data-category="Site-Wide Custom Events" data-label="Responsive Tab: Android for Cars" track-type="navMenu" track-metadata-eventDetail="globalMenu" track-metadata-position="nav"> <span class="devsite-nav-text" tooltip > Android for Cars </span> </a> </li> <li class="devsite-nav-item"> <a href="/training/tv" class="devsite-nav-title gc-analytics-event " data-category="Site-Wide Custom Events" data-label="Responsive Tab: Android TV" track-type="navMenu" track-metadata-eventDetail="globalMenu" track-metadata-position="nav"> <span class="devsite-nav-text" tooltip > Android TV </span> </a> </li> <li class="devsite-nav-item"> <a href="/chrome-os/intro" class="devsite-nav-title gc-analytics-event " data-category="Site-Wide Custom Events" data-label="Responsive Tab: ChromeOS" track-type="navMenu" track-metadata-eventDetail="globalMenu" track-metadata-position="nav"> <span class="devsite-nav-text" tooltip > ChromeOS </span> </a> </li> <li class="devsite-nav-item devsite-nav-heading"> <span class="devsite-nav-title" tooltip > <span class="devsite-nav-text" tooltip > Libraries </span> </span> </li> <li class="devsite-nav-item"> <a href="/reference/packages" class="devsite-nav-title gc-analytics-event " data-category="Site-Wide Custom Events" data-label="Responsive Tab: Android platform" track-type="navMenu" track-metadata-eventDetail="globalMenu" track-metadata-position="nav"> <span class="devsite-nav-text" tooltip > Android platform </span> </a> </li> <li class="devsite-nav-item"> <a href="/jetpack/androidx/explorer" class="devsite-nav-title gc-analytics-event " data-category="Site-Wide Custom Events" data-label="Responsive Tab: Jetpack libraries" track-type="navMenu" track-metadata-eventDetail="globalMenu" track-metadata-position="nav"> <span class="devsite-nav-text" tooltip > Jetpack libraries </span> </a> </li> <li class="devsite-nav-item"> <a href="/jetpack/androidx/releases/compose" class="devsite-nav-title gc-analytics-event " data-category="Site-Wide Custom Events" data-label="Responsive Tab: Compose libraries" track-type="navMenu" track-metadata-eventDetail="globalMenu" track-metadata-position="nav"> <span class="devsite-nav-text" tooltip > Compose libraries </span> </a> </li> <li class="devsite-nav-item"> <a href="https://developers.google.com/android/reference/packages" class="devsite-nav-title gc-analytics-event " data-category="Site-Wide Custom Events" data-label="Responsive Tab: Google Play services ↗️" track-type="navMenu" track-metadata-eventDetail="globalMenu" track-metadata-position="nav"> <span class="devsite-nav-text" tooltip > Google Play services ↗️ </span> </a> </li> <li class="devsite-nav-item"> <a href="https://play.google.com/sdks" class="devsite-nav-title gc-analytics-event " data-category="Site-Wide Custom Events" data-label="Responsive Tab: Google Play SDK index ↗️" track-type="navMenu" track-metadata-eventDetail="globalMenu" track-metadata-position="nav"> <span class="devsite-nav-text" tooltip > Google Play SDK index ↗️ </span> </a> </li> </ul> </div> </div> </nav> </devsite-book-nav> <section id="gc-wrapper"> <main role="main" class="devsite-main-content" has-book-nav has-sidebar > <div class="devsite-sidebar"> <div class="devsite-sidebar-content"> <devsite-toc class="devsite-nav" role="navigation" aria-label="On this page" depth="2" scrollbars ></devsite-toc> <devsite-recommendations-sidebar class="nocontent devsite-nav"> </devsite-recommendations-sidebar> </div> </div> <devsite-content> <article class="devsite-article"> <div class="devsite-article-meta nocontent" role="navigation"> <ul class="devsite-breadcrumb-list" aria-label="Breadcrumb"> <li class="devsite-breadcrumb-item "> <a href="https://developer.android.com/" class="devsite-breadcrumb-link gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Breadcrumbs" data-value="1" track-type="globalNav" track-name="breadcrumb" track-metadata-position="1" track-metadata-eventdetail="Android Developers" > Android Developers </a> </li> <li class="devsite-breadcrumb-item "> <div class="devsite-breadcrumb-guillemet material-icons" aria-hidden="true"></div> <a href="https://developer.android.com/get-started/overview" class="devsite-breadcrumb-link gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Breadcrumbs" data-value="2" track-type="globalNav" track-name="breadcrumb" track-metadata-position="2" track-metadata-eventdetail="Get started" > Get started </a> </li> <li class="devsite-breadcrumb-item "> <div class="devsite-breadcrumb-guillemet material-icons" aria-hidden="true"></div> <a href="https://developer.android.com/jetpack" class="devsite-breadcrumb-link gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Breadcrumbs" data-value="3" track-type="globalNav" track-name="breadcrumb" track-metadata-position="3" track-metadata-eventdetail="Jetpack" > Jetpack </a> </li> <li class="devsite-breadcrumb-item "> <div class="devsite-breadcrumb-guillemet material-icons" aria-hidden="true"></div> <a href="https://developer.android.com/jetpack/androidx/explorer" class="devsite-breadcrumb-link gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Breadcrumbs" data-value="4" track-type="globalNav" track-name="breadcrumb" track-metadata-position="4" track-metadata-eventdetail="" > Libraries </a> </li> </ul> <devsite-thumb-rating position="header"> </devsite-thumb-rating> </div> <devsite-feature-tooltip ack-key="AckCollectionsBookmarkTooltipDismiss" analytics-category="Site-Wide Custom Events" analytics-action-show="Callout Profile displayed" analytics-action-close="Callout Profile dismissed" analytics-label="Create Collection Callout" class="devsite-page-bookmark-tooltip nocontent" dismiss-button="true" id="devsite-collections-dropdown" dismiss-button-text="Dismiss" close-button-text="Got it"> <devsite-bookmark></devsite-bookmark> <span slot="popout-heading"> Stay organized with collections </span> <span slot="popout-contents"> Save and categorize content based on your preferences. </span> </devsite-feature-tooltip> <devsite-toc class="devsite-nav" depth="2" devsite-toc-embedded > </devsite-toc> <devsite-recommendations-dropdown class="nocontent"></devsite-recommendations-dropdown> <div class="devsite-article-body clearfix devsite-no-page-title"> <h1 class="devsite-page-title" style="width:50%" id="workmanager" data-text="WorkManager" tabindex="-1">WorkManager</h1> <div style="align:right; text-align:right; padding-bottom:21px; margin-top:-45px; border-bottom:1px solid black;"> <a href="/topic/libraries/architecture/workmanager">User Guide</a>&nbsp;&nbsp;<a href="https://github.com/android/architecture-components-samples/tree/main/WorkManagerSample">Code Sample</a>&nbsp;&nbsp;<a href="https://codelabs.developers.google.com/codelabs/android-workmanager/#0">Codelab</a> </div> <div style="float:left; font-size:medium; margin-bottom:5px; margin-top:10px" class="nocontent"> <div style="text-align:left; font-size:90%; padding-right:30px; margin-right:10px; margin-bottom:10px;"> API Reference<br> <a href="/reference/kotlin/androidx/work/package-summary">androidx.work</a><br> <a href="/reference/kotlin/androidx/work/testing/package-summary">androidx.work.testing</a><br> </div> </div> <div style="text-align:left; padding-left:10px; margin-left:10px; margin-top:15px; margin-bottom:10px;"> The WorkManager API makes it easy to schedule deferrable, asynchronous tasks that must be run reliably. These APIs let you create a task and hand it off to WorkManager to run when the work constraints are met. </div> <div style="clear:both"></div> <aside class="note"><strong>Note:</strong><span> WorkManager requires <code translate="no" dir="ltr">compileSdk</code> version 33 or higher.</span></aside> <table style="width:100%"> <tr> <th style="width:15%">Latest Update</th> <th style="width:15%">Stable Release</th> <th style="width:15%">Release Candidate</th> <th style="width:15%">Beta Release</th> <th style="width:15%">Alpha Release</th></tr> <tr> <td>October 30, 2024</td> <td><a href="/jetpack/androidx/releases/work#2.9.1">2.9.1</a></td> <td>-</td> <td>-</td> <td>-</td> </tr> </table> <h2 id="declaring_dependencies" data-text="Declaring dependencies" tabindex="-1">Declaring dependencies</h2> <p>To add a dependency on WorkManager, you must add the <a href="/studio/build/dependencies#google-maven">Google Maven repository</a> to your project:</p> <p>Add the dependencies for the artifacts you need in the <code translate="no" dir="ltr">build.gradle</code> file for your app or module:</p> <div> <div class="ds-selector-tabs"><section><h3 id="groovy" data-text="Groovy" tabindex="-1">Groovy</h3> <pre class="prettyprint lang-groovy" translate="no" dir="ltr"> dependencies { def work_version = "2.9.1" // (Java only) implementation "androidx.work:work-runtime:$work_version" // Kotlin + coroutines implementation "androidx.work:work-runtime-ktx:$work_version" // optional - RxJava2 support implementation "androidx.work:work-rxjava2:$work_version" // optional - GCMNetworkManager support implementation "androidx.work:work-gcm:$work_version" // optional - Test helpers androidTestImplementation "androidx.work:work-testing:$work_version" // optional - Multiprocess support implementation "androidx.work:work-multiprocess:$work_version" } </pre> </section><section><h3 id="kts" data-text="Kotlin" tabindex="-1">Kotlin</h3> <pre class="prettyprint lang-kotlin" translate="no" dir="ltr"> dependencies { val work_version = "2.9.1" // (Java only) implementation("androidx.work:work-runtime:$work_version") // Kotlin + coroutines implementation("androidx.work:work-runtime-ktx:$work_version") // optional - RxJava2 support implementation("androidx.work:work-rxjava2:$work_version") // optional - GCMNetworkManager support implementation("androidx.work:work-gcm:$work_version") // optional - Test helpers androidTestImplementation("androidx.work:work-testing:$work_version") // optional - Multiprocess support implementation("androidx.work:work-multiprocess:$work_version") } </pre> </section></div> </div> <p>For information on using Kotlin extensions, see the <a href="/kotlin/ktx">ktx documentation</a>.</p> <p>For more information about dependencies, see <a href="/studio/build/dependencies">Add Build Dependencies</a>.</p> <h2 id="feedback" data-text="Feedback" tabindex="-1">Feedback</h2> <p>Your feedback helps make Jetpack better. Let us know if you discover new issues or have ideas for improving this library. Please take a look at the <a href="https://issuetracker.google.com/issues?q=componentid:409906%20status:open">existing issues</a> in this library before you create a new one. You can add your vote to an existing issue by clicking the star button.</p> <p><a href="https://issuetracker.google.com/issues/new?component=409906&template=1094197" class="button dac-button dac-outline-button">Create a new issue</a></p> <p>See the <a href="https://developers.google.com/issue-tracker">Issue Tracker documentation</a> for more information.</p> <h2 id="version_210_4" data-text="Version 2.10" tabindex="-1">Version 2.10</h2> <h3 id="2.10.0" data-text="Version 2.10.0" tabindex="-1">Version 2.10.0</h3> <p>October 30, 2024</p> <p><code translate="no" dir="ltr">androidx.work:work-*:2.10.0</code> is released. Version 2.10.0 contains <a href="https://android.googlesource.com/platform/frameworks/support/+log/61fffa80db30c92b3f06eb44b8f108dcdb33410e..380219beddae76ab6e6c9d16b8acbf25489d988d/work">these commits</a>.</p> <p>Significant changes since version 2.9.1</p> <ul> <li>Added trace tags to Jobs from <code translate="no" dir="ltr">WorkManager</code> which makes ‘adb shell dumpsys jobscheduler’ a lot simpler to understand since it will contain the name of the Worker being executed. Trace sections are also added around key areas of <code translate="no" dir="ltr">WorkManager</code>.</li> <li><code translate="no" dir="ltr">Configuration.workerCoroutineContext</code> was added to for control of dispatcher where <code translate="no" dir="ltr">CoroutineWorker</code> is executed.</li> <li>Developers can specify <code translate="no" dir="ltr">NetworkRequest</code> as a constraint for a worker via the <code translate="no" dir="ltr">Constraints.setRequiredNetworkRequest</code> method. This enables more granular control over which network this worker should run.</li> <li><code translate="no" dir="ltr">WorkManager</code> 2.10.0 is now compiled with SDK 35 and contain various changes for SDK 35 compatibility.</li> </ul> <h3 id="2.10.0-rc01" data-text="Version 2.10.0-rc01" tabindex="-1">Version 2.10.0-rc01</h3> <p>October 24, 2024</p> <p><code translate="no" dir="ltr">androidx.work:work-*:2.10.0-rc01</code> is released. Version 2.10.0-rc01 contains <a href="https://android.googlesource.com/platform/frameworks/support/+log/b6ae8d0a0e8cd803f7b84f30101eda1af4f1d6b6..61fffa80db30c92b3f06eb44b8f108dcdb33410e/work">these commits</a>.</p> <h3 id="2.10.0-beta01" data-text="Version 2.10.0-beta01" tabindex="-1">Version 2.10.0-beta01</h3> <p>October 2, 2024</p> <p><code translate="no" dir="ltr">androidx.work:work-*:2.10.0-beta01</code> is released. Version 2.10.0-beta01 contains <a href="https://android.googlesource.com/platform/frameworks/support/+log/0431b84980e97d6bafdfda7c9038bc4d9529564f..b6ae8d0a0e8cd803f7b84f30101eda1af4f1d6b6/work">these commits</a>.</p> <h3 id="2.10.0-alpha04" data-text="Version 2.10.0-alpha04" tabindex="-1">Version 2.10.0-alpha04</h3> <p>September 18, 2024</p> <p><code translate="no" dir="ltr">androidx.work:work-*:2.10.0-alpha04</code> is released. Version 2.10.0-alpha04 contains <a href="https://android.googlesource.com/platform/frameworks/support/+log/80f82d37cb9b40250ee9eb15d9cbe9e93849355e..0431b84980e97d6bafdfda7c9038bc4d9529564f/work">these commits</a>.</p> <p><strong>API Changes</strong></p> <ul> <li>Add the stop reason <code translate="no" dir="ltr">STOP_REASON_FOREGROUND_SERVICE_TIMEOUT</code> for when a foreground worker is stopped due to execution timeout based on the foreground service type. (<a href="https://android-review.googlesource.com/#/q/Ibd0afaa7c32fa41562d8386abea524cbd1bbe679">Ibd0af</a>)</li> </ul> <h3 id="2.10.0-alpha03" data-text="Version 2.10.0-alpha03" tabindex="-1">Version 2.10.0-alpha03</h3> <p>September 4, 2024</p> <p><code translate="no" dir="ltr">androidx.work:work-*:2.10.0-alpha03</code> is released. Version 2.10.0-alpha03 contains <a href="https://android.googlesource.com/platform/frameworks/support/+log/4584e40d8375770d35077900321f49bce0bd10c7..80f82d37cb9b40250ee9eb15d9cbe9e93849355e/work">these commits</a>.</p> <p><strong>New Features</strong></p> <ul> <li>Added trace tags to Jobs from <code translate="no" dir="ltr">WorkManager</code> which makes ‘adb shell dumpsys jobscheduler’ a lot simpler to understand since it will contain the name of the Worker being executed. Trace sections are also added around key areas of <code translate="no" dir="ltr">WorkManager</code>.</li> </ul> <p><strong>API Changes</strong></p> <ul> <li>WorkManager 2.10.0 is now compiled with SDK 35.</li> <li>Fix foreground workers of type ‘short service’ and ‘data sync’ timing out and causing an ANR when <code translate="no" dir="ltr">WorkManager</code> didn’t call <code translate="no" dir="ltr">stopSelf()</code>. This fix only applies to devices with API 34 and 35 where foreground service types were introduced. (<a href="https://android-review.googlesource.com/#/q/Ibd046586fe2851467948fdd6f70f98be4dca06b2">ca06b2</a>, <a href="https://issuetracker.google.com/issues/364508145">b/364508145</a>)</li> <li>New <code translate="no" dir="ltr">WorkerParameters</code> APIs that make it possible to switch the remote process that the <code translate="no" dir="ltr">Worker</code> binds to when using a <code translate="no" dir="ltr">WorkerFactory</code>. (<a href="https://android-review.googlesource.com/#/q/Ibdc8abb7966e8d3af41d0d93354d699a0426f303">Ibdc8a</a>, <a href="https://android-review.googlesource.com/#/q/Ie8a908627ca30ccc711ebbdaf8df4f8fa24e662f">Ie8a90</a>, <a href="https://android-review.googlesource.com/#/q/I7373f2fa1db38f5649cb6091bb69d58999b2ddba">I7373f</a>)</li> </ul> <p><strong>Bug Fixes</strong></p> <ul> <li>Fix a crash caused by <code translate="no" dir="ltr">WorkManager</code> attempting to restart a long-running worker (i.e. a foreground worker) when the foreground type of the work had Android 14 prerequisite permissions that were revoked. (<a href="https://issuetracker.google.com/issues/333957914">b/333957914</a>)</li> <li>Removed manual outlining of access to new platform APIs since this happens automatically via API modeling when using R8 with AGP 7.3 or later (e.g. R8 version 3.3) and for all builds when using AGP 8.1 or later (e.g. D8 version 8.1). Clients who are not using AGP are advised to update to D8 version 8.1 or later. See <a href="https://medium.com/androiddevelopers/mitigating-soft-verification-issues-in-r8-and-d8-7e9e06827dfd">this article</a> for more details. (<a href="https://android-review.googlesource.com/#/q/Ia60e0ab9f0fd613883a772c8aa34e27cc986cae8">Ia60e0</a>, <a href="https://issuetracker.google.com/issues/345472586">b/345472586</a>)</li> </ul> <h3 id="2.10.0-alpha02" data-text="Version 2.10.0-alpha02" tabindex="-1">Version 2.10.0-alpha02</h3> <p>April 17, 2024</p> <p><code translate="no" dir="ltr">androidx.work:work-*:2.10.0-alpha02</code> is released. Version 2.10.0-alpha02 contains <a href="https://android.googlesource.com/platform/frameworks/support/+log/51191bc12f96f233fc08995e1b4e8ff8b88bc7ce..4584e40d8375770d35077900321f49bce0bd10c7/work">these commits</a>.</p> <p><strong>API Changes</strong></p> <ul> <li>Added the ability to emit trace spans via a configurable <code translate="no" dir="ltr">@RestrictTo</code> <code translate="no" dir="ltr">Tracer</code> in <code translate="no" dir="ltr">WorkManager</code>. (<a href="https://android-review.googlesource.com/#/q/I17d7f0ec2b1947d09d568ca1f69ea6fee64c713c">I17d7f</a>, <a href="https://issuetracker.google.com/issues/260214125">b/260214125</a>)</li> <li><code translate="no" dir="ltr">Configuration.workerCoroutineContext</code> was added to for control of dispatcher where <code translate="no" dir="ltr">CoroutineWorker</code> is executed. It helps to completely avoid usage of <code translate="no" dir="ltr">Dispatchers.Default</code> in <code translate="no" dir="ltr">WorkManager</code>. (<a href="https://android-review.googlesource.com/#/q/Icd1b7755fc90ea71ac2e8509c0f21d3e60ca8d53">Icd1b7</a>)</li> <li>Add custom exception handlers for Workers (<a href="https://android-review.googlesource.com/#/q/Ib1b740f0503757bcc2baa90482a4e7b8d6002ffb">Ib1b74</a>, <a href="https://issuetracker.google.com/issues/261190695">b/261190695</a>)</li> <li><code translate="no" dir="ltr">OneTimeWorkRequest.Builder</code> and <code translate="no" dir="ltr">PeriodicWorkRequest.Builder</code> can now be constructed with <code translate="no" dir="ltr">KClass</code> instead of <code translate="no" dir="ltr">Class</code>: <code translate="no" dir="ltr">val request = OneTimeWorkRequest.Builder(Worker::class).setConstraints(...).build()</code> (<a href="https://android-review.googlesource.com/#/q/Ib55f6bb22dd629b4b3bfd94fb2480a6cfe222dc6">Ib55f6</a>)</li> <li><code translate="no" dir="ltr">WorkManager</code> class was migrated to Kotlin. Now methods that return <code translate="no" dir="ltr">LiveData</code>, <code translate="no" dir="ltr">ListenableFuture</code> or <code translate="no" dir="ltr">Flow</code> provides correct nullability information. It could require changes in clients&#39; source code, if nullability assumptions in that code were incorrect. (<a href="https://android-review.googlesource.com/#/q/If6757e6713968ebe46b37ad1605d0db430c23e38">If6757</a>)</li> </ul> <h3 id="2.10.0-alpha01" data-text="Version 2.10.0-alpha01" tabindex="-1">Version 2.10.0-alpha01</h3> <p>January 24, 2024</p> <p><code translate="no" dir="ltr">androidx.work:work-*:2.10.0-alpha01</code> is released. <a href="https://android.googlesource.com/platform/frameworks/support/+log/8dd90c8d04c2e85019a84ac8f4b01df8932f1899..51191bc12f96f233fc08995e1b4e8ff8b88bc7ce/work">Version 2.10.0-alpha01 contains these commits.</a></p> <p><strong>New Features</strong></p> <ul> <li>Developers can specify <code translate="no" dir="ltr">NetworkRequest</code> as a constraint for a worker via the <code translate="no" dir="ltr">Constraints.setRequiredNetworkRequest</code> method. This enables more granular control over which network this worker should run.</li> </ul> <p><strong>API Changes</strong></p> <ul> <li>Adding an ability to specify <code translate="no" dir="ltr">NetworkRequest</code> as the constraint. (<a href="https://android-review.googlesource.com/#/q/Id98a186c963c6472ead2392eccf37ae0e88048eb">Id98a1</a>, <a href="https://issuetracker.google.com/issues/280634452">b/280634452</a>)</li> </ul> <h2 id="version_29_2" data-text="Version 2.9" tabindex="-1">Version 2.9</h2> <h3 id="2.9.1" data-text="Version 2.9.1" tabindex="-1">Version 2.9.1</h3> <p>August 7, 2024</p> <p><code translate="no" dir="ltr">androidx.work:work-*:2.9.1</code> is released. Version 2.9.1 contains <a href="https://android.googlesource.com/platform/frameworks/support/+log/8dd90c8d04c2e85019a84ac8f4b01df8932f1899..a49fcf4e9a5dfa41c06e805d706d21d68e5cc6fb/work">these commits</a>.</p> <p><strong>Bug Fixes</strong></p> <ul> <li>Fix a crash caused by <code translate="no" dir="ltr">WorkManager</code> attempting to restart a long-running worker (i.e. a foreground worker) when the foreground type of the work had <a href="https://developer.android.com/about/versions/14/changes/fgs-types-required#system-runtime-checks">Android 14 prerequisite permissions</a> that were revoked. (<a href="https://issuetracker.google.com/333957914">b/333957914</a>)</li> </ul> <h3 id="2.9.0" data-text="Version 2.9.0" tabindex="-1">Version 2.9.0</h3> <p>November 29, 2023</p> <p><code translate="no" dir="ltr">androidx.work:work-*:2.9.0</code> is released. <a href="https://android.googlesource.com/platform/frameworks/support/+log/2b5fbfa0dbb62c3a185a0be13fb1a63f50b2c034..8dd90c8d04c2e85019a84ac8f4b01df8932f1899/work">Version 2.9.0 contains these commits.</a></p> <p><strong>Important changes since 2.8.0</strong></p> <ul> <li>Observability via <code translate="no" dir="ltr">Flow</code>-s. Instead of <code translate="no" dir="ltr">LiveData</code>, Worker&#39;s progress now can be observed via Flow’s via <code translate="no" dir="ltr">WorkManager.getWorkInfosFlow</code> and similar methods.</li> <li>Now <code translate="no" dir="ltr">WorkManager</code> provides a hint on why a worker was previously stopped. It can be queried from a worker itself via <code translate="no" dir="ltr">getStopReason()</code> method or from <code translate="no" dir="ltr">WorkInfo</code> via <code translate="no" dir="ltr">getStopReason()</code>.</li> <li>Precise scheduling of periodic workers via <code translate="no" dir="ltr">setNextScheduleTimeOverride</code>. This allows dynamic calculation of the next Periodic work schedule, which can be used to implement advanced features like adaptive refresh times, custom retry behavior, or making a newsfeed worker run before the user wakes up every morning without drift. <code translate="no" dir="ltr">ExistingPeriodicWorkPolicy.UPDATE</code> should be used with these techniques to avoid canceling a currently-running worker while scheduling the next one.</li> <li>WorkManager’s testing with threading matching production. <code translate="no" dir="ltr">ExecutorsMode.PRESERVE_EXECUTORS</code> can be used in <code translate="no" dir="ltr">initializeTestWorkManager</code> to preserve executors set in <code translate="no" dir="ltr">Configuration</code> and to use the real main thread.</li> <li>Coroutines APIs such as <code translate="no" dir="ltr">CoroutineWorker</code> have been moved from additional artifact work-runtime-ktx to the main artifact work-runtime. work-runtime-ktx is now empty.</li> </ul> <p><strong>API Changes</strong></p> <ul> <li><code translate="no" dir="ltr">stopReason</code> was added to <code translate="no" dir="ltr">WorkInfo</code>. It makes <code translate="no" dir="ltr">stopReason</code> available after the worker has run. It could be helpful in the reporting <code translate="no" dir="ltr">stopReason</code> in a usable way, because once a worker has been stopped, an app itself could be killed very quickly. (<a href="https://android-review.googlesource.com/#/q/I213869adf99dd675b705f6d7f7a080c7bed88220">I21386</a>)</li> <li>Allow <code translate="no" dir="ltr">Clock</code> to be set via config and used to drive execution sequencing of Worker tests. (<a href="https://android-review.googlesource.com/#/q/Ic586efd1c81ac21ece399f4d74f0d2d8bdb1e5ea">Ic586e</a>)</li> <li><code translate="no" dir="ltr">getStopReason()</code> method was added to <code translate="no" dir="ltr">ListenableWorker</code> that gives a hint why the worker was stopped. (<a href="https://android-review.googlesource.com/#/q/I070605b2337c30c496c02bef142167f65c23cf5e">I07060</a>)</li> <li>Added <code translate="no" dir="ltr">WorkManagerTestInitHelper#closeWorkDatabase()</code> to avoid Closeguard&#39;s warning about leaked resources. (<a href="https://android-review.googlesource.com/#/q/Ia8d49b6054df11ab5a67c8960c6317b515aa14b6">Ia8d49</a>)</li> <li><code translate="no" dir="ltr">WorkInfo</code>&#39;s constructor is public now, which can be useful in testing. (<a href="https://android-review.googlesource.com/#/q/Ia00b6beffca0b0b2dff5cdae67020bbd4b068579">Ia00b6</a>, <a href="https://issuetracker.google.com/issues/209145335">b/209145335</a>)</li> <li><code translate="no" dir="ltr">work-runtime-ktx</code> is now empty, <code translate="no" dir="ltr">CoroutineWorker</code> and other Kotlin specific utilities are now available in the main work-runtime artifact. (<a href="https://android-review.googlesource.com/#/q/I71a9a873fb3a68b1150ff6a0f9e62774393a17e8">I71a9a</a>)</li> <li>Added <code translate="no" dir="ltr">setNextScheduleTimeOverride</code> method, which allows accurate setting of periodic work schedules (<a href="https://android-review.googlesource.com/#/q/I3b4da91bab9ffc6da3e305ef7ae814b59f7090fb">I3b4da</a>)</li> <li>Added <code translate="no" dir="ltr">getNextScheduleTimeMillis</code> to get scheduled run time info is added to <code translate="no" dir="ltr">WorkInfo</code>. (<a href="https://android-review.googlesource.com/#/q/I797e4a88d7d96eb14ea4c689f7b64be038d4fbd8">I797e4</a>)</li> <li>Initial delay and periodicity info are added to <code translate="no" dir="ltr">WorkInfo</code>. (<a href="https://android-review.googlesource.com/#/q/I52f2f2f18f30dae132b6db4a11cc4c426e461ba6">I52f2f</a>)</li> <li>Added method observe workers via Flows via methods <code translate="no" dir="ltr">getWorkInfosByTagFlow</code>, <code translate="no" dir="ltr">getWorkInfoByIdFlow</code>, <code translate="no" dir="ltr">getWorkInfosForUniqueWorkFlow</code>, <code translate="no" dir="ltr">getWorkInfosFlow</code> (<a href="https://android-review.googlesource.com/#/q/If122a4bcc280e30c3721abec7bea6c7f1bbb4bd0">If122a</a>)</li> <li>Added missing <code translate="no" dir="ltr">@RequiresApi(...)</code> annotations to <code translate="no" dir="ltr">Constraints</code>&#39; constructors and properties. They are now aligned with corresponding annotations on setters in <code translate="no" dir="ltr">Constraints.Builder</code> that existed from early versions of <code translate="no" dir="ltr">WorkManager</code>. (<a href="https://android-review.googlesource.com/#/q/I6d7d23237c06a9cc197b30b054e213e96672a6dc">I6d7d2</a>)</li> <li><code translate="no" dir="ltr">WorkManager</code> now has a separate limit for content uri workers to give them guaranteed slots in <code translate="no" dir="ltr">JobScheduler</code> to prevent missing content updates under the high load. The limit can be configured via <code translate="no" dir="ltr">Configuration.Builder.setContentUriTriggerWorkersLimit</code>. (<a href="https://android-review.googlesource.com/#/q/Ic128f0bd0095e17c01a6ed6ed30d5ac00cb9772c">Ic128f</a>)</li> <li>Constraints are added to <code translate="no" dir="ltr">WorkInfo</code>. (<a href="https://android-review.googlesource.com/#/q/I162c0d683dc5066f4f842f4431d25a9750633524">I162c0</a>)</li> </ul> <h3 id="2.9.0-rc01" data-text="Version 2.9.0-rc01" tabindex="-1">Version 2.9.0-rc01</h3> <p>October 18, 2023</p> <p><code translate="no" dir="ltr">androidx.work:work-*:2.9.0-rc01</code> is released. <a href="https://android.googlesource.com/platform/frameworks/support/+log/9ce75ea1baa2af10dda8f787f69c40c6654bcac1..2b5fbfa0dbb62c3a185a0be13fb1a63f50b2c034/work">Version 2.9.0-rc01 contains these commits.</a></p> <ul> <li>No changes since the last beta release</li> </ul> <h3 id="2.9.0-beta01" data-text="Version 2.9.0-beta01" tabindex="-1">Version 2.9.0-beta01</h3> <p>September 6, 2023</p> <p><code translate="no" dir="ltr">androidx.work:work-*:2.9.0-beta01</code> is released. <a href="https://android.googlesource.com/platform/frameworks/support/+log/4aed940027a19667e67d155563fc5fa8b7279313..9ce75ea1baa2af10dda8f787f69c40c6654bcac1/work">Version 2.9.0-beta01 contains these commits.</a></p> <p><strong>API Changes</strong></p> <ul> <li>Added constants for stop reasons returned by <a href="/reference/kotlin/androidx/work/WorkInfo#stopReason()"><code translate="no" dir="ltr">WorkInfo.stopReason</code></a> and <a href="/reference/kotlin/androidx/work/ListenableWorker#getStopReason()"><code translate="no" dir="ltr">ListenableWorker.stopReason</code></a> (<a href="https://android-review.googlesource.com/#/q/I0cc002a1db83766bb7af4632cd682eb57cbabdd6">I0cc00</a>)</li> </ul> <h3 id="2.9.0-alpha02" data-text="Version 2.9.0-alpha02" tabindex="-1">Version 2.9.0-alpha02</h3> <p>July 26, 2023</p> <p><code translate="no" dir="ltr">androidx.work:work-*:2.9.0-alpha02</code> is released. <a href="https://android.googlesource.com/platform/frameworks/support/+log/73f902dee011bfe400d8a0330bfd8d4bb632065f..4aed940027a19667e67d155563fc5fa8b7279313/work">Version 2.9.0-alpha02 contains these commits.</a></p> <p><strong>New Features</strong></p> <ul> <li>Now <code translate="no" dir="ltr">WorkManager</code> provides a hint on why a worker was previously stopped. It can be queried from a worker itself via <code translate="no" dir="ltr">getStopReason()</code> method or from <code translate="no" dir="ltr">WorkInfo</code> via <code translate="no" dir="ltr">getStopReason()</code>.</li> </ul> <p><strong>API Changes</strong></p> <ul> <li><code translate="no" dir="ltr">stopReason</code> was added to <code translate="no" dir="ltr">WorkInfo</code>. It makes available <code translate="no" dir="ltr">stopReason</code> after the worker ran. It could be helpful in the reporting <code translate="no" dir="ltr">stopReason</code> in usable way, because once a worker has been stopped, an app itself could be very quickly killed. (<a href="https://android-review.googlesource.com/#/q/I213869adf99dd675b705f6d7f7a080c7bed88220">I21386</a>)</li> <li>Allow Clock to be set via config and used to drive execution sequencing of Worker tests. (<a href="https://android-review.googlesource.com/#/q/Ic586efd1c81ac21ece399f4d74f0d2d8bdb1e5ea">Ic586e</a>)</li> <li><code translate="no" dir="ltr">getStopReason()</code> method was added to <code translate="no" dir="ltr">ListenableWorker</code> that gives a hint why the worker was stopped. (<a href="https://android-review.googlesource.com/#/q/I070605b2337c30c496c02bef142167f65c23cf5e">I07060</a>)</li> <li>Added <code translate="no" dir="ltr">WorkManagerTestInitHelper#closeWorkDatabase()</code> to avoid Closeguard&#39;s warning about leaked resources. (<a href="https://android-review.googlesource.com/#/q/Ia8d49b6054df11ab5a67c8960c6317b515aa14b6">Ia8d49</a>)</li> </ul> <p><strong>Bug Fixes</strong></p> <ul> <li>Added ability to bypass <code translate="no" dir="ltr">overrideNextScheduleTime</code> using <code translate="no" dir="ltr">TestDriver</code> and fixed issues with testability. (<a href="https://android-review.googlesource.com/#/q/Ic29056d338f5aeb6c1825f487d8f206908465141">Ic2905</a>)</li> </ul> <h3 id="2.9.0-alpha01" data-text="Version 2.9.0-alpha01" tabindex="-1">Version 2.9.0-alpha01</h3> <p>June 7, 2023</p> <p><code translate="no" dir="ltr">androidx.work:work-*:2.9.0-alpha01</code> is released. <a href="https://android.googlesource.com/platform/frameworks/support/+log/95d318f1c5a8a858d7224a452f3a9fc802d2caa1..73f902dee011bfe400d8a0330bfd8d4bb632065f/work">Version 2.9.0-alpha01 contains these commits.</a></p> <p><strong>New Features</strong></p> <ul> <li>Observability via <code translate="no" dir="ltr">Flow</code>-s. Instead of <code translate="no" dir="ltr">LiveData</code>, Worker&#39;s progress now can be observed via Flow’s via <code translate="no" dir="ltr">WorkManager.getWorkInfosFlow</code> and similar methods.</li> <li>Precise scheduling of periodic workers via <code translate="no" dir="ltr">setNextScheduleTimeOverride</code>. This allows dynamic calculation of the next Periodic work schedule, which can be used to implement advanced features like adaptive refresh times, custom retry behavior, or making a newsfeed worker run before the user wakes up every morning without drift. <code translate="no" dir="ltr">ExistingPeriodicWorkPolicy.UPDATE</code> should be used with these techniques to avoid cancelling a currently-running worker while scheduling the next one.</li> <li><code translate="no" dir="ltr">WorkManager</code>’s testing with threading matching production. <code translate="no" dir="ltr">ExecutorsMode.PRESERVE_EXECUTORS</code> can be used to preserve executors set in <code translate="no" dir="ltr">Configuration</code> and to use the real main thread. </li> <li>Coroutines APIs such as <code translate="no" dir="ltr">CoroutineWorker</code> have been moved from additional artifact <code translate="no" dir="ltr">work-runtime-ktx</code> to the main artifact <code translate="no" dir="ltr">work-runtime</code>. <code translate="no" dir="ltr">work-runtime-ktx</code> is now empty.</li> </ul> <p><strong>API Changes</strong></p> <ul> <li><code translate="no" dir="ltr">WorkInfo</code>&#39;s constructor is public now, that can be useful in testing. (<a href="https://android-review.googlesource.com/#/q/Ia00b6beffca0b0b2dff5cdae67020bbd4b068579">Ia00b6</a>, <a href="https://issuetracker.google.com/issues/209145335">b/209145335</a>)</li> <li><code translate="no" dir="ltr">work-runtime-ktx</code> is now empty, <code translate="no" dir="ltr">CoroutineWorker</code> and other kotlin specific utilities are now available in the main <code translate="no" dir="ltr">work-runtime</code> artifact. (<a href="https://android-review.googlesource.com/#/q/I71a9a873fb3a68b1150ff6a0f9e62774393a17e8">I71a9a</a>)</li> <li>Added <code translate="no" dir="ltr">setNextScheduleTimeOverride</code> method, which allows accurate setting of periodic work schedules (<a href="https://android-review.googlesource.com/#/q/I3b4da91bab9ffc6da3e305ef7ae814b59f7090fb">I3b4da</a>)</li> <li>Renamed <code translate="no" dir="ltr">getEarliestRunTimeMillis</code> to <code translate="no" dir="ltr">getNextScheduleTimeMillis</code>. (<a href="https://android-review.googlesource.com/#/q/I2bd7acdd5ee14021fa288aeafe97e48e175073c4">I2bd7a</a>)</li> <li>Next scheduled run time info is added to <code translate="no" dir="ltr">WorkInfo</code>. (<a href="https://android-review.googlesource.com/#/q/I797e4a88d7d96eb14ea4c689f7b64be038d4fbd8">I797e4</a>)</li> <li>Initial delay and periodicity info are added to <code translate="no" dir="ltr">WorkInfo</code>. (<a href="https://android-review.googlesource.com/#/q/I52f2f2f18f30dae132b6db4a11cc4c426e461ba6">I52f2f</a>)</li> <li>Added method observe workers via Flows via methods <code translate="no" dir="ltr">getWorkInfosByTagFlow</code>, <code translate="no" dir="ltr">getWorkInfoByIdFlow</code>, <code translate="no" dir="ltr">getWorkInfosForUniqueWorkFlow</code>, <code translate="no" dir="ltr">getWorkInfosFlow</code> (<a href="https://android-review.googlesource.com/#/q/If122a4bcc280e30c3721abec7bea6c7f1bbb4bd0">If122a</a>)</li> <li>Added missing <code translate="no" dir="ltr">@RequiresApi(...)</code> annotations to Constraints&#39; constructors and properties. They are now aligned with corresponding annotations on setters in <code translate="no" dir="ltr">Constraints.Builder</code> that existed from early versions of <code translate="no" dir="ltr">WorkManager</code>. (<a href="https://android-review.googlesource.com/#/q/I6d7d23237c06a9cc197b30b054e213e96672a6dc">I6d7d2</a>)</li> <li><code translate="no" dir="ltr">WorkManager</code> now has a separate limit for content uri workers to give them guaranteed slots in <code translate="no" dir="ltr">JobScheduler</code> to prevent missing content updates under the high load. Limit can be configured via <code translate="no" dir="ltr">Configuration.Builder.setContentUriTriggerWorkersLimit</code>. (<a href="https://android-review.googlesource.com/#/q/Ic128f0bd0095e17c01a6ed6ed30d5ac00cb9772c">Ic128f</a>)</li> <li>Constraints are added to <code translate="no" dir="ltr">WorkInfo</code>. (<a href="https://android-review.googlesource.com/#/q/I162c0d683dc5066f4f842f4431d25a9750633524">I162c0</a>)</li> </ul> <h2 id="version_28_2" data-text="Version 2.8" tabindex="-1">Version 2.8</h2> <h3 id="2.8.1" data-text="Version 2.8.1" tabindex="-1">Version 2.8.1</h3> <p>March 22, 2023</p> <p><code translate="no" dir="ltr">androidx.work:work-*:2.8.1</code> is released. <a href="https://android.googlesource.com/platform/frameworks/support/+log/d697ceaa517db5c8286395e186c5c8d8f85238fd..95d318f1c5a8a858d7224a452f3a9fc802d2caa1/work">Version 2.8.1 contains these commits.</a></p> <p><strong>Bug Fixes</strong></p> <ul> <li>Fixed ANR in <code translate="no" dir="ltr">RescheduleReceiver</code> that previously didn’t correctly handle two simultaneous broadcasts. (<a href="https://issuetracker.google.com/issues/236906724">b/236906724</a>)</li> </ul> <h3 id="2.8.0" data-text="Version 2.8.0" tabindex="-1">Version 2.8.0</h3> <p>February 8, 2023</p> <p><code translate="no" dir="ltr">androidx.work:work-*:2.8.0</code> is released. <a href="https://android.googlesource.com/platform/frameworks/support/+log/b6809fb97f68a2d1a861e81cd6d32800039dcb09..d697ceaa517db5c8286395e186c5c8d8f85238fd/work">Version 2.8.0 contains these commits.</a></p> <p><strong>Important changes since 2.7.0</strong></p> <p><strong>New Features</strong></p> <ul> <li>An ability to update <code translate="no" dir="ltr">WorkRequests</code> in a non-intrusive way was added, preserving original enqueue time, chaining etc. See <a href="https://developer.android.com/guide/background/persistent/how-to/update-work">detailed blogpost</a> about this feature, as well as javadocs for <a href="/reference/androidx/work/WorkManager#updateWork(androidx.work.WorkRequest)"><code translate="no" dir="ltr">WorkManager.updateWork</code></a> and <a href="/reference/androidx/work/ExistingPeriodicWorkPolicy#UPDATE"><code translate="no" dir="ltr">ExistingPeriodicWorkPolicy.UPDATE</code></a> for more details.</li> </ul> <p><strong>API Changes</strong></p> <ul> <li><code translate="no" dir="ltr">WorkManager.updateWork</code> was added to update work preserving its original enqueue time and chaining.(<a href="https://android-review.googlesource.com/c/platform/frameworks/support/+/2051581">I9a248</a>, <a href="https://issuetracker.google.com/issues/219446409">b/219446409</a>)</li> <li><code translate="no" dir="ltr">ExistingPeriodicWorkPolicy.UPDATE</code> was added. This policy allows updating a periodic work by the name. It is similar to the existing <code translate="no" dir="ltr">REPLACE</code>, but it is less intrusive: it doesn&#39;t cancel a worker if it is currently running and it preserves enqueue time - initial delay and period are calculated from original enqueue time, rather than update time. <code translate="no" dir="ltr">REPLACE</code> was deprecated to decrease a confusion between the very similarly named <code translate="no" dir="ltr">REPLACE</code> and <code translate="no" dir="ltr">UPDATE</code>. If you still want to keep the previous semantics of <code translate="no" dir="ltr">REPLACE</code>, the newly added <code translate="no" dir="ltr">CANCEL_AND_REENQUEUE</code>, which is identical to <code translate="no" dir="ltr">REPLACE</code>, can be used. (<a href="https://android-review.googlesource.com/#/q/I985edc2cf7ac7c316932185f3fd0a3ca6660f2dc">I985ed</a>, <a href="https://issuetracker.google.com/issues/219446409">b/219446409</a>)</li> <li>Added the ability to intercept scheduling exceptions providing <code translate="no" dir="ltr">Consumer&lt;Throwable&gt;</code> via <a href="https://developer.android.com/reference/androidx/work/Configuration.Builder#setSchedulingExceptionHandler(androidx.core.util.Consumer%3Cjava.lang.Throwable%3E)">setSchedulingExceptionHandler</a>)</li> <li>Added the ability to provide <code translate="no" dir="ltr">Consumer&lt;Throwable&gt;</code> via <a href="https://developer.android.com/reference/androidx/work/Configuration.Builder#setInitializationExceptionHandler(androidx.core.util.Consumer%3Cjava.lang.Throwable%3E)">setInitializationExceptionHandler</a> to determine if there were issues when trying to initialize WorkManager.</li> <li>Inline helpers for <code translate="no" dir="ltr">OneTimeWorkRequest</code> &amp; <code translate="no" dir="ltr">PeriodicWorkRequest</code> were moved from <code translate="no" dir="ltr">androidx.work:work-runtime-ktx</code> to <code translate="no" dir="ltr">androidx.work:work-runtime</code> (<a href="https://android-review.googlesource.com/#/q/I0010f0bc806318ad840550458d872c12ee60eae7">I0010f</a>, <a href="https://issuetracker.google.com/issues/209145335">b/209145335</a>)</li> <li>Helper methods <code translate="no" dir="ltr">WorkQuery.fromIds</code>, <code translate="no" dir="ltr">WorkQuery.fromStates</code>, <code translate="no" dir="ltr">WorkQuery.fromUniqueWorkNames</code>, <code translate="no" dir="ltr">WorkQuery.fromTags</code> were added to create <code translate="no" dir="ltr">WorkQuery</code> directly. (<a href="https://issuetracker.google.com/issues/199919736">b/199919736</a>) (<a href="https://android-review.googlesource.com/#/q/If48f2ae0a5523792a9abe21279084f895abe7c53">If48f2</a>, <a href="https://issuetracker.google.com/issues/199919736">b/199919736</a>)</li> <li>Added <code translate="no" dir="ltr">getForegroundInfo</code> to <code translate="no" dir="ltr">Worker</code>. (<a href="https://android-review.googlesource.com/#/q/Ic1ead06bc9cc4cf61e90526dc47dff4c1365ea4c">Ic1ead</a>)</li> <li><code translate="no" dir="ltr">RxWorker</code> both for RxJava 2 and RxJava 3 now has <code translate="no" dir="ltr">setForeground</code> returning <code translate="no" dir="ltr">Completable</code> that can be used instead of <code translate="no" dir="ltr">setForegroundInfoAsync</code> that returns <code translate="no" dir="ltr">ListenableFuture</code></li> <li><code translate="no" dir="ltr">RxWorker</code> both for RxJava 2 and RxJava 3 has <code translate="no" dir="ltr">getForegroundInfo</code> returning <code translate="no" dir="ltr">Single</code> that can be used instead of <code translate="no" dir="ltr">getForegroundInfoAsync</code> that returns <code translate="no" dir="ltr">ListenableFuture</code>. (<a href="https://issuetracker.google.com/issues/203851459">b/203851459</a>)</li> <li>Constraints can now be directly constructed rather than using <code translate="no" dir="ltr">Constraints.Builder</code>, which is convenient for Kotlin users. (<a href="https://android-review.googlesource.com/#/q/Idc3900488dcaae5ca6c52b706723a752425875d9">Idc390</a>, <a href="https://issuetracker.google.com/issues/137568653">b/137568653</a>)</li> <li>Added the ability to check if <code translate="no" dir="ltr">WorkManager</code> has been initialized. Also, added a new <code translate="no" dir="ltr">getConfiguration()</code> API for library developers to get the configuration that <code translate="no" dir="ltr">WorkManager</code> was initialized with. (<a href="https://android-review.googlesource.com/#/q/Idc3900488dcaae5ca6c52b706723a752425875d9">I6eff3</a>, <a href="https://issuetracker.google.com/issues/137568653">b/212300336</a>)</li> </ul> <p><strong>Bug Fixes</strong></p> <ul> <li>Fixed an issue with the greedy scheduler that would prevent workers from running immediately when under load. (<a href="https://android-review.googlesource.com/#/q/I9686ba0810e4444b41ae7d638a6b8db3943da8cb">I9686b</a>, <a href="https://issuetracker.google.com/issues/248111307">b/248111307</a>)</li> <li>Added <code translate="no" dir="ltr">@RequiresPermission</code> to APIs that require granting the <code translate="no" dir="ltr">POST_NOTIFICATIONS</code> permission on SDK 33 and above. (<a href="https://android-review.googlesource.com/#/q/Ie542eb66c9af6e3c3a7c59bb291c7c5879458631">Ie542e</a>, <a href="https://issuetracker.google.com/issues/238790278">b/238790278</a>)</li> <li>Propagate cancellations in the <code translate="no" dir="ltr">CoroutineScope</code> to the <code translate="no" dir="ltr">ListenableFuture</code> when using <code translate="no" dir="ltr">suspendCancellableCoroutine</code>.</li> </ul> <h3 id="2.8.0-rc01" data-text="Version 2.8.0-rc01" tabindex="-1">Version 2.8.0-rc01</h3> <p>December 7, 2022</p> <p><code translate="no" dir="ltr">androidx.work:work-*:2.8.0-rc01</code> is released. <a href="https://android.googlesource.com/platform/frameworks/support/+log/a1e318590b217ecfce1b2de17eed2f18b6a680bb..b6809fb97f68a2d1a861e81cd6d32800039dcb09/work">Version 2.8.0-rc01 contains these commits.</a></p> <p><strong>New Features</strong></p> <ul> <li>No new features on this release. This is mainly a version bump</li> </ul> <h3 id="2.8.0-beta02" data-text="Version 2.8.0-beta02" tabindex="-1">Version 2.8.0-beta02</h3> <p>November 9, 2022</p> <p><code translate="no" dir="ltr">androidx.work:work-*:2.8.0-beta02</code> is released. <a href="https://android.googlesource.com/platform/frameworks/support/+log/6d0e3ed0829f3e41c89e6dfa985e16f8e7437aab..a1e318590b217ecfce1b2de17eed2f18b6a680bb/work">Version 2.8.0-beta02 contains these commits.</a></p> <p><strong>Bug Fixes</strong></p> <ul> <li>Fixed <code translate="no" dir="ltr">equals</code> method in <code translate="no" dir="ltr">WorkInfo</code>, that previously didn’t take into account new generation information. (<a href="https://android-review.googlesource.com/c/platform/frameworks/support/+/2259481">4977cc</a>)</li> </ul> <h3 id="2.8.0-beta01" data-text="Version 2.8.0-beta01" tabindex="-1">Version 2.8.0-beta01</h3> <p>October 5, 2022</p> <p><code translate="no" dir="ltr">androidx.work:work-*:2.8.0-beta01</code> is released. <a href="https://android.googlesource.com/platform/frameworks/support/+log/cce7b70f6a5ebf955cf748a73c18b63228b22c74..4586cf6e518f0c59410ef2b291e34ff9fdcff4e1/work">Version 2.8.0-beta01 contains these commits.</a></p> <p><strong>Bug Fixes</strong></p> <ul> <li>Fixed an issue with the greedy scheduler that would prevent workers from running immediately when under load. (<a href="https://android-review.googlesource.com/#/q/I9686ba0810e4444b41ae7d638a6b8db3943da8cb">I9686b</a>, <a href="https://issuetracker.google.com/issues/248111307">b/248111307</a>)</li> </ul> <h3 id="2.8.0-alpha04" data-text="Version 2.8.0-alpha04" tabindex="-1">Version 2.8.0-alpha04</h3> <p>September 7, 2022</p> <p><code translate="no" dir="ltr">androidx.work:work-*:2.8.0-alpha04</code> is released. <a href="https://android.googlesource.com/platform/frameworks/support/+log/bea814b246f89ff7244e3c6b0648f0b57e47897c..cce7b70f6a5ebf955cf748a73c18b63228b22c74/work">Version 2.8.0-alpha04 contains these commits.</a></p> <p><strong>API Changes</strong></p> <ul> <li><code translate="no" dir="ltr">WorkerInfo.getGeneration()</code> and <code translate="no" dir="ltr">WorkerParameters.getGeneration()</code> were added that return the generation of a worker. A worker has multiple generations, if it was updated via <code translate="no" dir="ltr">WorkManager.updateWork</code> or <code translate="no" dir="ltr">WorkManager.enqueueUniquePeriodicWork</code> using <code translate="no" dir="ltr">ExistingPeriodicWorkPolicy.UPDATE</code>. Note that If the worker is currently running, it is possible for this method to return a newer generation from that of the currently running worker if an update has happened during an execution of the worker. (<a href="https://android-review.googlesource.com/#/q/I665c5d480700dd682d1268ee88be124783fca70f">I665c5</a>, <a href="https://issuetracker.google.com/issues/219446409">b/219446409</a>) (<a href="https://android-review.googlesource.com/#/q/I128a9838067f3a1722a9460f52ef58fb0f98136c">I128a9</a>, <a href="https://issuetracker.google.com/issues/219446409">b/219446409</a>)</li> <li>Added <code translate="no" dir="ltr">InitializationExceptionHandler</code>, an Exception Handler that can be used to determine if there were issues when trying to initialize <code translate="no" dir="ltr">WorkManager</code>. (<a href="https://android-review.googlesource.com/#/q/I061de05e60048dc7a816c1392f2b5ae60a31f14c">I061de</a>)</li> </ul> <h3 id="2.8.0-alpha03" data-text="Version 2.8.0-alpha03" tabindex="-1">Version 2.8.0-alpha03</h3> <p>August 10, 2022</p> <p><code translate="no" dir="ltr">androidx.work:work-*:2.8.0-alpha03</code> is released. <a href="https://android.googlesource.com/platform/frameworks/support/+log/7ca43e00a517eaeeedc0a21f482b17f06e3d2181..bea814b246f89ff7244e3c6b0648f0b57e47897c/work">Version 2.8.0-alpha03 contains these commits.</a></p> <p><strong>New Features</strong></p> <ul> <li>An ability to update <code translate="no" dir="ltr">WorkRequests</code> in a non-intrusive way was added, preserving original enqueue time, chaining etc. See <code translate="no" dir="ltr">WorkManager.updateWork</code> and <code translate="no" dir="ltr">ExistingPeriodicWorkPolicy.UPDATE</code> for more details.</li> </ul> <p><strong>API Changes</strong></p> <ul> <li><code translate="no" dir="ltr">WorkManager.updateWork</code> was added to update work preserving its original enqueue time and chaining.(<a href="https://android-review.googlesource.com/#/q/I9a2489e50d217cf70377d348b183ceb2d777506d">I9a248</a>, <a href="https://issuetracker.google.com/issues/219446409">b/219446409</a>)</li> <li><code translate="no" dir="ltr">ExistingPeriodicWorkPolicy.UPDATE</code> was added. This policy allows to update a periodic work by the name. It is similar to the existing <code translate="no" dir="ltr">REPLACE</code>, but it is less intrusive: it doesn&#39;t cancel a worker if it is currently running and it preserves enqueue time - initial delay and period are calculated from original enqueue time, rather than update time. <code translate="no" dir="ltr">REPLACE</code> was deprecated to decrease a confusion between very similarly named <code translate="no" dir="ltr">REPLACE</code>and <code translate="no" dir="ltr">UPDATE</code>. If you still want to keep the previous semantics of <code translate="no" dir="ltr">REPLACE</code>, the newly added <code translate="no" dir="ltr">CANCEL_AND_REENQUEUE</code>, which is identical to <code translate="no" dir="ltr">REPLACE</code>, can be used. (<a href="https://android-review.googlesource.com/#/q/I985edc2cf7ac7c316932185f3fd0a3ca6660f2dc">I985ed</a>, <a href="https://issuetracker.google.com/issues/219446409">b/219446409</a>)</li> <li>Add the ability to intercept scheduling exceptions by defining a <code translate="no" dir="ltr">SchedulingExceptionHandler</code>. (<a href="https://android-review.googlesource.com/#/q/I033eb7d6c3496a23825a63e1f55ecc35d05602f5">I033eb</a>)</li> <li>Inline helpers for <code translate="no" dir="ltr">OneTimeWorkRequest</code> &amp; <code translate="no" dir="ltr">PeriodicWorkRequest</code> were moved from <code translate="no" dir="ltr">androidx.work:work-runtime-ktx</code> to <code translate="no" dir="ltr">androidx.work:work-runtime</code> (<a href="https://android-review.googlesource.com/#/q/I0010f0bc806318ad840550458d872c12ee60eae7">I0010f</a>, <a href="https://issuetracker.google.com/issues/209145335">b/209145335</a>)</li> </ul> <p><strong>Bug Fixes</strong></p> <ul> <li>Added <code translate="no" dir="ltr">@RequiresPermission</code> to APIs that require granting the POST_NOTIFICATIONS permission on SDK 33 and above. (<a href="https://android-review.googlesource.com/#/q/Ie542eb66c9af6e3c3a7c59bb291c7c5879458631">Ie542e</a>, <a href="https://issuetracker.google.com/issues/238790278">b/238790278</a>)</li> </ul> <h3 id="2.8.0-alpha02" data-text="Version 2.8.0-alpha02" tabindex="-1">Version 2.8.0-alpha02</h3> <p>April 6, 2022</p> <p><code translate="no" dir="ltr">androidx.work:work-*:2.8.0-alpha02</code> is released. <a href="https://android.googlesource.com/platform/frameworks/support/+log/f09f3e0f47cacc65a631115deac08ee8cc132ceb..7ca43e00a517eaeeedc0a21f482b17f06e3d2181/work">Version 2.8.0-alpha02 contains these commits.</a></p> <p><strong>API Changes</strong></p> <ul> <li>Constraints can now be directly constructed rather than using Builder, which is convenient for Kotlin users. (<a href="https://android-review.googlesource.com/#/q/Idc3900488dcaae5ca6c52b706723a752425875d9">Idc390</a>, <a href="https://issuetracker.google.com/issues/137568653">b/137568653</a>)</li> <li>Added the ability to check if <code translate="no" dir="ltr">WorkManager</code> has been initialized. Also, added a new <code translate="no" dir="ltr">getConfiguration()</code> API for library developers to get the configuration that <code translate="no" dir="ltr">WorkManager</code> was initialized with. (<a href="https://android-review.googlesource.com/#/q/I6eff387fcf99eac94ef4cc210cc75e8f3edd6a7b">I6eff3</a>, <a href="https://issuetracker.google.com/issues/212300336">b/212300336</a>)</li> </ul> <h3 id="2.8.0-alpha01" data-text="Version 2.8.0-alpha01" tabindex="-1">Version 2.8.0-alpha01</h3> <p>January 12, 2022</p> <p><code translate="no" dir="ltr">androidx.work:work-*:2.8.0-alpha01</code> is released. <a href="https://android.googlesource.com/platform/frameworks/support/+log/a8b339074687010fb5c861b5af9d169113f0c04b..f09f3e0f47cacc65a631115deac08ee8cc132ceb/work">Version 2.8.0-alpha01 contains these commits.</a></p> <p><strong>API Changes</strong></p> <ul> <li>Helper methods <code translate="no" dir="ltr">WorkQuery.fromStates</code>, <code translate="no" dir="ltr">WorkQuery.fromUniqueWorkNames</code>, <code translate="no" dir="ltr">WorkQuery.fromTags</code> were added to create WorkQuery directly. (<a href="https://android-review.googlesource.com/#/q/If48f2ae0a5523792a9abe21279084f895abe7c53">If48f2</a>, <a href="https://issuetracker.google.com/issues/199919736">b/199919736</a>)</li> <li>Adds experimental BuildCompat methods for future SDKs (<a href="https://android-review.googlesource.com/#/q/Iafd82e20e0c6d54878d352baddb18e86095504a7">Iafd82</a>, <a href="https://issuetracker.google.com/issues/207528937">b/207528937</a>)</li> <li>Add <code translate="no" dir="ltr">getForegroundInfo</code> to <code translate="no" dir="ltr">Worker</code>. (<a href="https://android-review.googlesource.com/#/q/Ic1ead06bc9cc4cf61e90526dc47dff4c1365ea4c">Ic1ead</a>)</li> <li>Helper methods <code translate="no" dir="ltr">WorkQuery.fromIds</code> to create WorkQuery directly from ids were added. (<a href="https://android-review.googlesource.com/#/q/Ie5bdf99ac193c9aa9179dcf629a46227fe876242">Ie5bdf</a>, <a href="https://issuetracker.google.com/issues/199919736">b/199919736</a>)</li> <li>RxWorker now has <code translate="no" dir="ltr">setForeground</code> returning <code translate="no" dir="ltr">Completable</code> that can be used instead of <code translate="no" dir="ltr">setForegroundInfoAsync</code> that returns <code translate="no" dir="ltr">ListenableFuture</code>. (<a href="https://android-review.googlesource.com/#/q/I851567cc042d4f3f6de9023f4eb6d0f2a25e8b8e">I85156</a>)</li> <li>RxWorker for RxJava 2 now has <code translate="no" dir="ltr">getForegroundInfo</code> returning <code translate="no" dir="ltr">Single</code> that can be used instead of <code translate="no" dir="ltr">getForegroundInfoAsync</code> that returns <code translate="no" dir="ltr">ListenableFuture</code>. (<a href="https://android-review.googlesource.com/#/q/I21c91cd5db57e85bf1aaa7e1596e2287ab44675c">I21c91</a>, <a href="https://issuetracker.google.com/issues/203851459">b/203851459</a>)</li> <li>RxWorker for RxJava 3 now has <code translate="no" dir="ltr">getForegroundInfo</code> returning <code translate="no" dir="ltr">Single</code> that can be used instead of <code translate="no" dir="ltr">getForegroundInfoAsync</code> that returns <code translate="no" dir="ltr">ListenableFuture</code>. (<a href="https://android-review.googlesource.com/#/q/I1ca8aee15cd28ea1afe363fa235ff6a13be8f95c">I1ca8a</a>)</li> <li>RxWorker now has <code translate="no" dir="ltr">setForeground</code> returning <code translate="no" dir="ltr">Completable</code> that can be used instead of <code translate="no" dir="ltr">setForegroundInfoAsync</code> that returns <code translate="no" dir="ltr">ListenableFuture</code>. (<a href="https://android-review.googlesource.com/#/q/I992a32849600b8c3bb37fa362e9775bc46a6462b">I992a3</a>, <a href="https://issuetracker.google.com/issues/203851459">b/203851459</a>)</li> </ul> <p><strong>Bug Fixes</strong></p> <ul> <li>Propagate cancellations in the <code translate="no" dir="ltr">CoroutineScope</code> to the <code translate="no" dir="ltr">ListenableFuture</code> when using <code translate="no" dir="ltr">suspendCancellableCoroutine</code>. (<a href="https://android-review.googlesource.com/#/q/I77e6348e89ba345f1ae1024b7102334b3608ca6d">I77e63</a>)</li> </ul> <h2 id="version_27_2" data-text="Version 2.7" tabindex="-1">Version 2.7</h2> <aside class="note"><strong>Note:</strong><span> WorkManager Version <code translate="no" dir="ltr">2.7.0</code> is required for apps targeting Android 12 (S).</span></aside> <h3 id="2.7.1" data-text="Version 2.7.1" tabindex="-1">Version 2.7.1</h3> <p>November 17, 2021</p> <p><code translate="no" dir="ltr">androidx.work:work-*:2.7.1</code> is released. <a href="https://android.googlesource.com/platform/frameworks/support/+log/43e01da60178b0f86ff63c730b8adae2d22ecb62..a8b339074687010fb5c861b5af9d169113f0c04b/work">Version 2.7.1 contains these commits.</a></p> <p><strong>Bug Fixes</strong></p> <ul> <li>Cancellations in the <code translate="no" dir="ltr">CoroutineScope</code>are propagated to the <code translate="no" dir="ltr">ListenableFuture</code> when using <code translate="no" dir="ltr">suspendCancellableCoroutine</code>. (<a href="https://android-review.googlesource.com/#/q/I77e6348e89ba345f1ae1024b7102334b3608ca6d">I77e63</a>)</li> <li>An exception is thrown immediately when delayed work requests are marked as expedited. <a href="https://android.googlesource.com/platform/frameworks/support/+/bef1762d4bdcc336c078e8502639579c31a89e15">bef1762</a></li> </ul> <h3 id="2.7.0" data-text="Version 2.7.0" tabindex="-1">Version 2.7.0</h3> <p>October 13, 2021</p> <p><code translate="no" dir="ltr">androidx.work:work-*:2.7.0</code> is released. <a href="https://android.googlesource.com/platform/frameworks/support/+log/ec09ba07aae1c2baaf6b84a2b30bd85cddbc9902..43e01da60178b0f86ff63c730b8adae2d22ecb62/work">Version 2.7.0 contains these commits.</a></p> <p><strong>Important changes since 2.6.0</strong></p> <ul> <li><p>WorkManager introduces a new <code translate="no" dir="ltr">WorkRequest.Builder.setExpedited(...)</code> API to help with Foreground Service restrictions in Android 12.</p></li> <li><p>When using <a href="/reference/android/app/job/JobInfo.Builder#setExpedited(boolean)"><code translate="no" dir="ltr">setExpedited(...)</code></a>, WorkManager delegates to expedited jobs in JobScheduler starting Android 12, while providing backwards compatibility on prior versions of Android by delegating to a Foreground Service.</p></li> </ul> <h3 id="2.7.0-rc01" data-text="Version 2.7.0-rc01" tabindex="-1">Version 2.7.0-rc01</h3> <p>September 29, 2021</p> <p><code translate="no" dir="ltr">androidx.work:work-*:2.7.0-rc01</code> is released. <a href="https://android.googlesource.com/platform/frameworks/support/+log/74cf577caf9b6557a015ebd82996fc5fa907a219..ec09ba07aae1c2baaf6b84a2b30bd85cddbc9902/work">Version 2.7.0-rc01 contains these commits.</a></p> <p>This version is identical to <code translate="no" dir="ltr">androidx.work:work-*:2.7.0-beta01</code>.</p> <h3 id="2.7.0-beta01" data-text="Version 2.7.0-beta01" tabindex="-1">Version 2.7.0-beta01</h3> <p>September 1, 2021</p> <p><code translate="no" dir="ltr">androidx.work:work-*:2.7.0-beta01</code> is released. <a href="https://android.googlesource.com/platform/frameworks/support/+log/ed683bd5038dd4cdcc7440896b7949d6917b0c8a..74cf577caf9b6557a015ebd82996fc5fa907a219/work">Version 2.7.0-beta01 contains these commits.</a></p> <p><strong>New Features</strong></p> <ul> <li>Reduce multi-process SQLite contention when initializing WorkManager.</li> </ul> <p><strong>API Changes</strong></p> <ul> <li>Remove <code translate="no" dir="ltr">@ExperimentalExpeditedWork</code> APIs given the underlying platform APIs for Android 12 (S) are stable. (<a href="https://android-review.googlesource.com/c/platform/frameworks/support/+/1792806">aosp/1792806</a>)</li> </ul> <p><strong>Bug Fixes</strong></p> <ul> <li>Provide a better error message for expedited workers that do not implement <code translate="no" dir="ltr">getForegroundInfoAsync()</code>. (<a href="https://android-review.googlesource.com/c/platform/frameworks/support/+/1809376">aosp/1809376</a>)</li> </ul> <h3 id="2.7.0-alpha05" data-text="Version 2.7.0-alpha05" tabindex="-1">Version 2.7.0-alpha05</h3> <p>July 21, 2021</p> <p><code translate="no" dir="ltr">androidx.work:work-*:2.7.0-alpha05</code> is released. <a href="https://android.googlesource.com/platform/frameworks/support/+log/9718dac3db72190dec105d92592bea08527f196a..ed683bd5038dd4cdcc7440896b7949d6917b0c8a/work">Version 2.7.0-alpha05 contains these commits.</a></p> <p>This release also contains bug fixes from the <a href="#2.6.0-beta02">WorkManager <code translate="no" dir="ltr">2.6.0-beta02</code></a> release.</p> <h3 id="2.7.0-alpha04" data-text="Version 2.7.0-alpha04" tabindex="-1">Version 2.7.0-alpha04</h3> <p>June 2, 2021</p> <p><code translate="no" dir="ltr">androidx.work:work-*:2.7.0-alpha04</code> is released.</p> <p>This release also contains the changes from the <a href="/jetpack/androidx/releases/work#2.6.0-beta01">2.6.0-beta01</a> release.</p> <p><strong>API Changes</strong></p> <ul> <li><code translate="no" dir="ltr">ListenableWorker.setForegroundAsync()</code> is no longer deprecated.</li> <li>We recommend using <code translate="no" dir="ltr">WorkRequest.Builder.setExpedited(...)</code> API when possible. To better support situations when the <a href="https://developer.android.com/about/versions/12/foreground-services#cases-fgs-background-starts-allowed">app is not subject to foreground service restrictions</a>, developers can use the <code translate="no" dir="ltr">ListenableWorker.setForegroundAsync()</code> API.</li> <li>If <code translate="no" dir="ltr">ListenableWorker.setForegroundAsync()</code> is called, when the app is subject to foreground service restrictions, this will throw the <a href="https://developer.android.com/reference/android/app/ForegroundServiceStartNotAllowedException">ForegroundServiceStartNotAllowedException</a>.</li> </ul> <p><strong>Bug Fixes</strong></p> <ul> <li>When expedited jobs are rescheduled, they are no longer expedited. They become <em>regular</em> jobs.</li> </ul> <h3 id="2.7.0-alpha03" data-text="Version 2.7.0-alpha03" tabindex="-1">Version 2.7.0-alpha03</h3> <p>April 21, 2021</p> <aside class="note"><strong>Note:</strong><span> WorkManager Version 2.7.0-alpha03 is <strong>only compatible</strong> with the Android 12 Developer Preview 3 SDK.</span></aside> <p><code translate="no" dir="ltr">androidx.work:work-*:2.7.0-alpha03</code> is released. <a href="https://android.googlesource.com/platform/frameworks/support/+log/23e58206a34ee2ac5a0e6ac8bf8d6e4f1e070efb..d31c94c58e59b87051a5ba2f8ba791cbdb421748/work">Version 2.7.0-alpha03 contains these commits.</a></p> <p><strong>New Features</strong></p> <ul> <li><p>From <a href="#2.6.0-alpha02">WorkManager <code translate="no" dir="ltr">2.6.0-alpha02</code></a>: Adds support for Workers that can run in any process. (<a href="https://android-review.googlesource.com/#/q/Iaf2009914abca579d6d3e5786011a79d6b99f8fa">Iaf200</a>)</p></li> <li><p>From <a href="#2.6.0-alpha02">WorkManager <code translate="no" dir="ltr">2.6.0-alpha02</code></a>: Added a <code translate="no" dir="ltr">RemoteCoroutineWorker</code> which is an implementation of <code translate="no" dir="ltr">RemoteListenableWorker</code> that can bind to a remote process. (<a href="https://android-review.googlesource.com/#/q/I30578ea87b8bbff82f8d5b70c6cf97a105b387f9">I30578</a>)</p></li> </ul> <p><strong>API Changes</strong></p> <ul> <li>From <a href="#2.6.0-alpha02">WorkManager <code translate="no" dir="ltr">2.6.0-alpha02</code></a>:Added support for <code translate="no" dir="ltr">TEMPORARILY_UNMETERED</code> network constraint. (<a href="https://android-review.googlesource.com/#/q/I08d5efa05691df9c9e6445073db8fd184da1ebb8">I08d5e</a>)</li> <li>From <a href="#2.6.0-alpha02">WorkManager <code translate="no" dir="ltr">2.6.0-alpha02</code></a>:Multi-process worker support for <code translate="no" dir="ltr">setProgressAsync()</code>. (<a href="https://android-review.googlesource.com/#/q/Ib6d0893300662e9b226d50c656360d59a29cba60">Ib6d08</a>)</li> <li>From <a href="#2.6.0-alpha02">WorkManager <code translate="no" dir="ltr">2.6.0-alpha02</code></a>:Make <code translate="no" dir="ltr">WorkManagerInitializer</code> public so other <code translate="no" dir="ltr">androidx.startup.Initializer</code>s can use these as dependencies. (<a href="https://android-review.googlesource.com/#/q/I5ab117d1f69b6efc40227be4712e5e0865410a03">I5ab11</a>)</li> </ul> <h3 id="2.7.0-alpha02" data-text="Version 2.7.0-alpha02" tabindex="-1">Version 2.7.0-alpha02</h3> <p>March 10, 2021</p> <p><code translate="no" dir="ltr">androidx.work:work-*:2.7.0-alpha02</code> is released. <a href="https://android.googlesource.com/platform/frameworks/support/+log/51b9293137916801ce8564a523a6ae77398694c1..23e58206a34ee2ac5a0e6ac8bf8d6e4f1e070efb/work">Version 2.7.0-alpha02 contains these commits.</a></p> <aside class="note"><strong>Note:</strong><span> WorkManager Version 2.7.0-alpha02 is <strong>only compatible</strong> with the Android 12 Developer Preview 1 SDK.</span></aside> <p><strong>Bug Fixes</strong></p> <ul> <li>Make <code translate="no" dir="ltr">PendingIntent</code> mutability explicit, to fix a crash when targeting Android 12. (<a href="https://issuetracker.google.com/issues/180884673">b/180884673</a>)</li> </ul> <h3 id="2.7.0-alpha01" data-text="Version 2.7.0-alpha01" tabindex="-1">Version 2.7.0-alpha01</h3> <p>February 18, 2021</p> <p><code translate="no" dir="ltr">androidx.work:work-*:2.7.0-alpha01</code> is released. <a href="https://android.googlesource.com/platform/frameworks/support/+log/b32e1d4efc3b6976da585fb8783f913e92108428..51b9293137916801ce8564a523a6ae77398694c1/work">Version 2.7.0-alpha01 contains these commits.</a></p> <aside class="note"><strong>Note:</strong><span> WorkManager Version 2.7.0-alpha01 is <strong>only compatible</strong> with the Android 12 Developer Preview 1 SDK.</span></aside> <p><strong>New Features</strong></p> <ul> <li><p>WorkManager introduces a new<code translate="no" dir="ltr">WorkRequest.Builder.setExpedited(...)</code> API to take into account the <a href="/about/versions/12/behavior-changes-12#foreground-service-launch-restrictions">foreground Service restrictions</a> in Android 12.</p> <p>Applications can no longer launch a foreground service when they are in the background. Therefore, to better support long running work which was previously bound to the lifecycle of a foreground service, applications can mark <code translate="no" dir="ltr">WorkRequest</code>s as <a href="/reference/android/app/job/JobInfo.Builder#setExpedited(boolean)"><em>expedited</em></a>.</p> <p>This API is a replacement for the <code translate="no" dir="ltr">setForegroundAsync(...)</code> / <code translate="no" dir="ltr">setForeground(...)</code> APIs which are now <strong>deprecated</strong>.</p> <p>When using <code translate="no" dir="ltr">setExpedited(...)</code>, WorkManager delegates to expedited jobs in <code translate="no" dir="ltr">JobScheduler</code> starting Android 12, while providing backwards compatibility on prior versions of Android by delegating to foreground services,</p></li> </ul> <p><strong>API Changes</strong></p> <ul> <li>Add support for expedited <code translate="no" dir="ltr">WorkRequest</code>s.</li> </ul> <h2 id="version_260_3" data-text="Version 2.6.0" tabindex="-1">Version 2.6.0</h2> <h3 id="2.6.0" data-text="Version 2.6.0" tabindex="-1">Version 2.6.0</h3> <p>September 1, 2021</p> <p><code translate="no" dir="ltr">androidx.work:work-*:2.6.0</code> is released. <a href="https://android.googlesource.com/platform/frameworks/support/+log/fb4befebd5dfb03c14a0593799f68f1567993e6b..554afbcb0b3fba9fd022029713d72b2f376411b6/work">Version 2.6.0 contains these commits.</a></p> <aside class="note"><strong>Note:</strong><span> WorkManager Version <code translate="no" dir="ltr">2.6.0</code> is not compatible for apps targeting Android 12 (S). You should be using version <code translate="no" dir="ltr">2.7.0</code> instead.</span></aside> <p><strong>Important changes since 2.5.0</strong></p> <ul> <li><p>WorkManager now uses <code translate="no" dir="ltr">androidx.startup</code> to initialize WorkManager. If you used <code translate="no" dir="ltr">tools:node=&quot;remove&quot;</code> the <code translate="no" dir="ltr">ContentProvider</code> being used to initialize WorkManager in the past, then you need to do the following instead.</p> <pre class="prettyprint lang-XML" translate="no" dir="ltr"><code translate="no" dir="ltr">&lt;provider android:name=&#34;androidx.startup.InitializationProvider&#34; android:authorities=\&#34;${applicationId}.androidx-startup&#34; android:exported=&#34;false&#34; tools:node=\&#34;merge&#34;&gt; &lt;!-- If you are using androidx.startup to initialize other components --&gt; &lt;meta-data android:name=&#34;androidx.work.WorkManagerInitializer&#34; android:value=&#34;androidx.startup&#34; tools:node=&#34;remove&#34; /&gt; &lt;/provider&gt; </code></pre><pre class="prettyprint lang-XML" translate="no" dir="ltr"><code translate="no" dir="ltr">&lt;!-- If you want to disable android.startup completely. --&gt; &lt;provider android:name=&#34;androidx.startup.InitializationProvider&#34; android:authorities=&#34;${applicationId}.androidx-startup&#34; tools:node=&#34;remove&#34; /&gt; </code></pre></li> <li><p>Added support for Workers that can run in any process. (<a href="https://android-review.googlesource.com/#/q/Iaf2009914abca579d6d3e5786011a79d6b99f8fa">Iaf200</a>)</p></li> <li><p>Added a <code translate="no" dir="ltr">RemoteCoroutineWorker</code> which is an implementation of RemoteListenableWorker that can bind to a remote process. (<a href="https://android-review.googlesource.com/#/q/I30578ea87b8bbff82f8d5b70c6cf97a105b387f9">I30578</a>)</p></li> </ul> <h3 id="2.6.0-rc01" data-text="Version 2.6.0-rc01" tabindex="-1">Version 2.6.0-rc01</h3> <p>August 4, 2021</p> <p><code translate="no" dir="ltr">androidx.work:work-*:2.6.0-rc01</code> is released. <a href="https://android.googlesource.com/platform/frameworks/support/+log/97264aa4532db7f7db1ffb3f42f3a9204971dbfc..fb4befebd5dfb03c14a0593799f68f1567993e6b/work">Version 2.6.0-rc01 contains these commits.</a></p> <p>This version is identical to <code translate="no" dir="ltr">androidx.work:work-*:2.6.0-beta02</code>.</p> <h3 id="2.6.0-beta02" data-text="Version 2.6.0-beta02" tabindex="-1">Version 2.6.0-beta02</h3> <p>July 21, 2021</p> <p><code translate="no" dir="ltr">androidx.work:work-*:2.6.0-beta02</code> is released. <a href="https://android.googlesource.com/platform/frameworks/support/+log/86ff5b4bb956431ec884586ce0aea0127e189ec4..97264aa4532db7f7db1ffb3f42f3a9204971dbfc/work">Version 2.6.0-beta02 contains these commits.</a></p> <p><strong>Bug Fixes</strong></p> <ul> <li><code translate="no" dir="ltr">RemoteWorkManager</code> now correctly unbinds from <code translate="no" dir="ltr">RemoteWorkManagerService</code> which allows <code translate="no" dir="ltr">RemoteWorkManagerService</code> to clean up correctly. <a href="https://android-review.googlesource.com/c/platform/frameworks/support/+/1730694">aosp/1730694</a></li> <li><code translate="no" dir="ltr">RemoteListenableWorker</code> now correctly unbinds from <code translate="no" dir="ltr">RemoteWorkerService</code> which allows <code translate="no" dir="ltr">RemoteWorkerService</code> to clean up correctly. <a href="https://android-review.googlesource.com/c/platform/frameworks/support/+/1743817">aosp/1743817</a></li> <li><code translate="no" dir="ltr">ForceStopRunnable</code> now only runs in the primary app process. This is an optimization, and avoids resource contention for apps that use multiple processes. <a href="https://android-review.googlesource.com/c/platform/frameworks/support/+/1749180">aosp/1749180</a>, <a href="https://android-review.googlesource.com/c/platform/frameworks/support/+/1761729">aosp/1761729</a></li> </ul> <h3 id="2.6.0-beta01" data-text="Version 2.6.0-beta01" tabindex="-1">Version 2.6.0-beta01</h3> <p>June 2, 2021</p> <p><code translate="no" dir="ltr">androidx.work:work-*:2.6.0-beta01</code> is released. <a href="https://android.googlesource.com/platform/frameworks/support/+log/4ddfc1583c09aaa878d34437fbfee1b995b60d3a..86ff5b4bb956431ec884586ce0aea0127e189ec4/work">Version 2.6.0-beta01 contains these commits.</a></p> <p>This release contains some minor documentation improvements. The release is largely identical to <a href="/jetpack/androidx/releases/work#2.6.0-alpha02">2.6.0-alpha02</a>.</p> <h3 id="2.6.0-alpha02" data-text="Version 2.6.0-alpha02" tabindex="-1">Version 2.6.0-alpha02</h3> <p>April 21, 2021</p> <p><code translate="no" dir="ltr">androidx.work:work-*:2.6.0-alpha02</code> is released. <a href="https://android.googlesource.com/platform/frameworks/support/+log/5c42896eb6591b09e3952030fb7ea8d9b8c42713..4ddfc1583c09aaa878d34437fbfee1b995b60d3a/work">Version 2.6.0-alpha02 contains these commits.</a></p> <p><strong>New Features</strong></p> <ul> <li><p>Adds support for Workers that can run in any process. (<a href="https://android-review.googlesource.com/#/q/Iaf2009914abca579d6d3e5786011a79d6b99f8fa">Iaf200</a>)</p></li> <li><p>Added a <code translate="no" dir="ltr">RemoteCoroutineWorker</code> which is an implementation of <code translate="no" dir="ltr">RemoteListenableWorker</code> that can bind to a remote process. (<a href="https://android-review.googlesource.com/#/q/I30578ea87b8bbff82f8d5b70c6cf97a105b387f9">I30578</a>)</p></li> </ul> <p><strong>API Changes</strong></p> <ul> <li>Added support for <code translate="no" dir="ltr">TEMPORARILY_UNMETERED</code> network constraint. (<a href="https://android-review.googlesource.com/#/q/I08d5efa05691df9c9e6445073db8fd184da1ebb8">I08d5e</a>)</li> <li>Multi-process worker support for <code translate="no" dir="ltr">setProgressAsync()</code>. (<a href="https://android-review.googlesource.com/#/q/Ib6d0893300662e9b226d50c656360d59a29cba60">Ib6d08</a>)</li> <li>Make <code translate="no" dir="ltr">WorkManagerInitializer</code> public so other <code translate="no" dir="ltr">androidx.startup.Initializer</code>s can use these as dependencies. (<a href="https://android-review.googlesource.com/#/q/I5ab117d1f69b6efc40227be4712e5e0865410a03">I5ab11</a>)</li> </ul> <h3 id="2.6.0-alpha01" data-text="Version 2.6.0-alpha01" tabindex="-1">Version 2.6.0-alpha01</h3> <p>March 24, 2021</p> <p><code translate="no" dir="ltr">androidx.work:work-*:2.6.0-alpha01</code> is released. <a href="https://android.googlesource.com/platform/frameworks/support/+log/b32e1d4efc3b6976da585fb8783f913e92108428..5c42896eb6591b09e3952030fb7ea8d9b8c42713/work">Version 2.6.0-alpha01 contains these commits.</a></p> <p><strong>New Features</strong></p> <ul> <li><p><code translate="no" dir="ltr">WorkManager</code> now uses <code translate="no" dir="ltr">androidx.startup</code> to initialize WorkManager. Previously, this was being done by <code translate="no" dir="ltr">androidx.work.impl.WorkManagerInitializer</code>. (<a href="https://android-review.googlesource.com/c/platform/frameworks/support/+/1608813">aosp/1608813</a>)</p> <p>If you used <code translate="no" dir="ltr">tools:node=&quot;remove&quot;</code> the <code translate="no" dir="ltr">ContentProvider</code> being used to initialize process lifecycle in the past, then you need to do the following instead.</p> <pre class="prettyprint lang-xml" translate="no" dir="ltr"><code translate="no" dir="ltr"> &lt;provider android:name=&#34;androidx.startup.InitializationProvider&#34; android:authorities=\&#34;${applicationId}.androidx-startup&#34; android:exported=&#34;false&#34; tools:node=\&#34;merge&#34;&gt; &lt;!-- If you are using androidx.startup to initialize other components --&gt; &lt;meta-data android:name=&#34;androidx.work.impl.WorkManagerInitializer&#34; android:value=&#34;androidx.startup&#34; tools:node=&#34;remove&#34; /&gt; &lt;/provider&gt; </code></pre> <p>(or)</p> <pre class="prettyprint lang-xml" translate="no" dir="ltr"><code translate="no" dir="ltr"> &lt;!-- If you want to disable android.startup completely. --&gt; &lt;provider android:name=&#34;androidx.startup.InitializationProvider&#34; android:authorities=&#34;${applicationId}.androidx-startup&#34; tools:node=&#34;remove&#34;&gt; &lt;/provider&gt; </code></pre></li> </ul> <p><strong>API Changes</strong></p> <ul> <li>Add a <code translate="no" dir="ltr">Result.getOutputData()</code> API which returns the ListenableWorker&#39;s <code translate="no" dir="ltr">outputData</code>. (<a href="https://android-review.googlesource.com/#/q/Ie51e31db49b6952172dd502d2178164c951a2db1">Ie51e3</a>)</li> </ul> <p><strong>Bug Fixes</strong></p> <ul> <li>Add a workaround for an OEM bug which causes a <code translate="no" dir="ltr">SecurityException</code> to be thrown when using <code translate="no" dir="ltr">AlarmManager</code> APIs. (<a href="https://android-review.googlesource.com/c/platform/frameworks/support/+/1587518">aosp/1587518</a>)</li> </ul> <h2 id="version_250_3" data-text="Version 2.5.0" tabindex="-1">Version 2.5.0</h2> <aside class="note"><strong>Note:</strong><span> WorkManager Version 2.5.0 is <strong>not compatible</strong> with apps targeting Android 12 (S)</span></aside> <h3 id="2.5.0" data-text="Version 2.5.0" tabindex="-1">Version 2.5.0</h3> <p>January 27, 2021</p> <p><code translate="no" dir="ltr">androidx.work:work-*:2.5.0</code> is released. <a href="https://android.googlesource.com/platform/frameworks/support/+log/8e8a196e1c2eb6d6e6194b621267473c31bea375..b32e1d4efc3b6976da585fb8783f913e92108428/work">Version 2.5.0 contains these commits.</a></p> <p><strong>Major changes since 2.4.0</strong></p> <ul> <li>A new <code translate="no" dir="ltr">:work:work-multiprocess</code> artifact for apps that use multiple processes. This introduces performance gains by unifying work request scheduling to a single process. <ul> <li>To use <code translate="no" dir="ltr">work-multiprocess</code>, define a dependency on: <code translate="no" dir="ltr">implementation &quot;androidx.work:work-multiprocess:2.5.0&quot;</code></li> <li>Designate a primary process using <a href="/reference/androidx/work/Configuration.Builder#setDefaultProcessName(java.lang.String)">Configuration.Builder.setDefaultProcessName(String)</a>. </li> <li>When using <code translate="no" dir="ltr">work-multiprocess</code> you also want to use <a href="/reference/androidx/work/multiprocess/RemoteWorkManager">RemoteWorkManager</a> to manage your <code translate="no" dir="ltr">WorkRequest</code>s. <a href="/reference/androidx/work/multiprocess/RemoteWorkManager">RemoteWorkManager</a> always reaches out to the designated process. The in-process scheduler also runs in the designated process.</li> </ul></li> <li>Sometimes, <code translate="no" dir="ltr">ActivityManager</code> cannot instantiate the <code translate="no" dir="ltr">JobService</code> instance, to start a job. This causes the underlying job to get silently dropped because of a platform bug. <code translate="no" dir="ltr">WorkManager</code> now ensures that there are backing jobs for every single <code translate="no" dir="ltr">WorkRequest</code> when an <code translate="no" dir="ltr">Application</code> is being initialized by reconciling jobs. This greatly improves job execution reliability. (<a href="https://issuetracker.google.com/issues/172475041">b/172475041</a>, <a href="https://android-review.googlesource.com/c/platform/frameworks/support/+/1489577">aosp/1489577</a>)</li> <li><code translate="no" dir="ltr">WorkManager</code> limits database growth by reducing the buffer duration that <code translate="no" dir="ltr">WorkRequest</code>s are tracked after a <code translate="no" dir="ltr">WorkRequest</code> is complete. The duration was <code translate="no" dir="ltr">7</code> days previously. It has been reduced to <code translate="no" dir="ltr">1</code> day + the <a href="/reference/androidx/work/WorkRequest.Builder#keepResultsForAtLeast(java.time.Duration)">keepResultsForAtLeast</a> duration. (<a href="https://android-review.googlesource.com/c/platform/frameworks/support/+/1419708">aosp/1419708</a>)</li> <li>The <code translate="no" dir="ltr">TestListenableWorkerBuilder</code> now supports the reified class extending <code translate="no" dir="ltr">ListenableWorker</code> to make testing easier. (<a href="https://android-review.googlesource.com/c/platform/frameworks/support/+/1443299">aosp/1443299</a>, <a href="https://issuetracker.google.com/issues/169787349">b/169787349</a>)</li> <li><a href="/studio/preview/features#workmanager-inspector">WorkManager inspector</a> is now available when using Android Studio Arctic Fox.</li> </ul> <h3 id="2.5.0-rc01" data-text="Version 2.5.0-rc01" tabindex="-1">Version 2.5.0-rc01</h3> <p>January 13, 2021</p> <p><code translate="no" dir="ltr">androidx.work:work-*:2.5.0-rc01</code> is released. <a href="https://android.googlesource.com/platform/frameworks/support/+log/19cec447c629db6ab3e716338e55682beb599529..8e8a196e1c2eb6d6e6194b621267473c31bea375/work">Version 2.5.0-rc01 contains these commits.</a></p> <p><strong>Bug Fixes</strong></p> <ul> <li>Fixed a bug where <code translate="no" dir="ltr">getWorkInfosLiveData</code> was not correctly getting invalidated after entities were updated when using the <code translate="no" dir="ltr">WorkQuery</code> based API. (<a href="https://android-review.googlesource.com/c/platform/frameworks/support/+/1540566">aosp/1540566</a>, <a href="https://issuetracker.google.com/issues/173769028">b/173769028</a>)</li> <li>Fixed a bug where database transactions were not being marked as successful in some rare cases. This causes issues on some Motorola devices. (<a href="https://android-review.googlesource.com/c/platform/frameworks/support/+/1535368">aosp/1535368</a>, <a href="https://issuetracker.google.com/issues/175944460">b/175944460</a>)</li> <li>Fixed a bug to ignore <code translate="no" dir="ltr">NoSuchElementException</code>s when trying to unbind from a dead process. (<a href="https://android-review.googlesource.com/c/platform/frameworks/support/+/1530589">aosp/1530589</a>)</li> <li>Improve <code translate="no" dir="ltr">ConstraintTrackingWorker</code> to only stop a <code translate="no" dir="ltr">ListenableWorker</code> if it&#39;s not already been stopped. (<a href="https://android-review.googlesource.com/c/platform/frameworks/support/+/1496844">aosp/1496844</a>, <a href="https://issuetracker.google.com/issues/172946965">b/172946965</a>)</li> <li>Update androidx.work libraries to target Java 8 (<a href="https://android-review.googlesource.com/#/q/Ibd2f2076704eccf61ee4e7062b73ae24977adeb6">Ibd2f2</a>)</li> </ul> <h3 id="2.5.0-beta02" data-text="Version 2.5.0-beta02" tabindex="-1">Version 2.5.0-beta02</h3> <p>December 2, 2020</p> <p><code translate="no" dir="ltr">androidx.work:work-*:2.5.0-beta02</code> is released. <a href="https://android.googlesource.com/platform/frameworks/support/+log/67682f4d35e4f57d0fe3727c451a9537f64b0632..06e510c5098678de176fbda9c499fe09b096e257/work">Version 2.5.0-beta02 contains these commits.</a></p> <p><strong>Bug Fixes</strong></p> <ul> <li>Fixed a bug in <code translate="no" dir="ltr">androidx.work:work-multiprocess</code> where WorkManager inadvertently blocked the calling thread when trying to bind to the designated process. (<a href="https://android-review.googlesource.com/c/platform/frameworks/support/+/1475538">aosp/1475538</a>)</li> <li>Fixed a bug where <code translate="no" dir="ltr">PeriodicWorkRequest</code>s were not being reconciled correctly. (<a href="https://issuetracker.google.com/issues/172475041">b/172475041</a>, <a href="https://android-review.googlesource.com/c/platform/frameworks/support/+/1489577">aosp/1489577</a>)</li> <li>Added a workaround for a platform bug when stopping the foreground service when using the <code translate="no" dir="ltr">setForeground*</code> APIs. (<a href="https://issuetracker.google.com/issues/170924044">b/170924044</a>, <a href="https://android-review.googlesource.com/c/platform/frameworks/support/+/1489901">aosp/1489901</a>)</li> </ul> <h3 id="2.5.0-beta01" data-text="Version 2.5.0-beta01" tabindex="-1">Version 2.5.0-beta01</h3> <p>October 28, 2020</p> <p><code translate="no" dir="ltr">androidx.work:work-*:2.5.0-beta01</code> is released. <a href="https://android.googlesource.com/platform/frameworks/support/+log/f413b8be76bfa0a4d109a3afb583188c580a2aa6..67682f4d35e4f57d0fe3727c451a9537f64b0632/work">Version 2.5.0-beta01 contains these commits.</a></p> <p><strong>New Features</strong></p> <ul> <li><code translate="no" dir="ltr">WorkManager</code> automatically throttles the number of <code translate="no" dir="ltr">WorkRequest</code>s that can be picked up by the in-process scheduler. The requests are still executed in FIFO order. (<a href="https://android-review.googlesource.com/c/platform/frameworks/support/+/1455228">aosp/1455228</a>)</li> <li><code translate="no" dir="ltr">WorkManager</code> attempts to recover when the application’s datastore is in a bad state. (<a href="https://android-review.googlesource.com/c/platform/frameworks/support/+/1463103">aosp/1463103</a>)</li> </ul> <p><strong>Bug Fixes</strong></p> <ul> <li>When <code translate="no" dir="ltr">ListenableWorker</code>s are interrupted, mark them <code translate="no" dir="ltr">ENQUEUED</code> immediately so they can be subsequently rescheduled. (<a href="https://android-review.googlesource.com/c/platform/frameworks/support/+/1455618">aosp/1455618</a>, <a href="https://issuetracker.google.com/issues/170273988">b/170273988</a>)</li> </ul> <h3 id="2.5.0-alpha03" data-text="Version 2.5.0-alpha03" tabindex="-1">Version 2.5.0-alpha03</h3> <p>October 14, 2020</p> <p><code translate="no" dir="ltr">androidx.work:work-*:2.5.0-alpha03</code> is released. <a href="https://android.googlesource.com/platform/frameworks/support/+log/18a5639262f8504db530176550e338a5d0e2e044..f413b8be76bfa0a4d109a3afb583188c580a2aa6/work">Version 2.5.0-alpha03 contains these commits.</a></p> <p><strong>API Changes</strong></p> <ul> <li><code translate="no" dir="ltr">TestListenableWorkerBuilder</code> and <code translate="no" dir="ltr">TestWorkerBuilder</code> do not use raw types. (<a href="https://android-review.googlesource.com/#/q/I883ad37181cc32733c6f617009d4ab5903760452">I883ad</a>, <a href="https://issuetracker.google.com/issues/169787349">b/169787349</a>)</li> </ul> <p><strong>Bug Fixes</strong></p> <ul> <li>Use <code translate="no" dir="ltr">ApplicationInfo</code> to determine the name of the default app process. (<a href="https://issuetracker.google.com/issues/168716641">b/168716641</a>, <a href="https://android-review.googlesource.com/1429950">aosp/1429950</a>)</li> <li>Fix the visibility rules for <code translate="no" dir="ltr">RemoteWorkManager</code> and <code translate="no" dir="ltr">RemoteWorkContinuation</code>. These APIs are no-longer marked as <code translate="no" dir="ltr">@Restricted</code>. (<a href="https://android-review.googlesource.com/c/platform/frameworks/support/+/1432091">aosp/1432091</a>)</li> <li>Fix proguard rules for <code translate="no" dir="ltr">:work:work-multiprocess</code>. (<a href="https://android-review.googlesource.com/c/platform/frameworks/support/+/1432091">aosp/1432091</a>)</li> <li>Improve notification lifecycles for long running work bound to a foreground service. (<a href="https://issuetracker.google.com/issues/168502234">b/168502234</a>, <a href="https://android-review.googlesource.com/c/platform/frameworks/support/+/1431331">aosp/1431331</a>)</li> </ul> <h3 id="2.5.0-alpha02" data-text="Version 2.5.0-alpha02" tabindex="-1">Version 2.5.0-alpha02</h3> <p>September 16, 2020</p> <p><code translate="no" dir="ltr">androidx.work:work-*:2.5.0-alpha02</code> is released. <a href="https://android.googlesource.com/platform/frameworks/support/+log/96eb302ee1740ba656c90c9fb27df3723a1a89c1..18a5639262f8504db530176550e338a5d0e2e044/work">Version 2.5.0-alpha02 contains these commits.</a></p> <p><strong>New Features</strong></p> <ul> <li>Add an API to WorkQuery to be able to use <code translate="no" dir="ltr">id</code>s to query <code translate="no" dir="ltr">WorkInfo</code>s. (<a href="https://android-review.googlesource.com/c/platform/frameworks/support/+/1412372">aosp/1412372</a>, <a href="https://issuetracker.google.com/issues/157335295">b/157335295</a>)</li> <li>WorkManager better supports apps that use multiple processes with a new artifact (<code translate="no" dir="ltr">androidx.work:work-multiprocess:*</code>). This new artifact helps solve a few problems that large apps encounter including: <ul> <li>WorkManager typically needs to be initialized in every app process. This is not great because there is increased SQLite contention which in turn causes other problems. WorkManager now has new APIs which can be used to designate a <em>primary</em> app process using <code translate="no" dir="ltr">Configuration#setDefaultProcessName(processName)</code>. The <code translate="no" dir="ltr">processName</code> is a fully qualified process name which looks like <code translate="no" dir="ltr">packageName:processName</code> (e.g. <code translate="no" dir="ltr">com.example:remote</code>).</li> <li>A set of new APIs: <code translate="no" dir="ltr">RemoteWorkManager</code> and <code translate="no" dir="ltr">RemoteWorkContinuation</code> to <code translate="no" dir="ltr">enqueue</code>, <code translate="no" dir="ltr">cancel</code> and <code translate="no" dir="ltr">query</code> work requests. These APIs do <em>not</em> include <code translate="no" dir="ltr">LiveData</code> variants to avoid SQLite contention across multiple-processes. All calls to <code translate="no" dir="ltr">enqueue</code>, <code translate="no" dir="ltr">cancel</code> and <code translate="no" dir="ltr">query</code> are forwarded to a <code translate="no" dir="ltr">primary</code> app process using AIDL and return a fluent <code translate="no" dir="ltr">ListenableFuture</code>. (<a href="https://android-review.googlesource.com/c/platform/frameworks/support/+/1392657">aosp/1392657</a>, <a href="https://android-review.googlesource.com/c/platform/frameworks/support/+/1411210">aosp/1411210</a>, <a href="https://android-review.googlesource.com/c/platform/frameworks/support/+/1412215">aosp/1412215</a>, <a href="https://android-review.googlesource.com/c/platform/frameworks/support/+/1417713">aosp/1417713</a>)</li> </ul></li> </ul> <p><strong>API Changes</strong></p> <ul> <li>WorkManager now prunes completed <code translate="no" dir="ltr">WorkRequest</code>s that have no incomplete dependencies more aggressively. The buffer duration changed from <code translate="no" dir="ltr">7</code> days to <code translate="no" dir="ltr">1</code> day. (<a href="https://android-review.googlesource.com/c/platform/frameworks/support/+/1419708">aosp/1419708</a>)</li> </ul> <p><strong>Bug Fixes</strong></p> <ul> <li>WorkManager now reconciles jobs proactively so <code translate="no" dir="ltr">WorkRequest</code>s and <code translate="no" dir="ltr">JobScheduler</code> jobs are in sync when <code translate="no" dir="ltr">WorkManager</code> is initialized. (<a href="https://android-review.googlesource.com/c/platform/frameworks/support/+/1412794">aosp/1412794</a>, <a href="https://issuetracker.google.com/issues/166292069">b/166292069</a>)</li> </ul> <h3 id="2.5.0-alpha01" data-text="Version 2.5.0-alpha01" tabindex="-1">Version 2.5.0-alpha01</h3> <p>August 19, 2020</p> <p><code translate="no" dir="ltr">androidx.work:work-*:2.5.0-alpha01</code> is released. <a href="https://android.googlesource.com/platform/frameworks/support/+log/1fe9950a2c96b1046e15091cd832dbecd8a2d9cf..96eb302ee1740ba656c90c9fb27df3723a1a89c1/work">Version 2.5.0-alpha01 contains these commits.</a></p> <p><strong>New Features</strong></p> <ul> <li>Changes to internal APIs that allow us to provide better tooling with <code translate="no" dir="ltr">WorkManager</code> going forward. Stay tuned for additional updates.</li> </ul> <p><strong>Bug Fixes</strong></p> <ul> <li>Handle <code translate="no" dir="ltr">SecurityException</code>s when tracking network state on some devices. (<a href="https://android-review.googlesource.com/c/platform/frameworks/support/+/1396969">aosp/1396969</a>)</li> </ul> <p><strong>External Contribution</strong></p> <ul> <li>Fix documentation for <code translate="no" dir="ltr">ArrayCreatingInputMerger</code> by <a href="https://twitter.com/ZacSweers">Zac Sweers</a> (<a href="https://github.com/androidx/androidx/pull/43">github/43</a>).</li> </ul> <h2 id="version_240_3" data-text="Version 2.4.0" tabindex="-1">Version 2.4.0</h2> <h3 id="2.4.0" data-text="Version 2.4.0" tabindex="-1">Version 2.4.0</h3> <p>July 22, 2020</p> <p><code translate="no" dir="ltr">androidx.work:work-*:2.4.0</code> is released. <a href="https://android.googlesource.com/platform/frameworks/support/+log/098521464a5be8f6d5fb14a9772d859a8e6d3638..1fe9950a2c96b1046e15091cd832dbecd8a2d9cf/work">Version 2.4.0 contains these commits.</a></p> <p><strong>Major changes since 2.3.0</strong></p> <ul> <li><code translate="no" dir="ltr">WorkManager</code>s in-process scheduler is now more capable. Previously, the in-process <code translate="no" dir="ltr">Scheduler</code> would only consider executing work that was not delayed and whose constraints were met. Now, the in-process scheduler tracks <code translate="no" dir="ltr">WorkRequest</code>s which might be executed in the future, including PeriodicWorkRequests. The in-process <code translate="no" dir="ltr">Scheduler</code> also does not observe scheduling limits (but is still restricted to the size of the <code translate="no" dir="ltr">Executor</code> being used by WorkManager). This means that the application can now execute a lot more WorkRequests when the app is in the foreground. To manage execution of delayed work in the foreground, <code translate="no" dir="ltr">WorkManager</code> also introduces a new configurable <a href="/reference/kotlin/androidx/work/RunnableScheduler"><code translate="no" dir="ltr">RunnableScheduler</code></a>. (<a href="https://android-review.googlesource.com/c/platform/frameworks/support/+/1185778">aosp/1185778</a>)</li> <li>WorkManager now supports RxJava 3. To use RxJava 3, you should include the following dependency: <code translate="no" dir="ltr">implementation &quot;androidx.work:work-rxjava3:2.4.0&quot;</code>. (<a href="https://android-review.googlesource.com/c/platform/frameworks/support/+/1277904">aosp/1277904</a>)</li> <li>Added the ability to query for <code translate="no" dir="ltr">WorkInfo</code>s by using a <code translate="no" dir="ltr">WorkQuery</code>. This is useful when developers want to query <code translate="no" dir="ltr">WorkInfo</code>s by a combination of multiple attributes. For more information look at <code translate="no" dir="ltr">WorkQuery.Builder.fromStates(...)</code>, <code translate="no" dir="ltr">WorkQuery.Builder. fromTags(...)</code> or <code translate="no" dir="ltr">WorkQuery.Builder.fromUniqueWorkNames(...)</code>. (<a href="https://android-review.googlesource.com/c/platform/frameworks/support/+/1253230">aosp/1253230</a>, <a href="https://issuetracker.google.com/issues/143847546">b/143847546</a>)</li> <li><p>Add the ability to request diagnostic information from <code translate="no" dir="ltr">WorkManager</code> using:</p> <pre class="prettyprint lang-Bash" translate="no" dir="ltr"><code translate="no" dir="ltr">adb shell am broadcast -a &#34;androidx.work.diagnostics.REQUEST_DIAGNOSTICS&#34; -p &#34;&lt;your_app_package_name&gt;&#34; </code></pre> <p>This provides a lot of useful information including:</p> <ul> <li>WorkRequests that were completed in the last 24 hours.</li> <li>WorkRequests that are currently RUNNING.</li> <li>Scheduled WorkRequests. (<a href="https://android-review.googlesource.com/c/platform/frameworks/support/+/1235501">aosp/1235501</a>)</li> </ul></li> <li><p>Add <code translate="no" dir="ltr">ExistingWorkPolicy.APPEND_OR_REPLACE</code> which is similar to <code translate="no" dir="ltr">APPEND</code>, but replaces a chain that has cancelled or failed prerequisites. (<a href="https://issuetracker.google.com/issues/134613984">b/134613984</a>, <a href="https://android-review.googlesource.com/c/platform/frameworks/support/+/1199640">aosp/1199640</a>)</p></li> <li><p>Provide the ability to add a custom <code translate="no" dir="ltr">RunnableScheduler</code> to track WorkRequests that need to be executed in the future. This is used by the in-process Scheduler. (<a href="https://android-review.googlesource.com/c/platform/frameworks/support/+/1203944">aosp/1203944</a>)</p></li> <li><p>Add support for dynamically adding factories to delegate to, when using a <code translate="no" dir="ltr">DelegatingWorkerFactory</code>. (<a href="https://issuetracker.google.com/issues/156289105">b/156289105</a>, <a href="https://android-review.googlesource.com/c/platform/frameworks/support/+/1309745">aosp/1309745</a>)</p></li> <li><p>Align tracking for <code translate="no" dir="ltr">BATTERY_NOT_LOW</code> constraints more closely with the platform. (<a href="https://android-review.googlesource.com/c/platform/frameworks/support/+/1312583">aosp/1312583</a>)</p></li> <li><p>The in-process scheduler now uses better APIs to determine the name of the process. This is useful to better support apps that use multiple-processes. (<a href="https://android-review.googlesource.com/c/platform/frameworks/support/+/1324732">aosp/1324732</a>)</p></li> <li><p>New Lint rules which enforce:</p> <ul> <li>Use of the right <code translate="no" dir="ltr">foregroundServiceType</code> when using <code translate="no" dir="ltr">setForegroundAsync()</code> APIs. (<a href="https://issuetracker.google.com/issues/147873061">b/147873061</a>, <a href="https://android-review.googlesource.com/c/platform/frameworks/support/+/1215915">aosp/1215915</a>)</li> <li>Specifying JobScheduler ids that WorkManager should use when using JobService APIs directly. <a href="https://android-review.googlesource.com/c/platform/frameworks/support/+/1223567">aosp/1223567</a></li> <li>Added a new lint rule that ensures that <code translate="no" dir="ltr">ListenableWorker</code>implementations are now <code translate="no" dir="ltr">public</code> when using the default <code translate="no" dir="ltr">WorkerFactory</code>. (<a href="https://android-review.googlesource.com/c/platform/frameworks/support/+/1291262">aosp/1291262</a>)</li> </ul></li> <li><p>Calls to <code translate="no" dir="ltr">setForegroundAsync()</code> that do not complete before completion of a <code translate="no" dir="ltr">ListenableWorker</code> will now be signalled via an <code translate="no" dir="ltr">IllegalStateException</code> on the returned <code translate="no" dir="ltr">ListenableFuture</code>. (<a href="https://android-review.googlesource.com/c/platform/frameworks/support/+/1262743">aosp/1262743</a>)</p></li> <li><p>Fix a bug where the <code translate="no" dir="ltr">ForegroundService</code> is not stopped after a foreground <code translate="no" dir="ltr">Worker</code> is interrupted. (<a href="https://issuetracker.google.com/issues/155579898">b/155579898</a>, <a href="https://android-review.googlesource.com/c/platform/frameworks/support/+/1302153">aosp/1302153</a>)</p></li> <li><p>Fix a bug where <code translate="no" dir="ltr">WorkManager</code> attempts to execute multiple instances of a <code translate="no" dir="ltr">Worker</code> bound to a Foreground Service (<a href="https://issuetracker.google.com/issues/156310133">b/156310133</a>, <a href="https://android-review.googlesource.com/c/platform/frameworks/support/+/1309853">aosp/1309853</a>)</p></li> </ul> <h3 id="2.4.0-rc01" data-text="Version 2.4.0-rc01" tabindex="-1">Version 2.4.0-rc01</h3> <p>June 24, 2020</p> <p><code translate="no" dir="ltr">androidx.work:work-*:2.4.0-rc01</code> is released. <a href="https://android.googlesource.com/platform/frameworks/support/+log/ccc6e95c574b66563952c33fbe26888b93a0e0cb..098521464a5be8f6d5fb14a9772d859a8e6d3638/work">Version 2.4.0-rc01 contains these commits.</a></p> <p><strong>Bug Fixes</strong></p> <ul> <li>The in-process scheduler now uses better APIs to determine the name of the process. This is useful to better support apps that use multiple-processes. (<a href="https://android-review.googlesource.com/c/platform/frameworks/support/+/1324732">aosp/1324732</a>)</li> </ul> <h3 id="2.4.0-beta01" data-text="Version 2.4.0-beta01" tabindex="-1">Version 2.4.0-beta01</h3> <p>May 20, 2020</p> <p><code translate="no" dir="ltr">androidx.work:work-gcm:2.4.0-beta01</code>, <code translate="no" dir="ltr">androidx.work:work-runtime:2.4.0-beta01</code>, <code translate="no" dir="ltr">androidx.work:work-runtime-ktx:2.4.0-beta01</code>, <code translate="no" dir="ltr">androidx.work:work-rxjava2:2.4.0-beta01</code>, and <code translate="no" dir="ltr">androidx.work:work-testing:2.4.0-beta01</code> are released. <a href="https://android.googlesource.com/platform/frameworks/support/+log/b752a10305d7cd58a7f50ad094ed54af4d765f27..ccc6e95c574b66563952c33fbe26888b93a0e0cb/work">Version 2.4.0-beta01 contains these commits.</a></p> <p><strong>Bug Fixes</strong></p> <ul> <li>Fix a bug where the <code translate="no" dir="ltr">ForegroundService</code> is not stopped after a foreground <code translate="no" dir="ltr">Worker</code> is interrupted. (<a href="https://issuetracker.google.com/issues/155579898">b/155579898</a>, <a href="https://android-review.googlesource.com/c/platform/frameworks/support/+/1302153">aosp/1302153</a>)</li> <li>Fix a bug where <code translate="no" dir="ltr">WorkManager</code> attempts to execute multiple instances of a <code translate="no" dir="ltr">Worker</code> bound to a Foreground Service (<a href="https://issuetracker.google.com/issues/156310133">b/156310133</a>, <a href="https://android-review.googlesource.com/c/platform/frameworks/support/+/1309853">aosp/1309853</a>)</li> <li>Add support for dynamically adding factories to delegate to, when using a <code translate="no" dir="ltr">DelegatingWorkerFactory</code>. (<a href="https://issuetracker.google.com/issues/156289105">b/156289105</a>, <a href="https://android-review.googlesource.com/c/platform/frameworks/support/+/1309745">aosp/1309745</a>)</li> <li>Align tracking for <code translate="no" dir="ltr">BATTERY_NOT_LOW</code> constraints more closely with the platform. (<a href="https://android-review.googlesource.com/c/platform/frameworks/support/+/1312583">aosp/1312583</a>)</li> </ul> <h3 id="2.4.0-alpha03" data-text="Version 2.4.0-alpha03" tabindex="-1">Version 2.4.0-alpha03</h3> <p>April 29, 2020</p> <p><code translate="no" dir="ltr">androidx.work:work-*:2.4.0-alpha03</code> is released. <a href="https://android.googlesource.com/platform/frameworks/support/+log/6c98d66b901be2eecdf89477ccd70d2490ca6fc2..b752a10305d7cd58a7f50ad094ed54af4d765f27/work">Version 2.4.0-alpha03 contains these commits.</a></p> <p><strong>New Features</strong></p> <ul> <li>WorkManager now supports RxJava 3. To use RxJava 3, you should include the following dependency: <code translate="no" dir="ltr">implementation &quot;androidx.work:work-rxjava3:2.4.0-alpha03&quot;</code>. (<a href="https://android-review.googlesource.com/c/platform/frameworks/support/+/1277904">aosp/1277904</a>)</li> <li>Added a new lint rule that ensures that <code translate="no" dir="ltr">ListenableWorker</code>implementations are now <code translate="no" dir="ltr">public</code> when using the default <code translate="no" dir="ltr">WorkerFactory</code>. (<a href="https://android-review.googlesource.com/c/platform/frameworks/support/+/1291262">aosp/1291262</a>)</li> </ul> <p><strong>API Changes</strong></p> <ul> <li>Calling <code translate="no" dir="ltr">setProgressAsync()</code> after a <code translate="no" dir="ltr">ListenableWorker</code> has finished execution will now signal an <code translate="no" dir="ltr">Exception</code> via the <code translate="no" dir="ltr">ListenableFuture</code>. (<a href="https://android-review.googlesource.com/c/platform/frameworks/support/+/1285494">aosp/1285494</a>)</li> <li><code translate="no" dir="ltr">WorkQuery.Builder</code> is now marked <code translate="no" dir="ltr">final</code>. (<a href="https://android-review.googlesource.com/c/platform/frameworks/support/+/1275037">aosp/1275037</a>)</li> <li><code translate="no" dir="ltr">WorkQuery.Builder</code> factory methods <code translate="no" dir="ltr">withStates</code>, <code translate="no" dir="ltr">withTags</code> and <code translate="no" dir="ltr">withUniqueWorkNames</code> have been renamed to <code translate="no" dir="ltr">fromStates</code>, <code translate="no" dir="ltr">fromTags</code> and <code translate="no" dir="ltr">fromUniqueWorkNames</code> respectively. (<a href="https://android-review.googlesource.com/c/platform/frameworks/support/+/1280287">aosp/1280287</a>)</li> </ul> <p><strong>Bug Fixes</strong></p> <ul> <li>Ignore <code translate="no" dir="ltr">SecurityException</code>s when tracking network state of a device. (<a href="https://issuetracker.google.com/issues/153246136">b/153246136</a>, <a href="https://android-review.googlesource.com/c/platform/frameworks/support/+/1280813">aosp/1280813</a>)</li> </ul> <h3 id="2.4.0-alpha02" data-text="Version 2.4.0-alpha02" tabindex="-1">Version 2.4.0-alpha02</h3> <p>April 1, 2020</p> <p><code translate="no" dir="ltr">androidx.work:work-*:2.4.0-alpha02</code> is released. <a href="https://android.googlesource.com/platform/frameworks/support/+log/2fd74387bd35dc4acb471992654788fab3244b35..6c98d66b901be2eecdf89477ccd70d2490ca6fc2/work">Version 2.4.0-alpha02 contains these commits.</a></p> <p><strong>New Features</strong></p> <ul> <li>Added a new Lint rule that warns when <code translate="no" dir="ltr">WorkRequest</code>s requires both <code translate="no" dir="ltr">Constraints.setRequiresCharging(...)</code> and <code translate="no" dir="ltr">Constraints.setRequiresDeviceIdle(...)</code>. Some devices are never charging and idle at the same time. So such requests would run less frequently than expected. (<a href="https://android-review.googlesource.com/c/platform/frameworks/support/+/1253840">aosp/1253840</a>)</li> </ul> <p><strong>API Changes</strong></p> <ul> <li><p>Added the ability to query for <code translate="no" dir="ltr">WorkInfo</code>s by using a <code translate="no" dir="ltr">WorkQuery</code>. This is useful when developers want to query <code translate="no" dir="ltr">WorkInfo</code>s by a combination of multiple attributes. For more information look at <code translate="no" dir="ltr">WorkQuery.Builder withStates(...)</code>, <code translate="no" dir="ltr">WorkQuery.Builder withTags(...)</code> or <code translate="no" dir="ltr">WorkQuery.Builder withUniqueWorkNames(...)</code>. (<a href="https://android-review.googlesource.com/c/platform/frameworks/support/+/1253230">aosp/1253230</a>, <a href="https://issuetracker.google.com/issues/143847546">b/143847546</a>)</p></li> <li><p>Calls to <code translate="no" dir="ltr">setForegroundAsync()</code> that do not complete before completion of a <code translate="no" dir="ltr">ListenableWorker</code> will now be signalled via an <code translate="no" dir="ltr">IllegalStateException</code> on the returned <code translate="no" dir="ltr">ListenableFuture</code>. (<a href="https://android-review.googlesource.com/c/platform/frameworks/support/+/1262743">aosp/1262743</a>)</p></li> </ul> <p><strong>Bug Fixes</strong></p> <ul> <li>Fixed the lint rule that checks for invalid interval durations for <code translate="no" dir="ltr">PeriodicWorkRequest</code>s. (<a href="https://android-review.googlesource.com/c/platform/frameworks/support/+/1254846">aosp/1254846</a>, <a href="https://issuetracker.google.com/issues/152606442">b/152606442</a>)</li> </ul> <h3 id="2.4.0-alpha01" data-text="Version 2.4.0-alpha01" tabindex="-1">Version 2.4.0-alpha01</h3> <p>March 4, 2020</p> <p><code translate="no" dir="ltr">androidx.work:work-*:2.4.0-alpha01</code> is released. <a href="https://android.googlesource.com/platform/frameworks/support/+log/d7ffb1e3214adc08092397ca92881b05fb69521a..2fd74387bd35dc4acb471992654788fab3244b35/work">Version 2.4.0-alpha01 contains these commits.</a></p> <p><strong>New Features</strong></p> <ul> <li><p><code translate="no" dir="ltr">WorkManager</code>s in-process scheduler is now more capable. Previously, the in-process Scheduler would only consider executing work that was <em>not</em> delayed and whose constraints were met. Now, the in-process scheduler tracks <code translate="no" dir="ltr">WorkRequest</code>s which might be executed in the future, including <code translate="no" dir="ltr">PeriodicWorkRequest</code>s. The in-process Scheduler also does <strong>not</strong> observe <a href="/reference/androidx/work/Configuration.Builder#setMaxSchedulerLimit(int)">scheduling limits</a> (but is still restricted to the size of the <code translate="no" dir="ltr">Executor</code> being used by WorkManager). This means that the application can now execute a lot more <code translate="no" dir="ltr">WorkRequest</code>s when the app is in the foreground. (<a href="https://android-review.googlesource.com/c/platform/frameworks/support/+/1185778">aosp/1185778</a>)</p></li> <li><p>Added the ability to request diagnostic information from WorkManager using <code translate="no" dir="ltr">adb shell am broadcast -a &quot;androidx.work.diagnostics.REQUEST_DIAGNOSTICS&quot; -p &quot;&lt;your_app_package_name&gt;&quot;</code>. This provides a lot of useful information including:</p> <ul> <li>WorkRequests that were completed in the last 24 hours.</li> <li>WorkRequests that are currently RUNNING.</li> <li>Scheduled WorkRequests. (<a href="https://android-review.googlesource.com/c/platform/frameworks/support/+/1235501">aosp/1235501</a>)</li> </ul></li> <li><p>New Lint rules which enforce:</p> <ul> <li>Use of the right <code translate="no" dir="ltr">foregroundServiceType</code> when using <code translate="no" dir="ltr">setForegroundAsync()</code> APIs. (<a href="https://issuetracker.google.com/issues/147873061">b/147873061</a>, <a href="https://android-review.googlesource.com/c/platform/frameworks/support/+/1215915">aosp/1215915</a>)</li> <li>Specifying <code translate="no" dir="ltr">JobScheduler</code> ids that <code translate="no" dir="ltr">WorkManager</code> should use when using <code translate="no" dir="ltr">JobService</code> APIs directly. (<a href="https://android-review.googlesource.com/c/platform/frameworks/support/+/1223567">aosp/1223567</a>)</li> </ul></li> </ul> <p><strong>API Changes</strong></p> <ul> <li><p>Add <code translate="no" dir="ltr">ExistingWorkPolicy.APPEND_OR_REPLACE</code> which is similar to <code translate="no" dir="ltr">APPEND</code>, but <strong>replaces</strong> a chain that has cancelled or failed prerequisites. (<a href="https://issuetracker.google.com/issues/134613984">b/134613984</a>, <a href="https://android-review.googlesource.com/c/platform/frameworks/support/+/1199640">aosp/1199640</a>)</p></li> <li><p>Provide the ability to add a custom <code translate="no" dir="ltr">RunnableScheduler</code> to track <code translate="no" dir="ltr">WorkRequest</code>s that need to be executed in the future. This is used by the in-process Scheduler. (<a href="https://android-review.googlesource.com/c/platform/frameworks/support/+/1203944">aosp/1203944</a>)</p></li> </ul> <p><strong>Bug Fixes</strong></p> <ul> <li>Deprecated <code translate="no" dir="ltr">setProgress()</code> in <code translate="no" dir="ltr">RxWorker</code> because it previously returned a <code translate="no" dir="ltr">Single&lt;Void&gt;</code> which is an impossible type. Added a new API <code translate="no" dir="ltr">setCompletableProgress()</code> which returns a <code translate="no" dir="ltr">Completable</code> instead; and added new Lint rules which help migrate to the new APIs. (<a href="https://issuetracker.google.com/issues/150080946">b/150080946</a>, <a href="https://android-review.googlesource.com/c/platform/frameworks/support/+/1242665">aosp/1242665</a>)</li> </ul> <h2 id="version_234_3" data-text="Version 2.3.4" tabindex="-1">Version 2.3.4</h2> <h3 id="2.3.4" data-text="Version 2.3.4" tabindex="-1">Version 2.3.4</h3> <p>March 18, 2020</p> <p><code translate="no" dir="ltr">androidx.work:work-*:2.3.4</code> is released. <a href="https://android.googlesource.com/platform/frameworks/support/+log/3735155f52238ca168c5608ed332179382b76899..a6360a30a94ce26f8b4d9322eccd3038b669adee/work">Version 2.3.4 contains these commits.</a></p> <p><strong>Bug Fixes</strong></p> <ul> <li>Fixed a bug which would cause multiple instances of a long running <code translate="no" dir="ltr">Worker</code>s to run, after exceeding the 10 minute execution window. (<a href="https://android-review.googlesource.com/c/platform/frameworks/support/+/1247484">aosp/1247484</a>, <a href="https://issuetracker.google.com/issues/150553353">b/150553353</a>)</li> <li>Fix for WorkManager’s lint <code translate="no" dir="ltr">IssueRegistry</code>. Thank you <a href="https://twitter.com/ZacSweers">@ZacSweers</a> from Slack, for the contribution. (<a href="https://android-review.googlesource.com/c/platform/frameworks/support/+/1217923">aosp/1217923</a>)</li> </ul> <h2 id="version_233_3" data-text="Version 2.3.3" tabindex="-1">Version 2.3.3</h2> <h3 id="2.3.3" data-text="Version 2.3.3" tabindex="-1">Version 2.3.3</h3> <p>March 4, 2020</p> <p><code translate="no" dir="ltr">androidx.work:work-*:2.3.3</code> is released. <a href="https://android.googlesource.com/platform/frameworks/support/+log/3735155f52238ca168c5608ed332179382b76899..107a42c26aa39c3f96f6de0cc46021ef39b76cc6/work">Version 2.3.3 contains these commits.</a></p> <p><strong>Bug Fixes</strong></p> <ul> <li>Fixed a bug where if a <code translate="no" dir="ltr">Worker</code> was interrupted, it would not get rescheduled correctly. (<a href="https://issuetracker.google.com/issues/150325687">b/150325687</a>, <a href="https://android-review.googlesource.com/c/platform/frameworks/support/+/1246571">aosp/1246571</a>)</li> </ul> <h2 id="version_232_3" data-text="Version 2.3.2" tabindex="-1">Version 2.3.2</h2> <h3 id="2.3.2" data-text="Version 2.3.2" tabindex="-1">Version 2.3.2</h3> <p>February 19, 2020</p> <p><code translate="no" dir="ltr">androidx.work:work-*:2.3.2</code> are released. <a href="https://android.googlesource.com/platform/frameworks/support/+log/d7ffb1e3214adc08092397ca92881b05fb69521a..3735155f52238ca168c5608ed332179382b76899/work">Version 2.3.2 contains these commits.</a></p> <p><strong>Bug Fixes</strong></p> <ul> <li>Fixes an issue where WorkManager exceeds the 100 job limit in JobScheduler in rare cases. (<a href="https://android-review.googlesource.com/c/platform/frameworks/support/+/1226859">aosp/1226859</a>, <a href="https://issuetracker.google.com/issues/149092520">b/149092520</a>)</li> <li>Fix for a race condition in ConstraintControllers. (<a href="https://android-review.googlesource.com/c/platform/frameworks/support/+/1220100">aosp/1220100</a>)</li> <li>Improved the management foreground Service lifecycle for long running Workers. (<a href="https://android-review.googlesource.com/c/platform/frameworks/support/+/1226295">aosp/1226295</a>) </li> <li>Improved the management of cancellation of Notifications for long running Workers upon Worker cancellation. (<a href="https://android-review.googlesource.com/c/platform/frameworks/support/+/1228346">aosp/1228346</a>)</li> </ul> <h2 id="version_231_3" data-text="Version 2.3.1" tabindex="-1">Version 2.3.1</h2> <h3 id="2.3.1" data-text="Version 2.3.1" tabindex="-1">Version 2.3.1</h3> <p>February 5, 2020</p> <p><code translate="no" dir="ltr">androidx.work:work-*:2.3.1</code> is released. <a href="https://android.googlesource.com/platform/frameworks/support/+log/cdec0090b957bd9020ff2462c3006cbb1381ddc6..d7ffb1e3214adc08092397ca92881b05fb69521a/work">Version 2.3.1 contains these commits</a>.</p> <p><strong>Bug fixes</strong></p> <ul> <li>Better manage the lifecycle of <code translate="no" dir="ltr">Notification</code>s for long running <code translate="no" dir="ltr">Worker</code>s that run when a foreground <code translate="no" dir="ltr">Service</code> is active. (<a href="https://android-review.googlesource.com/c/platform/frameworks/support/+/1218539">aosp/1218539</a>, <a href="https://issuetracker.google.com/issues/147249312">b/147249312</a>)</li> <li><code translate="no" dir="ltr">WorkManager</code> now depends on <code translate="no" dir="ltr">androidx.sqlite:sqlite-framework:2.1.0</code> stable. (<a href="https://android-review.googlesource.com/c/platform/frameworks/support/+/1217729">aosp/1217729</a>)</li> <li>Added lint rules to ensure that a <code translate="no" dir="ltr">foregroundServiceType</code> is specified in the <code translate="no" dir="ltr">AndroidManifest.xml</code> when using <code translate="no" dir="ltr">foregroundServiceType</code>s in <code translate="no" dir="ltr">ForegroundInfo</code>. (<a href="https://android-review.googlesource.com/c/platform/frameworks/support/+/1214207">aosp/1214207</a>, <a href="https://issuetracker.google.com/issues/147873061">b/147873061</a>)</li> </ul> <h2 id="version_230_3" data-text="Version 2.3.0" tabindex="-1">Version 2.3.0</h2> <h3 id="2.3.0" data-text="Version 2.3.0" tabindex="-1">Version 2.3.0</h3> <p>January 22, 2020</p> <p><code translate="no" dir="ltr">androidx.work:work-*:2.3.0</code> is released with no changes since <code translate="no" dir="ltr">2.3.0-rc01</code>. <a href="https://android.googlesource.com/platform/frameworks/support/+log/491f8d1faf067d76cfaf0c8e82561386861e55e1..cdec0090b957bd9020ff2462c3006cbb1381ddc6/work">Version 2.3.0 contains these commits</a>.</p> <p><strong>Important changes since 2.2.0</strong></p> <ul> <li>Support for long running or important work via <code translate="no" dir="ltr">ListenableWorker#setForegroundAsync()</code>.</li> <li>Support for Worker Progress via <code translate="no" dir="ltr">ListenableWorker#setProgressAsync()</code>.</li> <li>WorkManager now packages additional lint rules as part of the library which helps catch bugs early.</li> </ul> <h3 id="2.3.0-rc01" data-text="Version 2.3.0-rc01" tabindex="-1">Version 2.3.0-rc01</h3> <p>January 8, 2020</p> <p><code translate="no" dir="ltr">androidx.work:work-*:2.3.0-rc01</code> is released. <a href="https://android.googlesource.com/platform/frameworks/support/+log/740cde70237dd276f8ad66dfe9528b1cdb5d54bb..491f8d1faf067d76cfaf0c8e82561386861e55e1/work">Version 2.3.0-rc01 contains these commits</a>.</p> <p>This release is identical to <a href="https://developer.android.com/jetpack/androidx/releases/work#2.3.0-beta02"><code translate="no" dir="ltr">2.3.0-beta02</code></a></p> <p><strong>Bug fixes</strong></p> <ul> <li>The <code translate="no" dir="ltr">work-testing</code> artifact now defines an <code translate="no" dir="ltr">api</code> dependency on <code translate="no" dir="ltr">work-runtime-ktx</code>. (<a href="https://android-review.googlesource.com/c/platform/frameworks/support/+/1194410">aosp/1194410</a>)</li> </ul> <h3 id="2.3.0-beta02" data-text="Version 2.3.0-beta02" tabindex="-1">Version 2.3.0-beta02</h3> <p>December 18, 2019</p> <p><code translate="no" dir="ltr">androidx.work:work-*:2.3.0-beta02</code> is released. <a href="https://android.googlesource.com/platform/frameworks/support/+log/0042c0019bb455afc79ddfec9bf2993d018f70ce..740cde70237dd276f8ad66dfe9528b1cdb5d54bb/work">Version 2.3.0-beta02 contains these commits</a>.</p> <p><strong>New features</strong></p> <ul> <li>Added a better error message for non-recoverable SQLite exceptions. (<a href="https://android-review.googlesource.com/c/1185777">aosp/1185777</a>)</li> <li>Added a lint rule which ensures that the content provider <code translate="no" dir="ltr">androidx.work.impl.WorkManagerInitializer</code> is removed from the <code translate="no" dir="ltr">AndroidManifest.xml</code> when using on demand initialization. (<a href="https://android-review.googlesource.com/c/1167007">aosp/1167007</a>)</li> <li>Added a lint warning when <code translate="no" dir="ltr">enqueue()</code> is used for a <code translate="no" dir="ltr">PeriodicWorkRequest</code> instead of <code translate="no" dir="ltr">enqueueUniquePeriodicWork()</code>. (<a href="https://android-review.googlesource.com/c/1166032">aosp/1166032</a>)</li> </ul> <p><strong>API changes</strong></p> <ul> <li><code translate="no" dir="ltr">ForegroundInfo</code> now requires you to specify the <code translate="no" dir="ltr">notificationId</code> to be used when using <code translate="no" dir="ltr">ListenableWorker.setForegroundAsync()</code>. <strong>This is a breaking change.</strong> This allows you to run multiple long running <code translate="no" dir="ltr">Worker</code>s in parallel. <code translate="no" dir="ltr">WorkManager</code> also better manages lifetimes of the provided <code translate="no" dir="ltr">Notification</code>s. (<a href="https://issuetracker.google.com/issues/145473554">b/145473554</a>, <a href="https://android-review.googlesource.com/c/1181208">aosp/1181208</a>, <a href="https://android-review.googlesource.com/c/1181216">asop/1181216</a>, <a href="https://android-review.googlesource.com/c/1183577">asop/1183577</a>)</li> </ul> <p><strong>Bug fixes</strong></p> <ul> <li>Fixed a bug in the AlarmManager implementation where alarms were not being cleaned up correctly. (<a href="https://android-review.googlesource.com/c/1156444">aosp/1156444</a>)</li> <li>Fixed a bug where an empty list of <code translate="no" dir="ltr">WorkRequest</code>s would cause an incorrect <code translate="no" dir="ltr">WorkContinuation</code> chain to be built. (<a href="https://issuetracker.google.com/issues/142835274">b/142835274</a>, <a href="https://android-review.googlesource.com/c/1157051">aosp/1157051</a>)</li> </ul> <p><strong>Dependency changes</strong></p> <ul> <li>WorkManager now uses Room 2.2.2.</li> </ul> <h3 id="2.3.0-beta01" data-text="Version 2.3.0-beta01" tabindex="-1">Version 2.3.0-beta01</h3> <p>November 20, 2019</p> <p><code translate="no" dir="ltr">androidx.work:work-*:2.3.0-beta01</code> is released. <a href="https://android.googlesource.com/platform/frameworks/support/+log/bc0450b5cd9c18270bfc4ce5068140e0b76d52c9..0042c0019bb455afc79ddfec9bf2993d018f70ce/work">Version 2.3.0-beta01 contains these commits</a>.</p> <p><strong>New features</strong></p> <ul> <li>Added a new lint rule which prevents developer errors due to incorrect implementation of <code translate="no" dir="ltr">androidx.work.Configuration.Provider</code> when using on-demand initialization. <a href="https://android-review.googlesource.com/c/platform/frameworks/support/+/1164559">aosp/1164559</a></li> </ul> <h3 id="2.3.0-alpha03" data-text="Version 2.3.0-alpha03" tabindex="-1">Version 2.3.0-alpha03</h3> <p>October 23, 2019</p> <p><code translate="no" dir="ltr">androidx.work:work-*:2.3.0-alpha03</code> is released. <a href="https://android.googlesource.com/platform/frameworks/support/+log/3ceb16dfb202e267249a5a5f14e9159ff0f95d9e..bc0450b5cd9c18270bfc4ce5068140e0b76d52c9/work">Version 2.3.0-alpha03 contains these commits</a>.</p> <p><strong>New features</strong></p> <ul> <li>Added <code translate="no" dir="ltr">WorkManager.createCancelPendingIntent()</code> API which makes it easy to cancel <code translate="no" dir="ltr">WorkRequest</code>s without having to register another component in the <code translate="no" dir="ltr">AndroidManifest.xml</code>. This API makes it especially easy to cancel <code translate="no" dir="ltr">WorkRequest</code>s from <code translate="no" dir="ltr">Notification</code>s. We expect this to be paired with the new foreground APIs in 2.3.0.</li> <li>WorkManager now depends on <code translate="no" dir="ltr">androidx.room:*:2.2.0</code> stable.</li> </ul> <p><strong>API changes</strong></p> <ul> <li>Renamed <code translate="no" dir="ltr">ForegroundInfo.getNotificationType()</code> to <code translate="no" dir="ltr">ForegroundInfo.getForegroundServiceType()</code> to be more consistent with the underlying platform APIs. (<a href="https://issuetracker.google.com/issues/142729893">b/142729893</a>, <a href="https://android-review.googlesource.com/c/platform/frameworks/support/+/1143316">aosp/1143316</a>)</li> </ul> <p><strong>Bug fixes</strong></p> <ul> <li>Fixed a bug which is caused by an unnecessary call to <code translate="no" dir="ltr">setTransactionSuccessful()</code> outside of a transaction. This happens for rare migrations. (<a href="https://issuetracker.google.com/issues/142580433">b/142580433</a>, <a href="https://android-review.googlesource.com/c/platform/frameworks/support/+/1141737">aosp/1141737</a>)</li> </ul> <h3 id="2.3.0-alpha02" data-text="Version 2.3.0-alpha02" tabindex="-1">Version 2.3.0-alpha02</h3> <p>October 9, 2019</p> <p><code translate="no" dir="ltr">androidx.work:work-*:2.3.0-alpha02</code> is released. <a href="https://android.googlesource.com/platform/frameworks/support/+log/2114e28ad291adc12d4ea9bd4038a211daec16b8..3ceb16dfb202e267249a5a5f14e9159ff0f95d9e/work">Version 2.3.0-alpha02 contains these commits</a>.</p> <p><strong>New features</strong></p> <ul> <li>WorkManager now supports running long running or important work that should be kept alive by the OS. For more information look at <code translate="no" dir="ltr">ListenableWorker#setForegroundAsync()</code> (or <code translate="no" dir="ltr">CoroutineWorker#setForeground()</code> for Kotlin). (<a href="https://android-review.googlesource.com/c/platform/frameworks/support/+/1133636">aosp/1133636</a>)</li> </ul> <p><strong>API changes</strong></p> <ul> <li>The <code translate="no" dir="ltr">containsKey</code> API in <code translate="no" dir="ltr">Data</code> is renamed to <code translate="no" dir="ltr">hasKeyWithValueOfType</code>. The corresponding extension method in the <code translate="no" dir="ltr">ktx</code> library has also been renamed. (<a href="https://issuetracker.google.com/issues/141916545">b/141916545</a>)</li> </ul> <p><strong>Bug fixes</strong></p> <ul> <li>WorkManager schedules work fairly when the number of <code translate="no" dir="ltr">WorkRequest</code>s enqueued approach <a href="/reference/androidx/work/Configuration.Builder#setMaxSchedulerLimit(int)">scheduling limits</a>. (<a href="https://android-review.googlesource.com/c/platform/frameworks/support/+/1105766">aosp/1105766</a>)</li> <li>WorkManager calls <code translate="no" dir="ltr">ListenableWorker#onStopped()</code> only if the work is not already completed. (<a href="https://issuetracker.google.com/issues/140055777">b/140055777</a>)</li> <li>WorkManager now removes progress information when a worker gets interrupted or reaches its terminal state. (<a href="https://android-review.googlesource.com/c/platform/frameworks/support/+/1114572">aosp/1114572</a>)</li> <li><code translate="no" dir="ltr">Data</code> now has a much more useful <code translate="no" dir="ltr">toString()</code>representation. (<a href="https://issuetracker.google.com/issues/140945323">b/140945323</a>)</li> <li><code translate="no" dir="ltr">Data</code> now has a better <code translate="no" dir="ltr">equals()</code> method. It also supports <code translate="no" dir="ltr">deepEquals</code> for <code translate="no" dir="ltr">Array</code> types. (<a href="https://issuetracker.google.com/issues/140922528">b/140922528</a>)</li> <li>WorkManager now stores its internal database and preference files in a no backup directory. (<a href="https://issuetracker.google.com/issues/114808216">b/114808216</a>)</li> </ul> <h3 id="2.3.0-alpha01" data-text="Version 2.3.0-alpha01" tabindex="-1">Version 2.3.0-alpha01</h3> <p>August 22, 2019</p> <p><code translate="no" dir="ltr">androidx.work:work-*:2.3.September 5, 20190-alpha01</code> is released. The commits included in this version can be found <a href="https://android.googlesource.com/platform/frameworks/support/+log/57828f2feae3e65ae15c1cd8acd4f56af451ce5e..2114e28ad291adc12d4ea9bd4038a211daec16b8/work">here</a>.</p> <p><strong>New features</strong></p> <ul> <li><code translate="no" dir="ltr">ListenableWorker</code>s can now set progress via the <code translate="no" dir="ltr">setProgressAsync()</code> API. Also added a corresponding <code translate="no" dir="ltr">suspend</code>-ing <code translate="no" dir="ltr">setProgress</code> API in <code translate="no" dir="ltr">CoroutineWorker</code> and a <code translate="no" dir="ltr">setProgress</code> in <code translate="no" dir="ltr">RxWorker</code> which returns a <code translate="no" dir="ltr">Single&lt;Void&gt;</code>. With these new APIs Workers can convey progress information via <code translate="no" dir="ltr">WorkInfo</code> which has a corresponding <code translate="no" dir="ltr">getProgress</code> API. (<a href="https://issuetracker.google.com/issues/79481554">b/79481554</a>)</li> <li><code translate="no" dir="ltr">Data</code> has a <code translate="no" dir="ltr">containsKey()</code> API which can be used to validate that input data to <code translate="no" dir="ltr">Worker</code>s has keys with the expected type. (<a href="https://issuetracker.google.com/issues/117136838">b/117136838</a>)</li> <li><code translate="no" dir="ltr">Data</code> can now be serialized using <code translate="no" dir="ltr">Data.toByteArray()</code> and <code translate="no" dir="ltr">Data.fromByteArray()</code>. Note that there are no versioning guarantees with <code translate="no" dir="ltr">Data</code> so you should <em>not</em> persist it or use it for IPC between applications. They are only safe to be used between multiple processes of the <em>same</em> application.</li> <li>Added the ability to specify an <code translate="no" dir="ltr">InputMergerFactory</code> via <code translate="no" dir="ltr">Configuration.setInputMergerFactory</code>. (<a href="https://issuetracker.google.com/issues/133273159">b/133273159</a>)</li> </ul> <p><strong>API changes</strong></p> <ul> <li>WorkManager will throw an instance of <code translate="no" dir="ltr">IllegalStateException</code> if a <code translate="no" dir="ltr">WorkerFactory</code> returns an instance of <code translate="no" dir="ltr">ListenableWorker</code> which has been previously invoked. (<a href="https://issuetracker.google.com/issues/139554406">b/139554406</a>)</li> <li>Documentation updates around <code translate="no" dir="ltr">ListenableFuture</code> cancellation and the <code translate="no" dir="ltr">onStopped()</code> callback in <code translate="no" dir="ltr">ListenableWorker</code>. (<a href="https://issuetracker.google.com/issues/138413671">b/138413671</a>)</li> </ul> <p><strong>Bug fixes</strong></p> <ul> <li>The in-process Scheduler now ignores <code translate="no" dir="ltr">WorkRequest</code>s with the <code translate="no" dir="ltr">idle</code> constraint. These requests are now only picked up by <code translate="no" dir="ltr">JobScheduler</code> when the device is actually <code translate="no" dir="ltr">idle</code>. (<a href="https://android-review.googlesource.com/c/platform/frameworks/support/+/1089779">aosp/1089779</a>)</li> <li><code translate="no" dir="ltr">TestScheduler</code> now correctly uses the specified <code translate="no" dir="ltr">Executor</code> for its internal task executor in tests. (<a href="https://android-review.googlesource.com/c/platform/frameworks/support/+/1090749">aosp/1090749</a>)</li> </ul> <h2 id="version_220_3" data-text="Version 2.2.0" tabindex="-1">Version 2.2.0</h2> <h3 id="2.2.0" data-text="Version 2.2.0" tabindex="-1">Version 2.2.0</h3> <p>August 15, 2019</p> <p><code translate="no" dir="ltr">androidx.work:work-*:2.2.0</code> is released. The commits included in this version can be found <a href="https://android.googlesource.com/platform/frameworks/support/+log/cb0c2f6acf089f2ad79726ab04dc2a56335999e4..ce4459ef9ceb05f7ffedfe072ed16f0aca352d07/work">here</a>.</p> <p>This release is identical to <code translate="no" dir="ltr">androidx.work:work-*:2.2.0-rc01</code>.</p> <p><strong>Important Changes in 2.2.0 from 2.1.0</strong></p> <p><code translate="no" dir="ltr">androidx.work:work-gcm:2.2.0</code> is a new Maven artifact which supports the use of GCMNetworkManager as a scheduler when Google Play Services is available for API levels &lt;= 22. This is an optional dependency that helps with more reliable and performant background processing on older API versions. If your app uses Google Play Services, add this dependency to your gradle file to automatically get GCMNetworkManager support. If Play Services is not available, WorkManager will continue to fall back to AlarmManager on older devices.</p> <h3 id="2.2.0-rc01" data-text="Version 2.2.0-rc01" tabindex="-1">Version 2.2.0-rc01</h3> <p>July 30, 2019</p> <p><code translate="no" dir="ltr">androidx.work:work-*:2.2.0-rc01</code> is released. The commits included in this version can be found <a href="https://android.googlesource.com/platform/frameworks/support/+log/57828f2feae3e65ae15c1cd8acd4f56af451ce5e..cb0c2f6acf089f2ad79726ab04dc2a56335999e4/work">here</a>.</p> <p><strong>Bug fixes</strong></p> <ul> <li>Fixed a bug in the AlarmManager implementation that causes the Service to shutdown prematurely and resulting in a <code translate="no" dir="ltr">RejectedExecutionException</code> in rare cases. (<a href="https://android-review.googlesource.com/1092374">aosp/1092374</a>) (<a href="https://issuetracker.google.com/138238197">b/138238197</a>).</li> <li>Added a workaround for a <code translate="no" dir="ltr">NullPointerException</code> when using <code translate="no" dir="ltr">JobScheduler</code> APIs on some devices. (<a href="https://android-review.googlesource.com/1091020">aosp/1091020</a>) (<a href="https://issuetracker.google.com/138364061">b/138364061</a>), (<a href="https://issuetracker.google.com/138441699">b/138441699</a>)</li> </ul> <h3 id="2.2.0-beta02" data-text="Version 2.2.0-beta02" tabindex="-1">Version 2.2.0-beta02</h3> <p>July 19, 2019</p> <p><code translate="no" dir="ltr">androidx.work:work-*:2.2.0-beta02</code> is released. The commits included in this version can be found <a href="https://android.googlesource.com/platform/frameworks/support/+log/32988b2236646245cde4cd158dedbf8c6b2fd0c2..57828f2feae3e65ae15c1cd8acd4f56af451ce5e/work">here</a>.</p> <p><strong>Bug fixes</strong></p> <ul> <li>Removed unintentional jacoco dependency that was introduced in <code translate="no" dir="ltr">2.2.0-beta01</code>.</li> </ul> <h3 id="2.2.0-beta01" data-text="Version 2.2.0-beta01" tabindex="-1">Version 2.2.0-beta01</h3> <p>July 17, 2019</p> <p><code translate="no" dir="ltr">androidx.work:work-*:2.2.0-beta01</code> is released. The commits included in this version can be found <a href="https://android.googlesource.com/platform/frameworks/support/+log/41741982b76f2249a5fc71f2b2fa86aed5e6b6df..32988b2236646245cde4cd158dedbf8c6b2fd0c2/work">here</a>.</p> <aside class="caution"><strong>Caution:</strong><span> This version contains an unintentional dependency on <code translate="no" dir="ltr">org.jacoco:org.jacoco.agent:0.8.3</code>, which can cause a build failure. Please update to the latest version, in which this dependency has been removed.</span></aside> <p><strong>New features</strong></p> <ul> <li><code translate="no" dir="ltr">androidx.work:work-gcm:2.2.0-beta01</code> is a new Maven artifact which supports the use of GCMNetworkManager as a scheduler when Google Play Services is available for API levels &lt;= 22. This is an <em>optional</em> dependency that helps with more reliable and performant background processing on older API versions. If your app uses Google Play Services, add this dependency to your gradle file to automatically get GCMNetworkManager support. If Play Services is not available, WorkManager will continue to fall back to AlarmManager on older devices.</li> </ul> <p><strong>Bug fixes</strong></p> <ul> <li>Fix for <code translate="no" dir="ltr">IllegalArgumentException</code> when tracking network state on Nvidia Shield K1 tablets. (<a href="https://android-review.googlesource.com/1010188">aosp/1010188</a>)</li> </ul> <h2 id="version_210_5" data-text="Version 2.1.0" tabindex="-1">Version 2.1.0</h2> <h3 id="2.1.0" data-text="Version 2.1.0" tabindex="-1">Version 2.1.0</h3> <p>July 11, 2019</p> <p><code translate="no" dir="ltr">androidx.work:work-*:2.1.0</code> is released. This release is identical to <code translate="no" dir="ltr">androidx.work:work-*:2.1.0-rc01</code>.</p> <p><strong>Important changes since 2.0.1</strong></p> <ul> <li><code translate="no" dir="ltr">work-runtime-ktx</code> now requires Java 8. If you run into any issues, you can add the following to your <code translate="no" dir="ltr">build.gradle</code>: <code translate="no" dir="ltr">kotlinOptions { jvmTarget = &quot;1.8&quot; }</code></li> <li>Added on-demand initialization for WorkManager, which will create WorkManager only when referenced. <a href="https://issuetracker.google.com/127497100">b/127497100</a> To set up your project for on-demand initialization: <ol> <li><a href="/topic/libraries/architecture/workmanager/advanced/custom-configuration#remove-default">Disable the automatic initializer</a>.</li> <li>Implement <code translate="no" dir="ltr">Configuration.Provider</code> on your custom <code translate="no" dir="ltr">Application</code> object.</li> <li>Change all references of <code translate="no" dir="ltr">WorkManager.getInstance()</code> to <code translate="no" dir="ltr">WorkManager.getInstance(Context)</code>. As part of this change, we have deprecated <code translate="no" dir="ltr">WorkManager.getInstance()</code>. It is always safer to call the new <code translate="no" dir="ltr">WorkManager.getInstance(Context)</code> replacement, even if you&#39;re not doing on-demand initialization.</li> </ol></li> <li><code translate="no" dir="ltr">PeriodicWorkRequest</code>s now support initial delays. You can use the <code translate="no" dir="ltr">setInitialDelay</code> method on <code translate="no" dir="ltr">PeriodicWorkRequest.Builder</code> to set an initial delay. <a href="https://issuetracker.google.com/111404867">b/111404867</a></li> <li>Added the ability to delegate to one or more registered <code translate="no" dir="ltr">WorkerFactory</code>s using <code translate="no" dir="ltr">DelegatingWorkerFactory</code>. <a href="https://issuetracker.google.com/131435993">b/131435993</a></li> <li>Added the ability to customize the <code translate="no" dir="ltr">Executor</code> used by WorkManager for all its internal book-keeping via <code translate="no" dir="ltr">Configuration.Builder.setTaskExecutor</code>.</li> <li>Added the ability to create unit testable <code translate="no" dir="ltr">Worker</code> and <code translate="no" dir="ltr">ListenableWorker</code> classes by using <code translate="no" dir="ltr">TestWorkerBuilder</code> and <code translate="no" dir="ltr">TestListenableWorkerBuilder</code> in the <code translate="no" dir="ltr">work-testing</code> artifact. <ul> <li>Note that <code translate="no" dir="ltr">work-testing</code> now pulls in Kotlin as a dependency and includes several Kotlin extensions by default.</li> </ul></li> <li>Added run attempt count to <code translate="no" dir="ltr">WorkInfo</code>. <a href="https://issuetracker.google.com/127290461">b/127290461</a></li> <li><code translate="no" dir="ltr">Data</code> types can now store and retrieve bytes and byte arrays. This does NOT change the maximum size of <code translate="no" dir="ltr">Data</code> objects.</li> <li>WorkManager now depends on <code translate="no" dir="ltr">Room 2.1.0</code>, which should fix some database issues.</li> </ul> <h3 id="2.1.0-rc01" data-text="Version 2.1.0-rc01" tabindex="-1">Version 2.1.0-rc01</h3> <p>June 27, 2019</p> <p><code translate="no" dir="ltr">androidx.work:work-*:2.1.0-rc01</code> is released. The commits included in this version can be found <a href="https://android.googlesource.com/platform/frameworks/support/+log/0dfc7dae1875b1c0463d279bf6fd557447b99caf..5f859f4f6909b055eac53ac7fe918a9f65e489c5/work">here</a>.</p> <p><strong>Bug fixes</strong></p> <ul> <li>Fixed a bug which would cause an application to crash when executing jobs with <code translate="no" dir="ltr">JobScheduler</code> while a backup was in progress <a href="https://issuetracker.google.com/135858602">b/135858602</a>.</li> </ul> <h3 id="2.1.0-beta02" data-text="Version 2.1.0-beta02" tabindex="-1">Version 2.1.0-beta02</h3> <p>June 20, 2019</p> <p><code translate="no" dir="ltr">androidx.work:work-*:2.1.0-beta02</code> is released. The commits included in this version can be found <a href="https://android.googlesource.com/platform/frameworks/support/+log/3aa279901a440d8a3a16c07c7e49361991097939..eae198ee097b359f70989d2c5c0f5ff6f6b72ead/work">here</a>.</p> <aside class="note"><strong>Note:</strong><span> This version is dependent on the Java 8 programming language. Please read <a href="/studio/write/java8-support">Use Java 8 language features</a> to learn how to use it in your project.</span></aside> <p><strong>Bug fixes</strong></p> <ul> <li><code translate="no" dir="ltr">TestListenableWorkerBuilder</code> now uses the correct <code translate="no" dir="ltr">WorkerFactory</code> when creating instances of <code translate="no" dir="ltr">ListenableWorker</code>. <a href="https://issuetracker.google.com/135275844">b/135275844</a></li> <li>Fixed a bug which caused drifts in the execution windows for <code translate="no" dir="ltr">WorkRequest</code>s due to process death. <a href="https://issuetracker.google.com/135272196">b/135272196</a></li> </ul> <h3 id="2.1.0-beta01" data-text="Version 2.1.0-beta01" tabindex="-1">Version 2.1.0-beta01</h3> <p>June 13, 2019</p> <p><code translate="no" dir="ltr">androidx.work:work-*:2.1.0-beta01</code> is released. The commits included in this version can be found <a href="https://android.googlesource.com/platform/frameworks/support/+log/5243b462794554b6dcc3f51793c5ef22531bb6ec..3aa279901a440d8a3a16c07c7e49361991097939/work">here</a>.</p> <aside class="note"><strong>Note:</strong><span> This version is dependent on the Java 8 programming language. Please read <a href="/studio/write/java8-support">Use Java 8 language features</a> to learn how to use it in your project.</span></aside> <p><strong>Bug fixes</strong></p> <ul> <li>WorkManager now depends on <code translate="no" dir="ltr">Room 2.1.0</code>, which should fix some database issues.</li> <li>Removed some startup disk I/O on the main thread.</li> <li>Fixed a potential deadlock in constraint tracking. <a href="https://issuetracker.google.com/134361006">b/134361006</a></li> <li>Preemptively cancelled invalid jobs attributed to WorkManager. <a href="https://issuetracker.google.com/134058261">b/134058261</a></li> <li>Added some defensive calls to JobScheduler APIs for misbehaving devices.</li> </ul> <h3 id="2.1.0-alpha03" data-text="Version 2.1.0-alpha03" tabindex="-1">Version 2.1.0-alpha03</h3> <p>June 5, 2019</p> <p><code translate="no" dir="ltr">androidx.work:*:2.1.0-alpha03</code> is released.</p> <p><strong>Bug fixes</strong></p> <ul> <li>Improved documentation for <code translate="no" dir="ltr">PeriodicWorkRequest</code>s.</li> <li><code translate="no" dir="ltr">WorkManagerTestInitHelper</code> now uses the correct background executor for tests.</li> <li>Fixes for SQLite issues when dealing with large transactions on some devices. (<a href="https://issuetracker.google.com/130182503">b/130182503</a>)</li> <li>WorkManager’s dependencies are now more granular. (<a href="https://issuetracker.google.com/133169148">b/133169148</a>).</li> <li>Workaround OEM specific bugs in the implementation of <code translate="no" dir="ltr">JobScheduler</code> when scheduling jobs using WorkManager. </li> <li>Improvements in the AlarmManager based scheduler around service lifetimes that previously caused rare crashes. (<a href="https://issuetracker.google.com/133313734">b/133313734</a>)</li> </ul> <h3 id="2.1.0-alpha02" data-text="Version 2.1.0-alpha02" tabindex="-1">Version 2.1.0-alpha02</h3> <p>May 16, 2019</p> <p>WorkManager 2.1.0-alpha02 is released. This version contains several new APIs.</p> <p><strong>API Changes</strong></p> <ul> <li><p><code translate="no" dir="ltr">PeriodicWorkRequest</code>s now support initial delays. You can use the <code translate="no" dir="ltr">setInitialDelay</code> method on <code translate="no" dir="ltr">PeriodicWorkRequest.Builder</code> to set an initial delay. <a href="https://issuetracker.google.com/111404867">b/111404867</a></p></li> <li><p>Added the ability to delegate to one or more registered <code translate="no" dir="ltr">WorkerFactory</code>s using <code translate="no" dir="ltr">DelegatingWorkerFactory</code>. <a href="https://issuetracker.google.com/131435993">b/131435993</a></p></li> <li><p>Added the ability to customize the <code translate="no" dir="ltr">Executor</code> used by WorkManager for all its internal book-keeping via <code translate="no" dir="ltr">Configuration.Builder.setTaskExecutor</code>.</p></li> <li><p>Improved documentation around <code translate="no" dir="ltr">WorkRequest.keepResultsForAtLeast</code> (<a href="https://issuetracker.google.com/130638001">b/130638001</a>), on-demand initialization, and <code translate="no" dir="ltr">PeriodicWorkRequest.Builder</code> (<a href="https://issuetracker.google.com/131711394">b/131711394</a>).</p></li> </ul> <h3 id="2.1.0-alpha01" data-text="Version 2.1.0-alpha01" tabindex="-1">Version 2.1.0-alpha01</h3> <p>April 24, 2019</p> <p>WorkManager 2.1.0-alpha01 is released. This version contains several new APIs. Please note that starting with this version, there will be new features that won&#39;t get backported to the 1.x release. We recommend switching to 2.x.</p> <p><strong>API Changes</strong></p> <ul> <li>Added on-demand initialization for WorkManager, which will create WorkManager only when referenced. <a href="https://issuetracker.google.com/127497100">b/127497100</a> To set up your project for on-demand initialization: <ol> <li><a href="/topic/libraries/architecture/workmanager/advanced/custom-configuration#removing_the_default_initializer">Disable the automatic initializer</a>.</li> <li>Implement <code translate="no" dir="ltr">Configuration.Provider</code> on your custom <code translate="no" dir="ltr">Application</code> object.</li> <li>Change all references of <code translate="no" dir="ltr">WorkManager.getInstance()</code> to <code translate="no" dir="ltr">WorkManager.getInstance(Context)</code>. As part of this change, we have deprecated <code translate="no" dir="ltr">WorkManager.getInstance()</code>. It is always safer to call the new <code translate="no" dir="ltr">WorkManager.getInstance(Context)</code> replacement, even if you&#39;re not doing on-demand initialization.</li> </ol></li> <li>Added the ability to create unit testable <code translate="no" dir="ltr">Worker</code> and <code translate="no" dir="ltr">ListenableWorker</code> classes by using <code translate="no" dir="ltr">TestWorkerBuilder</code> and <code translate="no" dir="ltr">TestListenableWorkerBuilder</code> in the <code translate="no" dir="ltr">work-testing</code> artifact. <ul> <li>Note that <code translate="no" dir="ltr">work-testing</code> now pulls in Kotlin as a dependency, but also includes several Kotlin extensions by default.</li> </ul></li> <li>Added run attempt count to <code translate="no" dir="ltr">WorkInfo</code>. <a href="https://issuetracker.google.com/127290461">b/127290461</a></li> <li><code translate="no" dir="ltr">Data</code> types can now store and retrieve bytes and byte arrays. This does NOT change the maximum size of <code translate="no" dir="ltr">Data</code> objects.</li> <li>Deprecated <code translate="no" dir="ltr">CoroutineWorker.coroutineContext</code>. This field was incorrectly typed as a <code translate="no" dir="ltr">CoroutineDispatcher</code>; you should no longer need it as you can go to the desired coroutineContext yourself in the body of the suspending function.</li> <li><code translate="no" dir="ltr">RxWorker.createWork()</code> and <code translate="no" dir="ltr">RxWorker.getBackgroundScheduler()</code> are now annotated with <code translate="no" dir="ltr">@NonNull</code> return types.</li> </ul> <h2 id="version_201_3" data-text="Version 2.0.1" tabindex="-1">Version 2.0.1</h2> <h3 id="2.0.1" data-text="Version 2.0.1" tabindex="-1">Version 2.0.1</h3> <p>April 9, 2019</p> <p>WorkManager 2.0.1 is released. This release is identical to <a href="/jetpack/androidx/releases/work#2.0.1-rc01">2.0.1-rc01</a>.</p> <h3 id="2.0.1-rc01" data-text="Version 2.0.1-rc01" tabindex="-1">Version 2.0.1-rc01</h3> <p>April 3, 2019</p> <p>WorkManager 2.0.1-rc01 is released. This version contains some bug fixes. For legacy 1.x users, some of these changes also appear in <a href="#1.0.1-rc01">1.0.1-rc01</a>.</p> <p><strong>Bug Fixes</strong></p> <ul> <li>Robolectric tests now operate properly with WorkManager. <a href="https://issuetracker.google.com/122553577">b/122553577</a></li> <li>Fixed an edge case crash with constraints tracking not being cleaned up on pre-JobScheduler APIs. <a href="https://issuetracker.google.com/129226383">b/129226383</a></li> <li>Fixed a <code translate="no" dir="ltr">StackOverflowError</code> dealing with long chains of work. <a href="https://issuetracker.google.com/129091233">b/129091233</a></li> <li>Updated documentation for <code translate="no" dir="ltr">PeriodicWorkRequest</code>s to indicate that flex time is not supported on API 23.</li> <li>Fixed some broken links in the Kotlin documentation.</li> </ul> <h2 id="version_200_3" data-text="Version 2.0.0" tabindex="-1">Version 2.0.0</h2> <h3 id="2.0.0" data-text="Version 2.0.0" tabindex="-1">Version 2.0.0</h3> <p>March 20, 2019</p> <p>WorkManager 2.0.0 is released. This version is identical to 2.0.0-rc01 and is the AndroidX version of 1.0.0 stable with AndroidX dependencies. We recommend targeting this version instead of the legacy 1.x versions. All active development will target 2.x and 1.x will only receive critical bug fixes for a limited time.</p> <h3 id="2.0.0-rc01" data-text="Version 2.0.0-rc01" tabindex="-1">Version 2.0.0-rc01</h3> <p>March 7, 2019</p> <p>WorkManager 2.0.0-rc01 is released. This version is identical to 1.0.0 stable but has AndroidX dependencies. Once this reaches 2.0.0 stable, you should include this version and the legacy 1.x versions will only receive some critical bug fixes. All active development will target 2.x.</p> <h2 id="pre-androidx-deps" data-text="Pre-AndroidX Dependencies" tabindex="-1">Pre-AndroidX Dependencies</h2> <div> For information on using Kotlin extensions, see the <a href="/kotlin/ktx">KTX documentation</a>.<br> Reference docs: <a href="/reference/androidx/work/package-summary">Java</a> <div> <div class="ds-selector-tabs"><section><h3 id="groovy" data-text="Groovy" tabindex="-1">Groovy</h3> <pre class="prettyprint lang-groovy" translate="no" dir="ltr"> dependencies { def work_version = "1.0.1" // (Java only) implementation "android.arch.work:work-runtime:$work_version" // Kotlin + coroutines implementation "android.arch.work:work-runtime-ktx:$work_version" // optional - RxJava2 support implementation "android.arch.work:work-rxjava2:$work_version" // optional - Test helpers androidTestImplementation "android.arch.work:work-testing:$work_version" } </pre> </section><section><h3 id="kts" data-text="Kotlin" tabindex="-1">Kotlin</h3> <pre class="prettyprint lang-kotlin" translate="no" dir="ltr"> dependencies { val work_version = "1.0.1" // (Java only) implementation("android.arch.work:work-runtime:$work_version") // Kotlin + coroutines implementation("android.arch.work:work-runtime-ktx:$work_version") // optional - RxJava2 support implementation("android.arch.work:work-rxjava2:$work_version") // optional - Test helpers androidTestImplementation("android.arch.work:work-testing:$work_version") } </pre> </section></div> </div> </div> <aside class="note"><strong>Note:</strong><span> WorkManager classes are already in the androidx.work package, but currently depend on non-AndroidX dependencies including the Support Library 27.1 and associated Arch component versions. A version of WorkManager with AndroidX dependencies will be released in the future.</span></aside> <h2 id="version_101_3" data-text="Version 1.0.1" tabindex="-1">Version 1.0.1</h2> <h3 id="1.0.1" data-text="Version 1.0.1" tabindex="-1">Version 1.0.1</h3> <p>April 9, 2019</p> <p>WorkManager 1.0.1 is released. This release is identical to <a href="/jetpack/androidx/releases/work#1.0.1-rc01">1.0.1-rc01</a>.</p> <p>Please note that we <em>strongly</em> encourage users to update to WorkManager 2.x, as there will be very few updates to the 1.x branch moving forward. New APIs will also not be released for the 1.x library.</p> <h3 id="1.0.1-rc01" data-text="Version 1.0.1-rc01" tabindex="-1">Version 1.0.1-rc01</h3> <p>April 2, 2019</p> <p>WorkManager 1.0.1-rc01 is released. This version contains some bug fixes.</p> <p><strong>Bug Fixes</strong></p> <ul> <li>Robolectric tests now operate properly with WorkManager. <a href="https://issuetracker.google.com/122553577">b/122553577</a></li> <li>Fixed an edge case crash with constraints tracking not being cleaned up on pre-JobScheduler APIs. <a href="https://issuetracker.google.com/129226383">b/129226383</a></li> <li>Fixed a <code translate="no" dir="ltr">StackOverflowError</code> dealing with long chains of work. <a href="https://issuetracker.google.com/129091233">b/129091233</a></li> </ul> <h2 id="version_100_3" data-text="Version 1.0.0" tabindex="-1">Version 1.0.0</h2> <h3 id="1.0.0" data-text="Version 1.0.0" tabindex="-1">Version 1.0.0</h3> <p>March 05, 2019</p> <p>This is WorkManager&#39;s 1.0.0 stable release. This version of WorkManager is identical to 1.0.0-rc02.</p> <h3 id="1.0.0-rc02" data-text="Version 1.0.0-rc02" tabindex="-1">Version 1.0.0-rc02</h3> <p>February 21, 2019</p> <p>This is the second release candidate for WorkManager&#39;s 1.0.0 stable release. This release contains two bug fixes.</p> <p><strong>Bug Fixes</strong></p> <ul> <li><p><code translate="no" dir="ltr">Worker</code>s are now correctly scheduled after an application crash. <a href="https://issuetracker.google.com/124546316">b/124546316</a></p></li> <li><p><code translate="no" dir="ltr">Worker</code>s that throw an unchecked <code translate="no" dir="ltr">Exception</code> are now correctly marked as <code translate="no" dir="ltr">FAILED</code> and no longer crash the app process.</p></li> </ul> <h3 id="1.0.0-rc01" data-text="Version 1.0.0-rc01" tabindex="-1">Version 1.0.0-rc01</h3> <p>February 14, 2019</p> <p>This is a release candidate for WorkManager&#39;s 1.0.0 stable release. This release contains one bug fix.</p> <p><strong>Bug Fixes</strong></p> <ul> <li>The AlarmManager based implementation now correctly respects <code translate="no" dir="ltr">flex</code> windows for PeriodicWorkRequests. <a href="https://issuetracker.google.com/124274584">b/124274584</a></li> </ul> <h3 id="1.0.0-beta05" data-text="Version 1.0.0-beta05" tabindex="-1">Version 1.0.0-beta05</h3> <p>February 6, 2019</p> <p>This release contains some bug fixes.</p> <p><strong>Bug Fixes</strong></p> <ul> <li>Fixed a case where <code translate="no" dir="ltr">JobScheduler.getPendingJob(...)</code> was used on API 23. <a href="https://issuetracker.google.com/123893059">b/123893059</a></li> <li>Fixed a <code translate="no" dir="ltr">NullPointerException</code> on devices running Android 5.1 (API level 22) or lower. <a href="https://issuetracker.google.com/123835104">b/123835104</a></li> </ul> <h3 id="1.0.0-beta04" data-text="Version 1.0.0-beta04" tabindex="-1">Version 1.0.0-beta04</h3> <p>February 4, 2019</p> <p>This release contains some bug fixes.</p> <p><strong>Bug Fixes</strong></p> <ul> <li>Improved scheduling of PeriodicWork for the AlarmManager based implementation.</li> <li>Fixed a case where WorkManager failed to correctly track constraints when using the AlarmManager based implementation. <a href="https://issuetracker.google.com/123379508">b/123379508</a></li> <li>Fixed a case when WorkManager failed to retry work on process death when using the AlarmManager based implementation. <a href="https://issuetracker.google.com/123329850">b/123329850</a></li> <li>Fixed a case which would cause WorkManager to leak Wakelocks when using the AlarmManager based implementation.</li> </ul> <h3 id="1.0.0-beta03" data-text="Version 1.0.0-beta03" tabindex="-1">Version 1.0.0-beta03</h3> <p>January 25, 2019</p> <p>This release contains some bug fixes.</p> <p><strong>Bug Fixes</strong></p> <ul> <li>We introduced a regression <code translate="no" dir="ltr">1.0.0-beta02</code> that was causing work to not execute properly in some situations. <a href="https://issuetracker.google.com/123211993">b/123211993</a></li> <li>Fixed a case where work wasn&#39;t properly honoring backoff timing. <a href="https://issuetracker.google.com/122881597">b/122881597</a></li> <li>Fixed a <code translate="no" dir="ltr">ConcurrentModificationException</code> on devices running Android 5.1 (API or) or lower. This is a continuation of the fix in <code translate="no" dir="ltr">1.0.0-beta02</code>. <a href="https://issuetracker.google.com/121345393">b/121345393</a></li> <li>Added <code translate="no" dir="ltr">exported=false</code> for some components in our manifest that were missing this annotation.</li> <li>Included information about how WorkManager interacts with the OS in the package-level documentation.</li> </ul> <h3 id="1.0.0-beta02" data-text="Version 1.0.0-beta02" tabindex="-1">Version 1.0.0-beta02</h3> <p>January 15, 2019</p> <p>This release contains some bug fixes.</p> <p><strong>Bug Fixes</strong></p> <ul> <li>Fixed an edge case where periodic work could run more than once per interval on devices running Android 6.0 (API level 23). <a href="https://issuetracker.google.com/121998363">b/121998363</a></li> <li>Fixed a <code translate="no" dir="ltr">ConcurrentModificationException</code> on devices running Android 5.1 (API level 22) or lower. <a href="https://issuetracker.google.com/121345393">b/121345393</a></li> <li>Fixed erroneous execution of work when Constraints aren&#39;t met on devices running Android 5.1 (API level 22) or lower. <a href="https://issuetracker.google.com/122578012">b/122578012</a></li> <li>Optimized work completion handling to be faster in some edge cases. <a href="https://issuetracker.google.com/122358129">b/122358129</a></li> <li>Added a change to address potential race conditions among multiple instances of <code translate="no" dir="ltr">LiveData</code> that WorkManager uses.</li> <li>Moved to use <code translate="no" dir="ltr">Room</code> dependency <code translate="no" dir="ltr">1.1.1</code> instead of <code translate="no" dir="ltr">1.1.1-rc01</code>; these versions are identical. <a href="https://issuetracker.google.com/122578011">b/122578011</a></li> </ul> <h3 id="1.0.0-beta01" data-text="Version 1.0.0-beta01" tabindex="-1">Version 1.0.0-beta01</h3> <p>December 19, 2018</p> <p>This release contains no API changes; moving forward, WorkManager is expected to stay API stable until the next version unless there is a critical problem. This release contains some bug fixes.</p> <p><strong>Bug Fixes</strong></p> <ul> <li>Previously-cancelled children of successfully completed parent work will no longer run. <a href="https://issuetracker.google.com/120811767">b/120811767</a></li> <li>Properly initialized logging classes (primarily surfaced during tests).</li> </ul> <h3 id="1.0.0-alpha13" data-text="Version 1.0.0-alpha13" tabindex="-1">Version 1.0.0-alpha13</h3> <p>December 12, 2018</p> <p>This release contains a minor API change that will be helpful for some Kotlin users.</p> <p><strong>API Changes</strong></p> <ul> <li><code translate="no" dir="ltr">androidx.work.Result</code> has been moved to be an inner class of <code translate="no" dir="ltr">ListenableWorker</code>. This prevents refactoring conflicts with Kotlin&#39;s top-level <code translate="no" dir="ltr">Result</code> class. <em>This is a breaking API change.</em> <a href="https://issuetracker.google.com/120564418">b/120564418</a></li> </ul> <p><strong>Breaking API Changes</strong></p> <ul> <li><code translate="no" dir="ltr">androidx.work.Result</code> has been moved to be an inner class of <code translate="no" dir="ltr">ListenableWorker</code>.</li> </ul> <h3 id="1.0.0-alpha12" data-text="Version 1.0.0-alpha12" tabindex="-1">Version 1.0.0-alpha12</h3> <p>December 5, 2018</p> <p>This release contains some breaking API changes; please see the <em>Breaking API Changes</em> section below. This version is likely to be released as our first beta. <code translate="no" dir="ltr">alpha12</code> also contains extensive documentation updates.</p> <p><strong>API Changes</strong></p> <ul> <li>A new artifact, <code translate="no" dir="ltr">work-rxjava2</code>, introduces <code translate="no" dir="ltr">RxWorker</code>. This is a <code translate="no" dir="ltr">ListenableWorker</code> that expects a <code translate="no" dir="ltr">Single&lt;Payload&gt;</code>.</li> <li>Support for Firebase JobDispatcher has been removed because of its impending deprecation. This means that the <code translate="no" dir="ltr">work-firebase</code> artifact will no longer be updated as we head into beta. We will be looking into adding an alternative in the future.</li> <li>Combined <code translate="no" dir="ltr">Payload</code> into <code translate="no" dir="ltr">Result</code>. <code translate="no" dir="ltr">Result</code> is now a &quot;sealed class&quot; with three concrete implementations, which you can obtain via <code translate="no" dir="ltr">Result.success()</code> (or <code translate="no" dir="ltr">Result.success(Data)</code>), <code translate="no" dir="ltr">Result.failure()</code> (or <code translate="no" dir="ltr">Result.failure(Data)</code>), and <code translate="no" dir="ltr">Result.retry()</code>. Your <code translate="no" dir="ltr">ListenableFuture</code>s now result <code translate="no" dir="ltr">Result</code> instead of <code translate="no" dir="ltr">Payload</code>. <code translate="no" dir="ltr">Worker</code>s don&#39;t have getter and setter methods for output <code translate="no" dir="ltr">Data</code>. <em>This is a breaking change.</em></li> <li>Added <code translate="no" dir="ltr">Constraints.Builder.setTriggerContentMaxDelay(long, TimeUnit)</code> and <code translate="no" dir="ltr">Constraints.Builder.setTriggerContentUpdateDelay(long, TimeUnit)</code> and variants to better support slow triggering content URIs. <a href="https://issuetracker.google.com/119919774">b/119919774</a></li> <li>Added <code translate="no" dir="ltr">WorkRequest.Builder.setBackoffCriteria(BackoffPolicy, Duration)</code> variant. This method requires API 26.</li> <li>Added <code translate="no" dir="ltr">Operation.await()</code> and <code translate="no" dir="ltr">ListenableFuture.await()</code> Kotlin extension methods.</li> <li>Renamed <code translate="no" dir="ltr">Operation.getException()</code> to <code translate="no" dir="ltr">Operation.getThrowable()</code>. <em>This is a breaking change.</em></li> <li>The <code translate="no" dir="ltr">ContentUriTriggers</code> class and methods referencing it are no longer available for public usage. <em>This is a breaking change.</em></li> <li>Removed the rest of the varargs methods in <code translate="no" dir="ltr">WorkManager</code>, <code translate="no" dir="ltr">WorkContinuation</code>, and <code translate="no" dir="ltr">OneTimeWorkRequest</code> to streamline the API. To fix any build problems, you can wrap your existing varargs with <code translate="no" dir="ltr">Arrays.asList(...)</code>. We still include single-argument versions of each method. <em>This is a breaking change.</em></li> <li>Removed <code translate="no" dir="ltr">WorkContinuation.combine(OneTimeWorkRequest, *)</code> variants. They were presenting a confusing API; the existing <code translate="no" dir="ltr">combine</code> methods are more understandable. <em>This is a breaking change.</em></li> </ul> <p><strong>Bug Fixes</strong></p> <ul> <li>Pre-Marshmallow implementations are now more reliable in recovering from process death of an already-executing task.</li> <li><code translate="no" dir="ltr">LiveData</code> that is observed via <code translate="no" dir="ltr">observeForever</code> is tracked via WorkManager. This is a backport of a Room library fix. <a href="https://issuetracker.google.com/74477406">b/74477406</a></li> <li><code translate="no" dir="ltr">Data.Builder.build()</code> now throws an exception if the serialized object exceeds its maximum size. This previously would only happen on a background thread where you couldn&#39;t properly handle it.</li> <li>Further distinguished stopped vs. cancelled work; <code translate="no" dir="ltr">getWorkInfoById()</code> will return a <code translate="no" dir="ltr">WorkInfo</code> with the <code translate="no" dir="ltr">CANCELLED</code> <code translate="no" dir="ltr">State</code> during <code translate="no" dir="ltr">ListenableWorker.onStopped()</code>.</li> <li>Treat <code translate="no" dir="ltr">null</code> <code translate="no" dir="ltr">Result</code>s as failures in <code translate="no" dir="ltr">ListenableWorker</code>. <a href="https://issuetracker.google.com/120362353">b/120362353</a></li> <li>Speculative fix for Shield Tablets running API 24 that sometimes threw an <code translate="no" dir="ltr">IllegalArgumentException</code>. <a href="https://issuetracker.google.com/119484416">b/119484416</a></li> </ul> <p><strong>Breaking API Changes</strong></p> <ul> <li>Support for Firebase JobDispatcher has been removed because of its impending deprecation. This means that the <code translate="no" dir="ltr">work-firebase</code> artifact will no longer be updated as we head into beta. We will be looking into adding an alternative in the future.</li> <li>Combined <code translate="no" dir="ltr">Payload</code> into <code translate="no" dir="ltr">Result</code>. <code translate="no" dir="ltr">Result</code> is now a &quot;sealed class&quot; with three concrete implementations, which you can obtain via <code translate="no" dir="ltr">Result.success()</code> (or <code translate="no" dir="ltr">Result.success(Data)</code>), <code translate="no" dir="ltr">Result.failure()</code> (or <code translate="no" dir="ltr">Result.failure(Data)</code>), and <code translate="no" dir="ltr">Result.retry()</code>. Your <code translate="no" dir="ltr">ListenableFuture</code>s now result <code translate="no" dir="ltr">Result</code> instead of <code translate="no" dir="ltr">Payload</code>. <code translate="no" dir="ltr">Worker</code>s don&#39;t have getter and setter methods for output <code translate="no" dir="ltr">Data</code>.</li> <li>Added <code translate="no" dir="ltr">Operation.await()</code> and <code translate="no" dir="ltr">ListenableFuture.await()</code> Kotlin extension methods.</li> <li>Renamed <code translate="no" dir="ltr">Operation.getException()</code> to <code translate="no" dir="ltr">Operation.getThrowable()</code>.</li> <li>The <code translate="no" dir="ltr">ContentUriTriggers</code> class and methods referencing it are no longer available for public usage.</li> <li>Removed the rest of the varargs methods in <code translate="no" dir="ltr">WorkManager</code>, <code translate="no" dir="ltr">WorkContinuation</code>, and <code translate="no" dir="ltr">OneTimeWorkRequest</code> to streamline the API. To fix any build problems, you can wrap your existing varargs with <code translate="no" dir="ltr">Arrays.asList(...)</code>. We still include single-argument versions of each method.</li> <li>Removed <code translate="no" dir="ltr">WorkContinuation.combine(OneTimeWorkRequest, *)</code> variants. They were presenting a confusing API; the existing <code translate="no" dir="ltr">combine</code> methods are more understandable.</li> </ul> <h3 id="1.0.0-alpha11" data-text="Version 1.0.0-alpha11" tabindex="-1">Version 1.0.0-alpha11</h3> <p>November 8, 2018</p> <p>This release contains many changes that will become stable API at <code translate="no" dir="ltr">beta</code>. There are breaking API changes in this release; please see the <em>Breaking API Changes</em> section below.</p> <p><strong>API Changes</strong></p> <ul> <li><code translate="no" dir="ltr">work-runtime-ktx</code> introduces a new <code translate="no" dir="ltr">CoroutineWorker</code>.</li> <li><code translate="no" dir="ltr">WorkStatus</code> has been renamed to <code translate="no" dir="ltr">WorkInfo</code>. All corresponding <code translate="no" dir="ltr">getStatus</code> method variants have been renamed to the corresponding <code translate="no" dir="ltr">getWorkInfo</code> variants. <em>This is a breaking change.</em></li> <li><code translate="no" dir="ltr">ListenableWorker.onStopped()</code> no longer accepts has a boolean argument representing if the <code translate="no" dir="ltr">WorkRequest</code> was cancelled. <code translate="no" dir="ltr">WorkManager</code> no longer makes this distinction. <em>This is a breaking change.</em></li> <li><code translate="no" dir="ltr">androidx.work.test</code> package has been renamed to <code translate="no" dir="ltr">androidx.work.testing</code> package. <em>This is a breaking change.</em></li> <li>Setters on <code translate="no" dir="ltr">Constraints</code> are no longer a part of the public API. <em>This is a breaking change.</em></li> <li><code translate="no" dir="ltr">WorkerParameters.getTriggeredContentUris()</code> and <code translate="no" dir="ltr">WorkerParameters.getTriggeredContentAuthorities()</code> previously returned arrays. Now these methods return Collections. <em>This is a breaking change.</em></li> <li><code translate="no" dir="ltr">ListenableWorker.onStartWork()</code> is renamed to <code translate="no" dir="ltr">ListenableWorker.startWork()</code>. <em>This is a breaking change.</em></li> <li>The constructor for <code translate="no" dir="ltr">WorkStatus</code> is no longer a part of the public API. <em>This is a breaking change.</em></li> <li><code translate="no" dir="ltr">Configuration.getMaxJobSchedulerID()</code> and <code translate="no" dir="ltr">Configuration.getMinJobSchedulerID()</code> are renamed to <code translate="no" dir="ltr">Configuration.getMinJobSchedulerId()</code> and <code translate="no" dir="ltr">Configuration.getMaxJobSchedulerId()</code> respectively. <em>This is a breaking change.</em></li> <li>Added a lot of <code translate="no" dir="ltr">@NonNull</code> annotations to the public API to improve ergonomics of the API.</li> <li>Add <code translate="no" dir="ltr">WorkManager.enqueueUniqueWork()</code> API to enqueue unique <code translate="no" dir="ltr">OneTimeWorkRequest</code>s without having to create a <code translate="no" dir="ltr">WorkContinuation</code>.</li> <li>All variants of <code translate="no" dir="ltr">enqueue</code> and <code translate="no" dir="ltr">cancel</code> methods on <code translate="no" dir="ltr">WorkManager</code> now return a new <code translate="no" dir="ltr">Operation</code> type. <em>This is a breaking change.</em></li> <li>All variants of <code translate="no" dir="ltr">enqueue</code> no longer accept varargs for <code translate="no" dir="ltr">WorkRequest</code>s. <em>This is a breaking change.</em> Use Collections instead. You can use <code translate="no" dir="ltr">Arrays.asList()</code> to modify existing code. We did this to reduce the API surface and method count.</li> <li>Attempting to <code translate="no" dir="ltr">initialize</code> <code translate="no" dir="ltr">WorkManager</code> more than once per process will now result in an <code translate="no" dir="ltr">IllegalStateException</code>. <em>This is a breaking change.</em></li> </ul> <p><strong>Bug Fixes</strong></p> <ul> <li><code translate="no" dir="ltr">WorkRequest.Builder</code>s in the <code translate="no" dir="ltr">work-runtime-ktx</code> artifact now use <code translate="no" dir="ltr">ListenableWorker</code>s. Fixes <a href="https://issuetracker.google.com/issues/117666259">b/117666259</a></li> <li>Ensure the next run time for <code translate="no" dir="ltr">PeriodicWork</code> is in the future. Fixes <a href="https://issuetracker.google.com/issues/118204399">b/118204399</a></li> <li>Remove potential disk I/O when using WorkManager on app startup. Fixes <a href="https://issuetracker.google.com/issues/117796731">b/117796731</a></li> <li>Fix a race condition in <code translate="no" dir="ltr">WorkConstraintsTracker</code>. Fixes <a href="https://github.com/googlecodelabs/android-workmanager/issues/56">android-workmanager/issues/56</a></li> </ul> <p><strong>Breaking API Changes</strong></p> <ul> <li><code translate="no" dir="ltr">WorkStatus</code> has been renamed to <code translate="no" dir="ltr">WorkInfo</code>. All corresponding <code translate="no" dir="ltr">getStatus</code> method variants have been renamed to the corresponding <code translate="no" dir="ltr">getWorkInfo</code> variants.</li> <li><code translate="no" dir="ltr">ListenableWorker.onStopped()</code> no longer accepts has a boolean argument representing if the <code translate="no" dir="ltr">WorkRequest</code> was cancelled. <code translate="no" dir="ltr">WorkManager</code> no longer makes this distinction.</li> <li><code translate="no" dir="ltr">androidx.work.test</code> package has been renamed to <code translate="no" dir="ltr">androidx.work.testing</code> package.</li> <li>Setters on <code translate="no" dir="ltr">Constraints</code> are no longer a part of the public API.</li> <li><code translate="no" dir="ltr">WorkerParameters.getTriggeredContentUris()</code> and <code translate="no" dir="ltr">WorkerParameters.getTriggeredContentAuthorities()</code> previously returned arrays. Now these methods return Collections.</li> <li><code translate="no" dir="ltr">ListenableWorker.onStartWork()</code> is renamed to <code translate="no" dir="ltr">ListenableWorker.startWork()</code>.</li> <li>The constructor for <code translate="no" dir="ltr">WorkStatus</code> is no longer a part of the public API.</li> <li><code translate="no" dir="ltr">Configuration.getMaxJobSchedulerID()</code> and <code translate="no" dir="ltr">Configuration.getMinJobSchedulerID()</code> are renamed to <code translate="no" dir="ltr">Configuration.getMinJobSchedulerId()</code> and <code translate="no" dir="ltr">Configuration.getMaxJobSchedulerId()</code> respectively.</li> <li>All variants of<code translate="no" dir="ltr">enqueue</code> and <code translate="no" dir="ltr">cancel</code> methods on <code translate="no" dir="ltr">WorkManager</code> now return a new <code translate="no" dir="ltr">Operation</code> type.</li> <li>All variants of <code translate="no" dir="ltr">enqueue</code> no longer accept varargs for <code translate="no" dir="ltr">WorkRequest</code>s.</li> <li>Attempting to <code translate="no" dir="ltr">initialize</code> <code translate="no" dir="ltr">WorkManager</code> more than once per process will now result in an <code translate="no" dir="ltr">IllegalStateException</code>.</li> </ul> <h3 id="1.0.0-alpha10" data-text="Version 1.0.0-alpha10" tabindex="-1">Version 1.0.0-alpha10</h3> <p>October 11, 2018</p> <p>This release supports developer-controlled asynchronous work. There are breaking API changes in this release; please see the <em>Breaking API Changes</em> section below.</p> <p>We anticipate that WorkManager is entering the final phases of its alpha period. We expect to be API stable in beta, so please take some time to file your feedback on our issue tracker.</p> <p><strong>API Changes</strong></p> <ul> <li>Removed all previously <code translate="no" dir="ltr">deprecated</code> methods and classes, notably the default <code translate="no" dir="ltr">Worker</code> constructor. <em>This is a breaking API change.</em></li> <li>Renamed <code translate="no" dir="ltr">NonBlockingWorker</code> to <code translate="no" dir="ltr">ListenableWorker</code>, which is now an unhidden public class and ready for usage. <ul> <li><code translate="no" dir="ltr">ListenableWorker</code> provides access to one abstract method, <code translate="no" dir="ltr">ListenableFuture&lt;Payload&gt; onStartWork()</code> which is called on the main thread. It is up to you to start and process work asynchronously. When finished, you should update the <code translate="no" dir="ltr">ListenableFuture</code> appropriately. Reference implementations of <code translate="no" dir="ltr">ListenableFuture</code>s are provided in the <code translate="no" dir="ltr">Futures</code> package in <code translate="no" dir="ltr">alpha02</code> (see below the <code translate="no" dir="ltr">WorkManager</code> section).</li> <li><code translate="no" dir="ltr">Worker</code> extends <code translate="no" dir="ltr">ListenableWorker</code> and still operates as before, with an abstract <code translate="no" dir="ltr">Result doWork()</code> method.</li> <li>Shuffled some methods and members from <code translate="no" dir="ltr">Worker</code> to <code translate="no" dir="ltr">ListenableWorker</code>.</li> <li>We shall soon provide reference implementations for <code translate="no" dir="ltr">ListenableWorker</code>s that use Kotlin coroutines (once the stable versions are released) and RxJava2.</li> </ul></li> <li>The interface <code translate="no" dir="ltr">WorkerFactory</code> and the concrete implementation <code translate="no" dir="ltr">DefaultWorkerFactory</code> have been merged into an abstract class called <code translate="no" dir="ltr">WorkerFactory</code>. The implementation ensures that the default reflection-based behavior is called as a last-ditch effort for any user-created <code translate="no" dir="ltr">WorkerFactory</code> instances. <em>This is a breaking change.</em></li> <li>Removed <code translate="no" dir="ltr">WorkManager.synchronous()</code> and <code translate="no" dir="ltr">WorkContinuation.synchronous()</code> and all related methods. Added <code translate="no" dir="ltr">ListenableFuture&lt;Void&gt;</code> as the return type of many methods in the API. <em>This is a breaking API change.</em> <ul> <li>You can now synchronously get and observe by using <code translate="no" dir="ltr">ListenableFuture</code>s. For example, <code translate="no" dir="ltr">WorkManager.enqueue()</code> used to return <code translate="no" dir="ltr">void</code>; it now returns a <code translate="no" dir="ltr">ListenableFuture&lt;Void&gt;</code>. You can call <code translate="no" dir="ltr">ListenableFuture.addListener(Runnable, Executor)</code> or <code translate="no" dir="ltr">ListenableFuture.get()</code> to run code once the operation is complete.</li> <li>Note that these <code translate="no" dir="ltr">ListenableFuture</code>s do not tell you if the operation succeeded or failed; only that they finished. You will still need to chain WorkManager methods to find out this information.</li> <li>We ignore <code translate="no" dir="ltr">cancel()</code> calls on these objects, as they are confusing and hard to reason about (are you cancelling the operation or the resulting work?). This is within the <code translate="no" dir="ltr">Future</code>s contract.</li> <li>To maintain parity with the synchronous <code translate="no" dir="ltr">getStatus*</code> methods, we have provided <code translate="no" dir="ltr">ListenableFuture</code> variants, and renamed the existing ones that returned <code translate="no" dir="ltr">LiveData</code> to explicitly have &quot;LiveData&quot; as part of the name (for example, <code translate="no" dir="ltr">getStatusesByIdLiveData(UUID)</code>). <em>This is a breaking API change.</em></li> </ul></li> </ul> <p><strong>Bug Fixes</strong></p> <ul> <li>Fixed the known issue from alpha09 regarding duplicate <code translate="no" dir="ltr">androidx-annotations.pro</code> files. You may remove the workaround from the previous release notes by deleting <code translate="no" dir="ltr">exclude &#39;META-INF/proguard/androidx-annotations.pro&#39;</code> from your gradle file.</li> <li>Added proguard configurations to keep new <code translate="no" dir="ltr">Worker</code> constructor. <a href="https://issuetracker.google.com/116296569">b/116296569</a></li> <li>Fix potential <code translate="no" dir="ltr">NullPointerException</code> in a race condition where work was <code translate="no" dir="ltr">REPLACE</code>d. <a href="https://issuetracker.google.com/116253486">b/116253486</a> and <a href="https://issuetracker.google.com/116677275">b/116677275</a></li> <li><code translate="no" dir="ltr">WorkContinuation.combine()</code> now accepts one or more <code translate="no" dir="ltr">WorkContinuation</code>s instead of two or more. <a href="https://issuetracker.google.com/117266752">b/117266752</a></li> </ul> <p><strong>Breaking API Changes</strong></p> <ul> <li>Removed all previously <code translate="no" dir="ltr">deprecated</code> methods and classes, notably the default <code translate="no" dir="ltr">Worker</code> constructor.</li> <li>The interface <code translate="no" dir="ltr">WorkerFactory</code> and the concrete implementation <code translate="no" dir="ltr">DefaultWorkerFactory</code> have been merged into an abstract class called <code translate="no" dir="ltr">WorkerFactory</code>.</li> <li>Removed <code translate="no" dir="ltr">WorkManager.synchronous()</code> and <code translate="no" dir="ltr">WorkContinuation.synchronous()</code>.</li> <li><code translate="no" dir="ltr">WorkManager.getStatus*()</code> methods now return <code translate="no" dir="ltr">ListenableFuture</code>s. <code translate="no" dir="ltr">WorkManager.getStatus*LiveData()</code> return <code translate="no" dir="ltr">LiveData</code>s.</li> </ul> <h3 id="1.0.0-alpha09" data-text="Version 1.0.0-alpha09" tabindex="-1">Version 1.0.0-alpha09</h3> <p>September 19, 2018</p> <p><strong>Known Issue</strong></p> <p>If you run into the following issue: &quot;More than one file was found with OS independent path &#39;META-INF/proguard/androidx-annotations.pro&#39;&quot;, please put the following in your gradle file as a temporary workaround while we fix the issue in alpha10:</p> <div> <div class="ds-selector-tabs"><section><h3 id="groovy" data-text="Groovy" tabindex="-1">Groovy</h3> <pre class="prettyprint lang-groovy" translate="no" dir="ltr"> android { packagingOptions { exclude 'META-INF/proguard/androidx-annotations.pro' } } </pre> </section><section><h3 id="kts" data-text="Kotlin" tabindex="-1">Kotlin</h3> <pre class="prettyprint lang-kotlin" translate="no" dir="ltr"> android { packagingOptions { exclude("META-INF/proguard/androidx-annotations.pro") } } </pre> </section></div> </div> <p><strong>Bug Fixes</strong></p> <ul> <li>Added another fix that was needed for the &quot;100 jobs&quot; error. <a href="https://issuetracker.google.com/115560696">b/115560696</a></li> <li>Added some fixes for foreign key constraint errors due to race conditions. <a href="https://issuetracker.google.com/114705286">b/114705286</a></li> <li>Delegated <code translate="no" dir="ltr">ConstraintTrackingWorker.onStopped(boolean)</code> calls to the underlying <code translate="no" dir="ltr">Worker</code>. <a href="https://issuetracker.google.com/114125093">b/114125093</a></li> <li>Enforce correct minimum backoff delay for Firebase JobDispatcher. <a href="https://issuetracker.google.com/113304626">b/113304626</a></li> <li>Improved threading guarantees internal to the library.</li> <li>Correct potential issue with deduping of <code translate="no" dir="ltr">LiveData</code> internally.</li> </ul> <p><strong>API Changes</strong></p> <ul> <li>You can now create your own <code translate="no" dir="ltr">Worker</code> instances at runtime by specifying a <code translate="no" dir="ltr">WorkerFactory</code> as part of the <code translate="no" dir="ltr">WorkManager.Configuration</code>. The fallback factory is <code translate="no" dir="ltr">DefaultWorkerFactory</code>, which matches behavior of previous versions of WorkManager. <ul> <li>The default constructors for <code translate="no" dir="ltr">Worker</code> and <code translate="no" dir="ltr">NonBlockingWorker</code> are now marked as deprecated. Please use the new constructor (<code translate="no" dir="ltr">Worker(Context, WorkerParameters)</code>) and call <code translate="no" dir="ltr">super(Context, WorkerParameters)</code>; future versions of WorkManager will remove the default constructor.</li> </ul></li> <li>We have started using the new <code translate="no" dir="ltr">ListenableFuture</code> artifact internally (free of Guava dependencies). We will introduce ListenableFutures to the API in upcoming releases. This change will support the eventual unhiding of <code translate="no" dir="ltr">NonBlockingWorker</code>.</li> <li>Add ability to trigger timed work in <code translate="no" dir="ltr">TestDriver</code> via <code translate="no" dir="ltr">TestDriver.setInitialDelayMet(UUID)</code> and <code translate="no" dir="ltr">TestDriver.setPeriodDelayMet(UUID)</code>. <a href="https://issuetracker.google.com/113360060">b/113360060</a></li> </ul> <p><strong>Breaking Changes</strong></p> <ul> <li>The default <code translate="no" dir="ltr">Worker</code> and <code translate="no" dir="ltr">NonBlockingWorker</code> constructors are deprecated. Please migrate to the new constructor ASAP. Future versions will remove the default constructor.</li> </ul> <h3 id="1.0.0-alpha08" data-text="Version 1.0.0-alpha08" tabindex="-1">Version 1.0.0-alpha08</h3> <p>August 27, 2018</p> <p><strong>Bug Fixes</strong></p> <ul> <li>Explicitly labelled WorkManager components as direct boot unaware so they don&#39;t fire up during direct boot. In the future, we will provide a version of WorkManager that is direct boot-aware. <a href="https://issuetracker.google.com/112665532">b/112665532</a></li> <li>Fixed an issue where retried work was not running. <a href="https://issuetracker.google.com/112604021">b/112604021</a></li> <li>Fixed periodic work not executing repeatedly (related to the above issue). <a href="https://issuetracker.google.com/112859683">b/112859683</a></li> <li>Honored backoff policies when the app process is already running.</li> <li>Corrected exception messages in <code translate="no" dir="ltr">Data</code> to indicate the limit is 10KB.</li> <li>Lowered maximum value of <code translate="no" dir="ltr">Configuration.setMaxSchedulerLimit(int)</code> to 50 to account for some latency in <code translate="no" dir="ltr">JobScheduler</code> processing completion. <a href="https://issuetracker.google.com/112817355">b/112817355</a></li> </ul> <h3 id="1.0.0-alpha07" data-text="Version 1.0.0-alpha07" tabindex="-1">Version 1.0.0-alpha07</h3> <p>August 16, 2018</p> <p><strong>Bug Fixes</strong></p> <ul> <li>Fixed a potential SQL query with negative limits that could return an unbounded number of results.</li> <li>Work that has finished execution now correctly cancels all pending copies of that work in other Schedulers. This led to exceeding the <code translate="no" dir="ltr">JobScheduler</code> jobs limit. <a href="https://issuetracker.google.com/111569265">b/111569265</a></li> <li>Fixed a <code translate="no" dir="ltr">ConcurrentModificationException</code> in <code translate="no" dir="ltr">ConstraintTracker</code>. <a href="https://issuetracker.google.com/112272753">b/112272753</a></li> <li>Changed return type annotations of <code translate="no" dir="ltr">Data.getBooleanArray(String)</code> and <code translate="no" dir="ltr">Data.getIntArray(String)</code> to <code translate="no" dir="ltr">@Nullable</code> instead of <code translate="no" dir="ltr">@NonNull</code>. <a href="https://issuetracker.google.com/112275229">b/112275229</a></li> </ul> <p><strong>API Changes</strong></p> <ul> <li><code translate="no" dir="ltr">Worker</code> now extends a new class, <code translate="no" dir="ltr">NonBlockingWorker</code>. This does not affect any current usage. In the future, <code translate="no" dir="ltr">NonBlockingWorker</code> will become a fully supported entity for custom threading solutions.</li> <li>Changed return type annotations of <code translate="no" dir="ltr">Data.getBooleanArray(String)</code> and <code translate="no" dir="ltr">Data.getIntArray(String)</code> to <code translate="no" dir="ltr">@Nullable</code> instead of <code translate="no" dir="ltr">@NonNull</code>. <a href="https://issuetracker.google.com/112275229">b/112275229</a></li> <li>Kotlin extensions: deprecated <code translate="no" dir="ltr">Map.toWorkData()</code> and added a top-level <code translate="no" dir="ltr">workDataOf(vararg Pair&lt;String, Any?&gt;)</code> to be more consistent with existing APIs.</li> </ul> <h3 id="1.0.0-alpha06" data-text="Version 1.0.0-alpha06" tabindex="-1">Version 1.0.0-alpha06</h3> <p>August 1, 2018</p> <p><strong>Bug Fixes</strong></p> <ul> <li>Prevent a database lock when scheduling work. <a href="https://issuetracker.google.com/issues/111801342">b/111801342</a></li> <li>Fix a bug which causes <code translate="no" dir="ltr">PeriodicWork</code> to not run on schedule when in Doze mode. <a href="https://issuetracker.google.com/issues/111469837">b/111469837</a></li> <li>Fix a race condition when tracking constraints which causes <code translate="no" dir="ltr">WorkManager</code> to crash. <a href="https://github.com/googlecodelabs/android-workmanager/issues/56">googlecodelabs/android-workmanager/issues/56</a></li> <li>Create unique <code translate="no" dir="ltr">WorkRequest</code>s when using <code translate="no" dir="ltr">WorkRequest.Builder#build()</code>. <a href="https://issuetracker.google.com/issues/111408337">b/111408337</a></li> <li>Enable the use of <code translate="no" dir="ltr">RescheduleReceiver</code> only when there are <code translate="no" dir="ltr">WorkRequest</code>s that need it. <a href="https://issuetracker.google.com/issues/111765853">b/111765853</a></li> </ul> <h3 id="1.0.0-alpha05" data-text="Version 1.0.0-alpha05" tabindex="-1">Version 1.0.0-alpha05</h3> <p>July 24, 2018</p> <p><strong>API Changes</strong></p> <ul> <li><code translate="no" dir="ltr">WorkManager.getInstance()</code> is now annotated with <code translate="no" dir="ltr">@NonNull</code> instead of <code translate="no" dir="ltr">@Nullable</code>. Instead, if the singleton isn&#39;t properly initialized in cases of manual initialization, the method will throw an <code translate="no" dir="ltr">IllegalStateException</code>. <strong>This is a breaking API change.</strong></li> <li>Added a new API, <code translate="no" dir="ltr">Configuration.Builder.setMinimumLoggingLevel(int)</code>, which can control WorkManager verbosity. By default, WorkManager logs <code translate="no" dir="ltr">Log.INFO</code> and above.</li> <li>Changed signature of <code translate="no" dir="ltr">Data.getString()</code> so it no longer takes a default value (it is implicitly <code translate="no" dir="ltr">null</code>). <strong>This is a breaking API change.</strong></li> <li>Marked some methods needed only for internal usage as <code translate="no" dir="ltr">@hide</code>. This includes the <code translate="no" dir="ltr">Constraints</code> constructor, <code translate="no" dir="ltr">Data.toByteArray()</code>, and <code translate="no" dir="ltr">Data.fromByteArray(byte[])</code>. <strong>This is a breaking API change.</strong></li> </ul> <p><strong>Bug Fixes</strong></p> <ul> <li>WorkManager no longer executes work during known cases of auto-backup. This could have resulted in a crash. <a href="https://issuetracker.google.com/issues/110564377">b/110564377</a></li> <li>Fixed double-scheduling of <code translate="no" dir="ltr">PeriodicWorkRequest</code>s when using <code translate="no" dir="ltr">JobScheduler</code>. <a href="https://issuetracker.google.com/issues/110798652">b/110798652</a></li> <li>Fixed an issue with <code translate="no" dir="ltr">PeriodicWorkRequest</code>s not executing correctly after device doze. <a href="https://issuetracker.google.com/issues/111469837">b/111469837</a></li> <li>Fixed an issue with initial delays when using Firebase JobDispatcher. <a href="https://issuetracker.google.com/issues/111141023">b/111141023</a></li> <li>Fixed some potential race conditions and timing issues.</li> <li>Correctly freed up <code translate="no" dir="ltr">BroadcastReceiver</code>s that were no longer needed.</li> <li>Optimized rescheduling performance when apps restart after being force closed.</li> <li>Allowed <code translate="no" dir="ltr">TestScheduler.setAllConstraintsMet(UUID)</code> to be called before or after enqueuing the given <code translate="no" dir="ltr">WorkRequest</code>. <a href="https://issuetracker.google.com/issues/111238024">b/111238024</a></li> </ul> <p><strong>Breaking Changes</strong></p> <ul> <li><code translate="no" dir="ltr">WorkManager.getInstance()</code> is now annotated with <code translate="no" dir="ltr">@NonNull</code> instead of <code translate="no" dir="ltr">@Nullable</code>.</li> <li>Changed signature of <code translate="no" dir="ltr">Data.getString()</code> so it no longer takes a default value (it is implicitly <code translate="no" dir="ltr">null</code>).</li> <li>Marked some methods needed only for internal usage as <code translate="no" dir="ltr">@hide</code>. This includes the <code translate="no" dir="ltr">Constraints</code> constructor, <code translate="no" dir="ltr">Data.toByteArray()</code>, and <code translate="no" dir="ltr">Data.fromByteArray(byte[])</code>.</li> </ul> <h3 id="1.0.0-alpha04" data-text="Version 1.0.0-alpha04" tabindex="-1">Version 1.0.0-alpha04</h3> <p>June 26, 2018</p> <p><strong>Bug Fixes</strong></p> <ul> <li><code translate="no" dir="ltr">PeriodicWorkRequest</code>s are now correctly rescheduled when using the <code translate="no" dir="ltr">AlarmManager</code> based implementation.</li> <li>Fixed a potential ANR when rescheduling all workers after a force stop or a reboot. <a href="https://issuetracker.google.com/issues/110507716">b/110507716</a></li> <li>Added nullability annotations to various WorkManager APIs. <a href="https://issuetracker.google.com/issues/110344065">b/110344065</a></li> <li>Log uncaught exceptions that occur during Worker execution. <a href="https://issuetracker.google.com/issues/109900862">b/109900862</a></li> <li>Allowed destructive database migrations in case you decide to roll back to an older version of WorkManager. <a href="https://issuetracker.google.com/issues/74633270">b/74633270</a></li> <li>Fixed a migration crash if creating duplicate implicit tags. This is a very rare issue that occurred only if you used the same implicit tag format yourself.</li> </ul> <h3 id="1.0.0-alpha03" data-text="Version 1.0.0-alpha03" tabindex="-1">Version 1.0.0-alpha03</h3> <p>June 19, 2018</p> <p><strong>Bug Fixes</strong></p> <ul> <li><p>Fixed a race condition in the <code translate="no" dir="ltr">AlarmManager</code> based implementation. <a href="https://issuetracker.google.com/issues/80346526">b/80346526</a>.</p></li> <li><p>Fixed duplicate jobs when using <code translate="no" dir="ltr">JobScheduler</code> after a device reboot.</p></li> <li><p>Jobs with Content URI triggers now persist across reboots. <a href="https://issuetracker.google.com/issues/80234744">b/80234744</a></p></li> <li><p>Documentation updates. <a href="https://issuetracker.google.com/issues/109827628">b/109827628</a>, <a href="https://issuetracker.google.com/issues/109758949">b/109758949</a>, <a href="https://issuetracker.google.com/issues/80230748">b/80230748</a></p></li> <li><p>Fixed a crash when re-enqueuing a <code translate="no" dir="ltr">WorkRequest</code>. <a href="https://issuetracker.google.com/issues/109572353">b/109572353</a>.</p></li> <li><p>Fixed Kotlin compiler warnings when using the <code translate="no" dir="ltr">work-runtime-ktx</code> dependency.</p></li> <li><p>WorkManager now uses <code translate="no" dir="ltr">Room</code> version <code translate="no" dir="ltr">1.1.1-rc1</code>.</p></li> </ul> <p><strong>API Changes</strong></p> <ul> <li>Added <code translate="no" dir="ltr">getStatusesSync()</code>, the synchronous version of <code translate="no" dir="ltr">WorkContinuation.getStatuses()</code>.</li> <li><code translate="no" dir="ltr">Worker</code> has the ability to distinguish between user-initiated cancellation and temporary os-requested stopping. <code translate="no" dir="ltr">Worker.isStopped()</code> returns <code translate="no" dir="ltr">true</code> if any kind of stop has been requested. <code translate="no" dir="ltr">Worker.isCancelled()</code> returns <code translate="no" dir="ltr">true</code> when the work has been explicitly cancelled. <a href="https://issuetracker.google.com/issues/79632247">b/79632247</a></li> <li>Add support for <a href="https://developer.android.com/reference/android/app/job/JobParameters.html#getNetwork()">JobParameters#getNetwork()</a> on API 28. This is exposed via <code translate="no" dir="ltr">Worker.getNetwork()</code>.</li> <li>Added <code translate="no" dir="ltr">Configuration.Builder.setMaxSchedulerLimit(int maxSchedulerLimit)</code> so you can enforce how many jobs can be sent to <code translate="no" dir="ltr">JobScheduler</code> or <code translate="no" dir="ltr">AlarmManager</code>. This helps prevent <code translate="no" dir="ltr">WorkManager</code> from taking all your available <code translate="no" dir="ltr">JobScheduler</code> slots.</li> <li>Added <code translate="no" dir="ltr">Configuration.setJobSchedulerJobIdRange(int minJobSchedulerId, int maxJobSchedulerId)</code> which helps define a range of <code translate="no" dir="ltr">JobScheduler</code> job ids safe for <code translate="no" dir="ltr">WorkManager</code> to use. <a href="https://issuetracker.google.com/issues/79996760">b/79996760</a></li> <li><code translate="no" dir="ltr">Worker.getRunAttemptCount()</code> returns the current run count for a given <code translate="no" dir="ltr">Worker</code>. <a href="https://issuetracker.google.com/issues/79716516">b/79716516</a></li> <li><code translate="no" dir="ltr">WorkManager.enqueueUniquePeriodicWork(String uniqueWorkName, ExistingPeriodicWorkPolicy existingPeriodicWorkPolicy, PeriodicWorkRequest periodicWork)</code> allows you to enqueue a unique <code translate="no" dir="ltr">PeriodicWorkRequest</code>s. <a href="https://issuetracker.google.com/issues/79600647">b/79600647</a></li> <li><code translate="no" dir="ltr">WorkManager.cancelAllWork()</code> cancels all <code translate="no" dir="ltr">Worker</code>s. Libraries that depend on <code translate="no" dir="ltr">WorkManager</code> can query when this method was called last by using <code translate="no" dir="ltr">WorkManager.getLastCancelAllTimeMillis()</code> for additional cleanup of internal state.</li> <li>Added <code translate="no" dir="ltr">WorkManager.pruneWork()</code> to remove completed jobs from the internal database. <a href="https://issuetracker.google.com/issues/79950952">b/79950952</a>, <a href="https://issuetracker.google.com/issues/109710758">b/109710758</a></li> </ul> <p><strong>Behavior Changes</strong></p> <ul> <li>Added an implicit tag for all <code translate="no" dir="ltr">WorkRequest</code>s, which is the fully qualified class name for the <code translate="no" dir="ltr">Worker</code>. This allows the ability to remove <code translate="no" dir="ltr">WorkRequest</code>s without <code translate="no" dir="ltr">tag</code>s or when the <code translate="no" dir="ltr">id</code> is not available. <a href="https://issuetracker.google.com/issues/109572351">b/109572351</a></li> </ul> <p><strong>Breaking Changes</strong></p> <ul> <li>Renamed <code translate="no" dir="ltr">Worker.WorkerResult</code> to <code translate="no" dir="ltr">Worker.Result</code>.</li> <li><code translate="no" dir="ltr">Worker.onStopped</code> now has an <strong>additional</strong> <code translate="no" dir="ltr">isCancelled</code> parameter which is set to<code translate="no" dir="ltr">true</code> when the <code translate="no" dir="ltr">Worker</code> has explicitly been cancelled.</li> </ul> <h3 id="1.0.0-alpha02" data-text="Version 1.0.0-alpha02" tabindex="-1">Version 1.0.0-alpha02</h3> <p>May 24, 2018</p> <p><strong>Bug Fixes</strong></p> <ul> <li>Fixed a <code translate="no" dir="ltr">NullPointerException</code> on <code translate="no" dir="ltr">State.isFinished()</code>. <a href="https://issuetracker.google.com/issues/79550068">b/79550068</a></li> <li>Fixed an issue which caused <code translate="no" dir="ltr">Worker</code>s to be rescheduled on <code translate="no" dir="ltr">Application.onCreate()</code>. <a href="https://issuetracker.google.com/issues/79660657">b/79660657</a></li> <li>Fixed an issue where you could schedule more work than is allowed by the OS. <a href="https://issuetracker.google.com/issues/79497378">b/79497378</a></li> <li>Moved cleanup of wake locks associated with <code translate="no" dir="ltr">Worker</code>s to the background thread.</li> <li>The <code translate="no" dir="ltr">AlarmManager</code> implementation now correctly cleans up when all pending work is complete.</li> <li>Fixed cleanup SQL queries which affected non-English locales. <a href="https://issuetracker.google.com/issues/80065360">b/80065360</a></li> <li>Added support for <code translate="no" dir="ltr">float</code>s in <code translate="no" dir="ltr">Data</code>. <a href="https://issuetracker.google.com/issues/79443878">b/79443878</a></li> <li><code translate="no" dir="ltr">Data.Builder.putAll()</code> now returns an instance of the <code translate="no" dir="ltr">Builder</code>. <a href="https://issuetracker.google.com/issues/79699162">b/79699162</a></li> <li>More javadoc and fixes in documentation. <a href="https://issuetracker.google.com/issues/79691663">b/79691663</a></li> </ul> <p><strong>API Changes</strong></p> <ul> <li><code translate="no" dir="ltr">Worker</code>s can react to being stopped. <code translate="no" dir="ltr">Worker.isStopped()</code> can be used to check if a <code translate="no" dir="ltr">Worker</code> has been stopped. <code translate="no" dir="ltr">Worker.onStopped()</code> can be used to perform lightweight cleanup operations.</li> <li><code translate="no" dir="ltr">Worker.getTags()</code> API returns a <code translate="no" dir="ltr">Set</code> of tags associated with the <code translate="no" dir="ltr">Worker</code>.</li> <li>Added <code translate="no" dir="ltr">javax.time.Duration</code> overloads for APIs which take a combination of duration and <code translate="no" dir="ltr">TimeUnit</code>s. This is guarded by <code translate="no" dir="ltr">@RequiresApi(26)</code>.</li> <li><code translate="no" dir="ltr">WorkManager</code> extensions have moved from the <code translate="no" dir="ltr">androidx.work.ktx</code> package to the <code translate="no" dir="ltr">androidx.work</code> package. The old extensions are deprecated and will be removed in a future version.</li> <li><code translate="no" dir="ltr">Configuration.withExecutor()</code> is deprecated. Use <code translate="no" dir="ltr">Configuration.setExecutor()</code> instead.</li> </ul> <h3 id="1.0.0-alpha01" data-text="Version 1.0.0-alpha01" tabindex="-1">Version 1.0.0-alpha01</h3> <p>May 8, 2018</p> <p><a href="/topic/libraries/architecture/workmanager">WorkManager</a> simplifies scheduling and execution of guaranteed, constraint-aware background work. This initial release is <code translate="no" dir="ltr">1.0.0-alpha01</code>.</p> <devsite-hats-survey class="nocontent" hats-id="VxqvKSur40kxBYCLVTd0SSGykbno" listnr-id="5207477"></devsite-hats-survey> </div> <devsite-recommendations display="in-page" hidden yield> </devsite-recommendations> <devsite-thumb-rating position="footer"> </devsite-thumb-rating> <devsite-recommendations id="recommendations-link" yield></devsite-recommendations> <div class="devsite-floating-action-buttons"> </div> </article> <devsite-content-footer class="nocontent"> <p>Content and code samples on this page are subject to the licenses described in the <a href="/license">Content License</a>. Java and OpenJDK are trademarks or registered trademarks of Oracle and/or its affiliates.</p> <p>Last updated 2024-10-30 UTC.</p> </devsite-content-footer> <devsite-notification > </devsite-notification> <div class="devsite-content-data"> <template class="devsite-content-data-template"> [[["Easy to understand","easyToUnderstand","thumb-up"],["Solved my problem","solvedMyProblem","thumb-up"],["Other","otherUp","thumb-up"]],[["Missing the information I need","missingTheInformationINeed","thumb-down"],["Too complicated / too many steps","tooComplicatedTooManySteps","thumb-down"],["Out of date","outOfDate","thumb-down"],["Samples / code issue","samplesCodeIssue","thumb-down"],["Other","otherDown","thumb-down"]],["Last updated 2024-10-30 UTC."],[],[]] </template> </div> </devsite-content> </main> <devsite-footer-promos class="devsite-footer"> <nav class="devsite-footer-promos nocontent" aria-label="Promotions"> <ul class="devsite-footer-promos-list"> <li class="devsite-footer-promo"> <a href="//x.com/AndroidDev" class="devsite-footer-promo-title gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Footer X Promo" > <picture> <source class="devsite-dark-theme" srcset="https://developer.android.com/_static/android/images/logo-x_dt.svg" media="(prefers-color-scheme: dark)" loading="lazy" alt="X"> <img class="devsite-footer-promo-icon" src="/_static/android/images/logo-x.svg" loading="lazy" alt="X"> </picture> <span class="devsite-footer-promo-label"> X </span> </a> <div class="devsite-footer-promo-description">Follow @AndroidDev on X</div> </li> <li class="devsite-footer-promo"> <a href="//www.youtube.com/user/androiddevelopers" class="devsite-footer-promo-title gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Footer YouTube Promo" > <picture> <source class="devsite-dark-theme" srcset="https://developer.android.com/_static/android/images/logo-youtube_dt.svg" media="(prefers-color-scheme: dark)" loading="lazy" alt="YouTube"> <img class="devsite-footer-promo-icon" src="//www.gstatic.com/images/icons/material/product/2x/youtube_48dp.png" loading="lazy" alt="YouTube"> </picture> <span class="devsite-footer-promo-label"> YouTube </span> </a> <div class="devsite-footer-promo-description">Check out Android Developers on YouTube</div> </li> <li class="devsite-footer-promo"> <a href="//www.linkedin.com/showcase/androiddev" class="devsite-footer-promo-title gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Footer LinkedIn Promo" > <picture> <source class="devsite-dark-theme" srcset="https://developer.android.com/_static/android/images/logo-linkedin_dt.svg" media="(prefers-color-scheme: dark)" loading="lazy" alt="LinkedIn"> <img class="devsite-footer-promo-icon" src="/_static/android/images/logo-linkedin.svg" loading="lazy" alt="LinkedIn"> </picture> <span class="devsite-footer-promo-label"> LinkedIn </span> </a> <div class="devsite-footer-promo-description">Connect with the Android Developers community on LinkedIn</div> </li> </ul> </nav> </devsite-footer-promos> <devsite-footer-linkboxes class="devsite-footer"> <nav class="devsite-footer-linkboxes nocontent" aria-label="Footer links"> <ul class="devsite-footer-linkboxes-list"> <li class="devsite-footer-linkbox "> <h3 class="devsite-footer-linkbox-heading no-link">More Android</h3> <ul class="devsite-footer-linkbox-list"> <li class="devsite-footer-linkbox-item"> <a href="//www.android.com" class="devsite-footer-linkbox-link gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Footer Link (index 1)" > Android </a> </li> <li class="devsite-footer-linkbox-item"> <a href="//www.android.com/enterprise/" class="devsite-footer-linkbox-link gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Footer Link (index 2)" > Android for Enterprise </a> </li> <li class="devsite-footer-linkbox-item"> <a href="//www.android.com/security-center/" class="devsite-footer-linkbox-link gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Footer Link (index 3)" > Security </a> </li> <li class="devsite-footer-linkbox-item"> <a href="//source.android.com" class="devsite-footer-linkbox-link gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Footer Link (index 4)" > Source </a> </li> <li class="devsite-footer-linkbox-item"> <a href="/news" class="devsite-footer-linkbox-link gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Footer Link (index 5)" > News </a> </li> <li class="devsite-footer-linkbox-item"> <a href="//android-developers.googleblog.com/" class="devsite-footer-linkbox-link gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Footer Link (index 6)" > Blog </a> </li> <li class="devsite-footer-linkbox-item"> <a href="/podcasts" class="devsite-footer-linkbox-link gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Footer Link (index 7)" > Podcasts </a> </li> </ul> </li> <li class="devsite-footer-linkbox "> <h3 class="devsite-footer-linkbox-heading no-link">Discover</h3> <ul class="devsite-footer-linkbox-list"> <li class="devsite-footer-linkbox-item"> <a href="/games" class="devsite-footer-linkbox-link gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Footer Link (index 1)" > Gaming </a> </li> <li class="devsite-footer-linkbox-item"> <a href="/ml" class="devsite-footer-linkbox-link gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Footer Link (index 2)" > Machine Learning </a> </li> <li class="devsite-footer-linkbox-item"> <a href="/health-and-fitness" class="devsite-footer-linkbox-link gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Footer Link (index 3)" > Health & Fitness </a> </li> <li class="devsite-footer-linkbox-item"> <a href="/media" class="devsite-footer-linkbox-link gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Footer Link (index 4)" > Camera & Media </a> </li> <li class="devsite-footer-linkbox-item"> <a href="/privacy" class="devsite-footer-linkbox-link gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Footer Link (index 5)" > Privacy </a> </li> <li class="devsite-footer-linkbox-item"> <a href="/training/connectivity/5g" class="devsite-footer-linkbox-link gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Footer Link (index 6)" > 5G </a> </li> </ul> </li> <li class="devsite-footer-linkbox "> <h3 class="devsite-footer-linkbox-heading no-link">Android Devices</h3> <ul class="devsite-footer-linkbox-list"> <li class="devsite-footer-linkbox-item"> <a href="/large-screens" class="devsite-footer-linkbox-link gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Footer Link (index 1)" > Large screens </a> </li> <li class="devsite-footer-linkbox-item"> <a href="/wear" class="devsite-footer-linkbox-link gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Footer Link (index 2)" > Wear OS </a> </li> <li class="devsite-footer-linkbox-item"> <a href="/chrome-os" class="devsite-footer-linkbox-link gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Footer Link (index 3)" > ChromeOS devices </a> </li> <li class="devsite-footer-linkbox-item"> <a href="/cars" class="devsite-footer-linkbox-link gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Footer Link (index 4)" > Android for cars </a> </li> <li class="devsite-footer-linkbox-item"> <a href="/tv" class="devsite-footer-linkbox-link gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Footer Link (index 5)" > Android TV </a> </li> </ul> </li> <li class="devsite-footer-linkbox "> <h3 class="devsite-footer-linkbox-heading no-link">Releases</h3> <ul class="devsite-footer-linkbox-list"> <li class="devsite-footer-linkbox-item"> <a href="/about/versions/15" class="devsite-footer-linkbox-link gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Footer Link (index 1)" > Android 15 </a> </li> <li class="devsite-footer-linkbox-item"> <a href="/about/versions/14" class="devsite-footer-linkbox-link gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Footer Link (index 2)" > Android 14 </a> </li> <li class="devsite-footer-linkbox-item"> <a href="/about/versions/13" class="devsite-footer-linkbox-link gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Footer Link (index 3)" > Android 13 </a> </li> <li class="devsite-footer-linkbox-item"> <a href="/about/versions/12" class="devsite-footer-linkbox-link gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Footer Link (index 4)" > Android 12 </a> </li> <li class="devsite-footer-linkbox-item"> <a href="/about/versions/11" class="devsite-footer-linkbox-link gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Footer Link (index 5)" > Android 11 </a> </li> <li class="devsite-footer-linkbox-item"> <a href="/about/versions/10" class="devsite-footer-linkbox-link gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Footer Link (index 6)" > Android 10 </a> </li> <li class="devsite-footer-linkbox-item"> <a href="/about/versions/pie" class="devsite-footer-linkbox-link gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Footer Link (index 7)" > Pie </a> </li> </ul> </li> <li class="devsite-footer-linkbox "> <h3 class="devsite-footer-linkbox-heading no-link">Documentation and Downloads</h3> <ul class="devsite-footer-linkbox-list"> <li class="devsite-footer-linkbox-item"> <a href="/studio/intro" class="devsite-footer-linkbox-link gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Footer Link (index 1)" > Android Studio guide </a> </li> <li class="devsite-footer-linkbox-item"> <a href="/guide" class="devsite-footer-linkbox-link gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Footer Link (index 2)" > Developers guides </a> </li> <li class="devsite-footer-linkbox-item"> <a href="/reference" class="devsite-footer-linkbox-link gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Footer Link (index 3)" > API reference </a> </li> <li class="devsite-footer-linkbox-item"> <a href="/studio" class="devsite-footer-linkbox-link gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Footer Link (index 4)" > Download Studio </a> </li> <li class="devsite-footer-linkbox-item"> <a href="/ndk" class="devsite-footer-linkbox-link gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Footer Link (index 5)" > Android NDK </a> </li> </ul> </li> <li class="devsite-footer-linkbox "> <h3 class="devsite-footer-linkbox-heading no-link">Support</h3> <ul class="devsite-footer-linkbox-list"> <li class="devsite-footer-linkbox-item"> <a href="//issuetracker.google.com/issues/new?component=190923&amp;template=841312" class="devsite-footer-linkbox-link gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Footer Link (index 1)" > Report platform bug </a> </li> <li class="devsite-footer-linkbox-item"> <a href="//issuetracker.google.com/issues/new?component=192697" class="devsite-footer-linkbox-link gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Footer Link (index 2)" > Report documentation bug </a> </li> <li class="devsite-footer-linkbox-item"> <a href="//support.google.com/googleplay/android-developer" class="devsite-footer-linkbox-link gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Footer Link (index 3)" > Google Play support </a> </li> <li class="devsite-footer-linkbox-item"> <a href="https://g.co/userresearch/androiddeveloperfooter" class="devsite-footer-linkbox-link gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Footer Link (index 4)" > Join research studies </a> </li> </ul> </li> </ul> </nav> </devsite-footer-linkboxes> <devsite-footer-utility class="devsite-footer"> <div class="devsite-footer-utility nocontent"> <nav class="devsite-footer-sites" aria-label="Other Google Developers websites"> <a href="https://developers.google.com/" class="devsite-footer-sites-logo-link gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Footer Google Developers Link"> <picture> <source srcset="https://www.gstatic.com/devrel-devsite/prod/v870e399c64f7c43c99a3043db4b3a74327bb93d0914e84a0c3dba90bbfd67625/android/images/lockup-google-for-developers-dark-theme.svg" media="(prefers-color-scheme: none)" class="devsite-dark-theme" loading="lazy" alt="Google Developers"> <img class="devsite-footer-sites-logo" src="https://www.gstatic.com/devrel-devsite/prod/v870e399c64f7c43c99a3043db4b3a74327bb93d0914e84a0c3dba90bbfd67625/android/images/lockup-google-for-developers.svg" loading="lazy" alt="Google Developers"> </picture> </a> <ul class="devsite-footer-sites-list"> <li class="devsite-footer-sites-item"> <a href="//developer.android.com" class="devsite-footer-sites-link gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Footer Android Link" > Android </a> </li> <li class="devsite-footer-sites-item"> <a href="//developer.chrome.com/home" class="devsite-footer-sites-link gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Footer Chrome Link" > Chrome </a> </li> <li class="devsite-footer-sites-item"> <a href="//firebase.google.com" class="devsite-footer-sites-link gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Footer Firebase Link" > Firebase </a> </li> <li class="devsite-footer-sites-item"> <a href="//cloud.google.com" class="devsite-footer-sites-link gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Footer Google Cloud Platform Link" > Google Cloud Platform </a> </li> <li class="devsite-footer-sites-item"> <a href="//developers.google.com/products/" class="devsite-footer-sites-link gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Footer All products Link" > All products </a> </li> </ul> </nav> <nav class="devsite-footer-utility-links" aria-label="Utility links"> <ul class="devsite-footer-utility-list"> <li class="devsite-footer-utility-item "> <a class="devsite-footer-utility-link gc-analytics-event" href="//policies.google.com/privacy" data-category="Site-Wide Custom Events" data-label="Footer Privacy link" > Privacy </a> </li> <li class="devsite-footer-utility-item "> <a class="devsite-footer-utility-link gc-analytics-event" href="/license" data-category="Site-Wide Custom Events" data-label="Footer License link" > License </a> </li> <li class="devsite-footer-utility-item "> <a class="devsite-footer-utility-link gc-analytics-event" href="/distribute/marketing-tools/brand-guidelines" data-category="Site-Wide Custom Events" data-label="Footer Brand guidelines link" > Brand guidelines </a> </li> <li class="devsite-footer-utility-item glue-cookie-notification-bar-control"> <a class="devsite-footer-utility-link gc-analytics-event" href="#" data-category="Site-Wide Custom Events" data-label="Footer Manage cookies link" aria-hidden="true" > Manage cookies </a> </li> <li class="devsite-footer-utility-item devsite-footer-utility-button"> <span class="devsite-footer-utility-description">Get news and tips by email</span> <a class="devsite-footer-utility-link gc-analytics-event" href="/updates" data-category="Site-Wide Custom Events" data-label="Footer Subscribe link" > Subscribe </a> </li> </ul> <devsite-language-selector> <ul role="presentation"> <li role="presentation"> <a role="menuitem" lang="en" >English</a> </li> <li role="presentation"> <a role="menuitem" lang="de" >Deutsch</a> </li> <li role="presentation"> <a role="menuitem" lang="es_419" >Español – América Latina</a> </li> <li role="presentation"> <a role="menuitem" lang="fr" >Français</a> </li> <li role="presentation"> <a role="menuitem" lang="id" >Indonesia</a> </li> <li role="presentation"> <a role="menuitem" lang="it" >Italiano</a> </li> <li role="presentation"> <a role="menuitem" lang="pl" >Polski</a> </li> <li role="presentation"> <a role="menuitem" lang="pt_br" >Português – Brasil</a> </li> <li role="presentation"> <a role="menuitem" lang="vi" >Tiếng Việt</a> </li> <li role="presentation"> <a role="menuitem" lang="tr" >Türkçe</a> </li> <li role="presentation"> <a role="menuitem" lang="ru" >Русский</a> </li> <li role="presentation"> <a role="menuitem" lang="he" >עברית</a> </li> <li role="presentation"> <a role="menuitem" lang="ar" >العربيّة</a> </li> <li role="presentation"> <a role="menuitem" lang="fa" >فارسی</a> </li> <li role="presentation"> <a role="menuitem" lang="hi" >हिंदी</a> </li> <li role="presentation"> <a role="menuitem" lang="bn" >বাংলা</a> </li> <li role="presentation"> <a role="menuitem" lang="th" >ภาษาไทย</a> </li> <li role="presentation"> <a role="menuitem" lang="zh_cn" >中文 – 简体</a> </li> <li role="presentation"> <a role="menuitem" lang="zh_tw" >中文 – 繁體</a> </li> <li role="presentation"> <a role="menuitem" lang="ja" >日本語</a> </li> <li role="presentation"> <a role="menuitem" lang="ko" >한국어</a> </li> </ul> </devsite-language-selector> </nav> </div> </devsite-footer-utility> <devsite-panel></devsite-panel> </section></section> <devsite-sitemask></devsite-sitemask> <devsite-snackbar></devsite-snackbar> <devsite-tooltip ></devsite-tooltip> <devsite-heading-link></devsite-heading-link> <devsite-analytics> <script type="application/json" analytics>[]</script> <script type="application/json" tag-management>{&#34;at&#34;: &#34;True&#34;, &#34;ga4&#34;: [{&#34;id&#34;: &#34;G-QFRN08RN6E&#34;, &#34;purpose&#34;: 0}], &#34;ga4p&#34;: [{&#34;id&#34;: &#34;G-QFRN08RN6E&#34;, &#34;purpose&#34;: 0}], &#34;gtm&#34;: [{&#34;id&#34;: &#34;GTM-KMSWPCJ&#34;, &#34;purpose&#34;: 0}], &#34;parameters&#34;: {&#34;internalUser&#34;: &#34;False&#34;, &#34;language&#34;: {&#34;machineTranslated&#34;: &#34;False&#34;, &#34;requested&#34;: &#34;en&#34;, &#34;served&#34;: &#34;en&#34;}, &#34;pageType&#34;: &#34;article&#34;, &#34;projectName&#34;: &#34;Jetpack&#34;, &#34;signedIn&#34;: &#34;False&#34;, &#34;tenant&#34;: &#34;android&#34;, &#34;recommendations&#34;: {&#34;sourcePage&#34;: &#34;&#34;, &#34;sourceType&#34;: 0, &#34;sourceRank&#34;: 0, &#34;sourceIdenticalDescriptions&#34;: 0, &#34;sourceTitleWords&#34;: 0, &#34;sourceDescriptionWords&#34;: 0, &#34;experiment&#34;: &#34;&#34;}, &#34;experiment&#34;: {&#34;ids&#34;: &#34;&#34;}}}</script> </devsite-analytics> <devsite-badger></devsite-badger> <android-fully-clickable target=" .android-case-study .devsite-landing-row-item, .android-grouped-resources .devsite-landing-row-item, .android-grouped-resources-primary .devsite-landing-row-item, .android-grouped-resources-secondary .devsite-landing-row-item, .android-guide-cards .devsite-landing-row-item, .android-illustrated-resources-index .devsite-landing-row-item, .android-illustrated-resources-primary .devsite-landing-row-item, .android-illustrated-resources-secondary .devsite-landing-row-item, .android-illustrated-resources-secondary-small .devsite-landing-row-item, .android-illustrated-resources-tertiary .devsite-landing-row-item, .android-illustrated-resources-tertiary-small .devsite-landing-row-item, .android-promo .devsite-landing-row-item, .android-quick-link, .android-samples .devsite-card-wrapper, .fully-clickable" watch=".android-samples, devsite-content"></android-fully-clickable> <script nonce="LP2HUAlsl76ClmLDLSWTwbEs/pBfmT"> (function(d,e,v,s,i,t,E){d['GoogleDevelopersObject']=i; t=e.createElement(v);t.async=1;t.src=s;E=e.getElementsByTagName(v)[0]; E.parentNode.insertBefore(t,E);})(window, document, 'script', 'https://www.gstatic.com/devrel-devsite/prod/v870e399c64f7c43c99a3043db4b3a74327bb93d0914e84a0c3dba90bbfd67625/android/js/app_loader.js', '[3,"en",null,"/js/devsite_app_module.js","https://www.gstatic.com/devrel-devsite/prod/v870e399c64f7c43c99a3043db4b3a74327bb93d0914e84a0c3dba90bbfd67625","https://www.gstatic.com/devrel-devsite/prod/v870e399c64f7c43c99a3043db4b3a74327bb93d0914e84a0c3dba90bbfd67625/android","https://android-dot-devsite-v2-prod.appspot.com",null,null,["/_pwa/android/manifest.json","https://www.gstatic.com/devrel-devsite/prod/v870e399c64f7c43c99a3043db4b3a74327bb93d0914e84a0c3dba90bbfd67625/images/video-placeholder.svg","https://www.gstatic.com/devrel-devsite/prod/v870e399c64f7c43c99a3043db4b3a74327bb93d0914e84a0c3dba90bbfd67625/android/images/favicon.svg","https://www.gstatic.com/devrel-devsite/prod/v870e399c64f7c43c99a3043db4b3a74327bb93d0914e84a0c3dba90bbfd67625/android/images/lockup.svg","https://fonts.googleapis.com/css?family=Google+Sans:400,500,600,700|Google+Sans+Text:400,400italic,500,500italic,600,600italic,700,700italic|Roboto+Mono:400,500,700&display=swap"],1,null,[1,6,8,12,14,17,21,25,50,52,63,70,75,76,80,87,91,92,93,97,98,100,101,102,103,104,105,107,108,109,110,112,113,116,117,118,120,122,124,125,126,127,129,130,131,132,133,134,135,136,138,140,141,147,148,149,151,152,156,157,158,159,161,163,164,168,169,170,179,180,182,183,186,191,193,196],"AIzaSyAP-jjEJBzmIyKR4F-3XITp8yM9T1gEEI8","AIzaSyB6xiKGDR5O3Ak2okS4rLkauxGUG7XP0hg","developer.android.com","AIzaSyAQk0fBONSGUqCNznf6Krs82Ap1-NV6J4o","AIzaSyCCxcqdrZ_7QMeLCRY20bh_SXdAYqy70KY",null,null,null,["Cloud__enable_free_trial_server_call","Profiles__enable_developer_profiles_callout","MiscFeatureFlags__enable_variable_operator","Search__enable_page_map","Significatio__enable_by_tenant","Profiles__enable_awarding_url","TpcFeatures__enable_mirror_tenant_redirects","Profiles__enable_release_notes_notifications","Concierge__enable_pushui","MiscFeatureFlags__developers_footer_dark_image","Profiles__enable_complete_playlist_endpoint","Profiles__enable_recognition_badges","Cloud__enable_cloud_dlp_service","MiscFeatureFlags__enable_firebase_utm","DevPro__enable_developer_subscriptions","Profiles__enable_completecodelab_endpoint","Cloud__enable_llm_concierge_chat","CloudShell__cloud_shell_button","DevPro__enable_cloud_innovators_plus","Cloud__enable_legacy_calculator_redirect","CloudShell__cloud_code_overflow_menu","MiscFeatureFlags__enable_view_transitions","Cloud__enable_cloudx_experiment_ids","Search__enable_ai_eligibility_checks","Profiles__require_profile_eligibility_for_signin","Search__enable_dynamic_content_confidential_banner","MiscFeatureFlags__enable_dark_theme","Search__enable_suggestions_from_borg","Profiles__enable_dashboard_curated_recommendations","Cloud__enable_cloud_shell","Profiles__enable_public_developer_profiles","Analytics__enable_clearcut_logging","Cloud__enable_cloud_facet_chat","EngEduTelemetry__enable_engedu_telemetry","BookNav__enable_tenant_cache_key","TpcFeatures__enable_required_headers","MiscFeatureFlags__enable_project_variables","MiscFeatureFlags__developers_footer_image","Cloud__enable_cloudx_ping","MiscFeatureFlags__enable_explain_this_code","Profiles__enable_page_saving","Cloud__enable_cloud_shell_fte_user_flow","Experiments__reqs_query_experiments","MiscFeatureFlags__emergency_css","Search__enable_ai_search_summaries","Profiles__enable_profile_collections"],null,null,"AIzaSyBLEMok-5suZ67qRPzx0qUtbnLmyT_kCVE","https://developerscontentserving-pa.googleapis.com","AIzaSyCM4QpTRSqP5qI4Dvjt4OAScIN8sOUlO-k","https://developerscontentsearch-pa.googleapis.com",2,4,null,"https://developerprofiles-pa.googleapis.com",[3,"android","Android Developers","developer.android.com",null,"android-dot-devsite-v2-prod.appspot.com",null,null,[null,1,null,null,null,null,null,null,null,null,null,[1],null,null,null,null,null,null,[1],[1,null,null,[1,20],"/recommendations"],null,null,null,[1,null,1],[1,1,null,1,1]],null,[18,null,null,null,null,null,"/images/lockup.svg","/images/touchicon-180.png",null,null,null,null,null,null,null,null,null,null,null,null,null,1,null,null,null,"/images/lockup-dark-theme.svg",[]],[],null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,[6,1,14,15,20,22,23,28,29,37,43],null,[[null,null,1],[1,1]],[[null,null,null,null,null,null,null,[["G-QFRN08RN6E"],null,null,[["G-QFRN08RN6E",1]]],null,null,null,null,1],null,[[1,1],[2,2]]],null,4,null,null,null,null,null,null,null,null,null,null,null,null,null,"android.devsite.google"],null,"pk_live_5170syrHvgGVmSx9sBrnWtA5luvk9BwnVcvIi7HizpwauFG96WedXsuXh790rtij9AmGllqPtMLfhe2RSwD6Pn38V00uBCydV4m"]') </script> <devsite-a11y-announce></devsite-a11y-announce> </body> </html>

Pages: 1 2 3 4 5 6 7 8 9 10