Optimiser la consommation des données réseau

Pendant la durée de vie d'un smartphone, le coût d'un forfait de données mobiles peut facilement dépasser celui de l'appareil lui-même. Sur les appareils équipés d'Android version 7.0 (niveau d'API 24) ou ultérieure, les utilisateurs peuvent activer l'économiseur de données sur l'appareil pour diminuer et optimiser la consommation de données. Cette fonctionnalité est particulièrement utile en itinérance, vers la fin du cycle de facturation ou dans le cas d'un petit pack de données prépayé.

Lorsqu'un utilisateur active l'économiseur de données dans les paramètres et que l'appareil est connecté à un réseau facturé à l'usage, le système bloque la consommation des données en arrière-plan et indique aux applications d'utiliser moins de données au premier plan lorsque cela est possible. Les utilisateurs peuvent autoriser des applications spécifiques à utiliser les données facturées à l'usage en arrière-plan même lorsque l'économiseur de données est activé.

Android 7.0 (niveau d'API 24) étend l'API ConnectivityManager pour permettre aux applications de récupérer les préférences de l'utilisateur concernant l'économiseur de données et de surveiller les modifications de préférences. Il est recommandé de faire en sorte que les applications vérifient si l'utilisateur a activé l'économiseur de données et limitent la consommation de données au premier plan et en arrière-plan.

Vérifier les préférences de l'économiseur de données

Sur Android version 7.0 (niveau d'API 24) ou ultérieure, les applications peuvent utiliser l'API ConnectivityManager pour déterminer les restrictions de consommation de données qui sont en vigueur. La méthode getRestrictBackgroundStatus() renvoie l'une des valeurs suivantes :

RESTRICT_BACKGROUND_STATUS_DISABLED
L'économiseur de données est désactivé.
RESTRICT_BACKGROUND_STATUS_ENABLED
L'utilisateur a activé l'économiseur de données pour cette application. Les applications doivent s'efforcer de limiter la consommation de données au premier plan et de gérer de manière optimale les restrictions de consommation de données en arrière-plan.
RESTRICT_BACKGROUND_STATUS_WHITELISTED
L'économiseur de données est activé, mais l'application est autorisée à l'ignorer. Les applications doivent toujours s'efforcer de limiter la consommation des données au premier plan et en arrière-plan.

Limitez la consommation des données chaque fois que l'appareil est connecté à un réseau facturé à l'usage, même si l'économiseur de données est désactivé ou si l'application est autorisée à l'ignorer. L'exemple de code suivant utilise ConnectivityManager.isActiveNetworkMetered() et ConnectivityManager.getRestrictBackgroundStatus() pour déterminer la quantité de données que l'application doit utiliser :

Kotlin

(getSystemService(Context.CONNECTIVITY_SERVICE) as ConnectivityManager).apply {
    // Checks if the device is on a metered network
    if (isActiveNetworkMetered) {
        // Checks user’s Data Saver settings.
        when (restrictBackgroundStatus) {
            RESTRICT_BACKGROUND_STATUS_ENABLED -> {
                // Background data usage is blocked for this app. Wherever possible,
                // the app should also use less data in the foreground.
            }
            RESTRICT_BACKGROUND_STATUS_WHITELISTED -> {
                // The app is allowed to bypass Data Saver. Nevertheless, wherever possible,
                // the app should use less data in the foreground and background.
            }
            RESTRICT_BACKGROUND_STATUS_DISABLED -> {
                // Data Saver is disabled. Since the device is connected to a
                // metered network, the app should use less data wherever possible.
            }
        }
    } else {
        // The device is not on a metered network.
        // Use data as required to perform syncs, downloads, and updates.
    }
}

Java

ConnectivityManager connMgr = (ConnectivityManager)
        getSystemService(Context.CONNECTIVITY_SERVICE);
// Checks if the device is on a metered network
if (connMgr.isActiveNetworkMetered()) {
  // Checks user’s Data Saver settings.
  switch (connMgr.getRestrictBackgroundStatus()) {
    case RESTRICT_BACKGROUND_STATUS_ENABLED:
    // Background data usage is blocked for this app. Wherever possible,
    // the app should also use less data in the foreground.

    case RESTRICT_BACKGROUND_STATUS_WHITELISTED:
    // The app is allowed to bypass Data Saver. Nevertheless, wherever possible,
    // the app should use less data in the foreground and background.

    case RESTRICT_BACKGROUND_STATUS_DISABLED:
    // Data Saver is disabled. Since the device is connected to a
    // metered network, the app should use less data wherever possible.
  }
} else {
  // The device is not on a metered network.
  // Use data as required to perform syncs, downloads, and updates.
}

Remarque : Ce comportement est différent sur Android TV. Android TV limite l'utilisation en arrière-plan au lieu de la bloquer. Les applications sont limitées à 800 kbit/s au premier plan et à 10 kbit/s en arrière-plan. Utilisez ConnectivityManager.isActiveNetworkMetered() pour détecter quand limiter la consommation des données sur le téléviseur.

Demander des autorisations de consommation de données

Si votre application doit utiliser des données en arrière-plan, elle peut demander des autorisations de consommation de données en envoyant un intent de Settings.ACTION_IGNORE_BACKGROUND_DATA_RESTRICTIONS_SETTINGS contenant un URI du nom de package de votre application ; par exemple : package:MY_APP_ID.

L'envoi de l'intent et de l'URI lance l'application Paramètres et affiche les paramètres de consommation des données de votre application. L'utilisateur peut ensuite décider d'activer ou non les données en arrière-plan pour votre application. Avant d'envoyer cet intent, il est recommandé de demander d'abord à l'utilisateur s'il souhaite lancer l'application Paramètres afin d'activer la consommation des données en arrière-plan.

Surveiller les modifications apportées aux préférences de l'économiseur de données

Les applications peuvent surveiller les modifications apportées aux préférences de l'économiseur de données en créant un élément BroadcastReceiver pour écouter ConnectivityManager.ACTION_RESTRICT_BACKGROUND_CHANGED et en enregistrant de manière dynamique le récepteur avec Context.registerReceiver(). Lorsqu'une application reçoit cette annonce, elle doit vérifier si les nouvelles préférences de l'économiseur de données affectent ses autorisations en appelant ConnectivityManager.getRestrictBackgroundStatus().

Remarque : Le système n'envoie cette annonce qu'aux applications qui s'y inscrivent de manière dynamique avec Context.registerReceiver(). Les applications qui s'inscrivent à cette annonce dans leur fichier manifeste ne la recevront pas.

Tester avec les commandes Android Debug Bridge

Android Debug Bridge (ADB) fournit quelques commandes que vous pouvez utiliser pour tester votre application dans les conditions de l'économiseur de données. Vous pouvez vérifier et configurer les autorisations réseau ou définir les réseaux sans fil comme étant facturés à l'usage pour tester votre application sur des réseaux sans compteur.

$ adb shell dumpsys netpolicy
Génère un rapport qui inclut le paramètre actuel de restriction réseau globale en arrière-plan, les identifiants uniques des packages qui sont actuellement autorisés à ignorer l'économiseur de données et les autorisations réseau des autres packages connus.
$ adb shell cmd netpolicy
Affiche la liste complète des commandes Network Policy Manager (netpolicy).
$ adb shell cmd netpolicy set restrict-background <boolean>
Active ou désactive le mode Économiseur de données lors de la transmission de true ou false, respectivement.
$ adb shell cmd netpolicy add restrict-background-whitelist <UID>
Ajoute l'identifiant unique du package spécifié à la liste d'autorisation (whitelist) pour autoriser la consommation des données facturées à l'usage en arrière-plan.
$ adb shell cmd netpolicy remove restrict-background-whitelist <UID>
Supprime l'identifiant unique du package spécifié de la liste d'autorisation (whitelist) pour bloquer la consommation des données facturées à l'usage en arrière-plan lorsque l'économiseur de données est activé.
$ adb shell cmd netpolicy list wifi-networks
Liste tous les réseaux Wi-Fi et indique s'ils sont facturés à l'usage.
$ adb shell cmd netpolicy set metered-network <WIFI_SSID> true
Définit le Wi-Fi avec le SSID spécifié comme facturé à l'usage, ce qui vous permet de simuler un réseau facturé à l'usage sur un réseau non facturé à l'usage.