Behavior changes: all apps

The Android 13 platform includes behavior changes that may affect your app. The following behavior changes apply to all apps when they run on Android 13, regardless of targetSdkVersion. You should test your app and then modify it as needed to support these properly, where applicable.

Make sure to also review the list of behavior changes that only affect apps targeting Android 13.

Performance and battery

Foreground Services (FGS) Task Manager

At the bottom of the notification drawer is a button that indicates the
  number of apps that are currently running in the background. When you press
  this button, a dialog appears that lists the names of different apps. The
  Stop button is to the right of each app
Figure 1. FGS Task Manager workflow on Android 13 devices.

Android 13 (API level 33) allows users to stop foreground services from the notification drawer, regardless of target SDK version. This new affordance, called the FGS Task Manager, shows a list of apps that are currently running a foreground service. This list is labeled Active apps. Next to each app is a Stop button. Figure 1 illustrates the FGS Task Manager workflow on a device that runs Android 13.

Learn more about the FGS Task Manager.

Improve prefetch job handling using JobScheduler

JobScheduler provides a way for apps to mark specific jobs as "prefetch" jobs (using JobInfo.Builder.setPrefetch()), meaning that they should ideally run close to, and before, the next app launch to improve user experience. Historically, JobScheduler has only used the signal to let prefetch jobs opportunistically use free or excess data.

In Android 13, the system now tries to determine the next time an app will be launched, and uses that estimation to run prefetch jobs. Apps should try to use prefetch jobs for any work that they want to be done prior to the next app launch.

Battery Resource Utilization

Android 13 (API level 33) introduces Battery Resource Utilization, which provides several ways for the system to better manage device battery life:

  • Updated rules on when the system places your app in the "restricted" App Standby Bucket.
  • New limitations on the work that your app can do when the user places your app in the "restricted" state for background battery usage.
  • New system notifications that warn users about long-running foreground services.

High Priority Firebase Cloud Message (FCM) Quotas

Android 13 (API level 33) updates Firebase Cloud Messaging (FCM) quotas to improve the reliability of high priority FCM delivery for apps that show notifications in response to high priority FCMs. The following has changed in Android 13 (API level 33):

  • App Standby Buckets no longer determine how many high priority FCMs an app can use.
  • High priority FCM quotas scale in proportion to the number of notifications shown to the user in response to High Priority FCMs.

As in previous versions of Android, high priority FCMs that go over the quota are downgraded to normal priority. When starting Foreground Services (FGS) in response to an FCM, we recommend checking the result of RemoteMessage.getPriority() and to confirm it is PRIORITY_HIGH and/or handling any potential ForegroundServiceStartNotAllowedException exceptions.

If your application doesn't always post notifications in response to High Priority FCMs, we recommend that you change the priority of these FCMs to normal so that the messages that result in a notification don't get downgraded.

Privacy

Runtime permission for notifications

Android 13 (API level 33) introduces a new runtime notification permission: POST_NOTIFICATIONS. This change helps users focus on the notifications that are most important to them.

We highly recommend that you target Android 13 as soon as possible to gain the effects of the additional control and flexibility of this feature.

Learn more about app permissions best practices.

Hide sensitive content from clipboard

If your app allows users to copy sensitive content, such as passwords or credit card information, to the clipboard, you must add a flag to ClipData’s ClipDescription before calling ClipboardManager#setPrimaryClip(). Adding this flag prevents sensitive content from appearing in the content preview.

Copied text preview without flagging sensitive content
Copied text preview without flagging sensitive content.
Copied text preview flagging sensitive content.
Copied text preview flagging sensitive content.

To flag sensitive content, add a boolean extra to the ClipDescription. All apps should do this, regardless of the targeted API level.


// When your app targets API level 33 or higher
clipData.apply {
    description.extras = PersistableBundle().apply {
        putBoolean(ClipDescription.EXTRA_IS_SENSITIVE, true)
    }
}

// If your app targets a lower API level
clipData.apply {
    description.extras = PersistableBundle().apply {
        putBoolean("android.content.extra.IS_SENSITIVE", true)
    }
}

To learn more about the new clipboard UI, visit the Copy and paste feature page.

Security

Migrate away from shared user ID

If your app uses the deprecated android:sharedUserId attribute and no longer depends on the attribute's functionality, you can set the android:sharedUserMaxSdkVersion attribute to 32, as shown in the following code snippet:

<manifest ...>
    <!-- To maintain backward compatibility, continue to use
         "android:sharedUserId" if you already added it to your manifest. -->
    android:sharedUserId="SHARED_PACKAGE_NAME"
    android:sharedUserMaxSdkVersion="32"
    ...
</manifest>

This new attribute tells the system that your app no longer relies on a shared user ID. If your app declares android:sharedUserMaxSdkVersion and is newly installed on devices running Android 13 or higher, your app behaves as if you never defined android:sharedUserId. Updated apps still use the existing shared user ID.

Shared user IDs cause non-deterministic behavior within the package manager. Your app should instead use proper communication mechanisms, such as services and content providers, to facilitate interoperability between shared components.

User experience

In-app language pickers

Android 13 adds a centralized location in phone settings for setting per-app language preferences. If your app supports multiple languages, we strongly recommend that you declare the android:localeConfig attribute in your app's manifest so that users can change your app's language settings in the same place that they change language settings for other apps.

Additionally, apps that currently use custom in-app language pickers should use the new APIs for per-app language preferences instead. Using the new APIs helps you ensure that users see your app in their preferred language, regardless of whether they continue to select a language through your in-app language picker, or if they select a language through their phone settings.

Apps that don't support multiple languages are not impacted by these changes.

Core functionality

Legacy copy of speech service implementation removed

Android 13 removes the SpeechService implementation—including

Voice IME, RecognitionService and an intent-based API—from the Google app.

In Android 12, the following changes occurred:

  • SpeechService functionalities were migrated to the Speech Services by Google app, which became the default SpeechService provider.
  • RecognitionService functionality was moved to the Android System Intelligence app to support on-device speech recognition.

To help maintain app compatibility on Android 12, the Google app uses a trampoline to divert traffic to the Speech Services by Google app. In Android 13, this trampoline is removed.

Apps should use the device's default provider for SpeechService, rather than hard-coding a specific app.