App-Ruhezustand

Wenn deine App auf Android 11 (API-Level 30) oder höher ausgerichtet ist und der Nutzer einige Monate lang nicht mit deiner App interagiert, wird sie vom System in den Ruhezustand versetzt. Das System optimiert den Speicherplatz statt der Leistung und schützt die Nutzerdaten. Dieses Systemverhalten ähnelt dem, wenn der Nutzer das Beenden Ihrer App über die Systemeinstellungen manuell erzwingt.

Auswirkungen des Winterschlafs

Wie in Tabelle 1 dargestellt, hängen die Auswirkungen des Ruhezustands von der SDK-Zielversion Ihrer App sowie vom Gerät ab, auf dem Ihre App ausgeführt wird:

Tabelle 1 Auswirkungen des Ruhezustands auf Ihre App
SDK-Zielversion Eigenschaften des Geräts Hibernation-Effekte
Android 12 oder höher Mit Android 12 oder höher

Die Laufzeitberechtigungen Ihrer App werden zurückgesetzt. Diese Aktion hat denselben Effekt, als wenn der Nutzer eine Berechtigung in den Systemeinstellungen angezeigt und die Zugriffsebene Ihrer App in Ablehnen geändert hätte.

Ihre Anwendung kann im Hintergrund keine Jobs oder Benachrichtigungen ausführen.

Ihre App kann keine Push-Benachrichtigungen empfangen, einschließlich Nachrichten mit hoher Priorität, die über Firebase Cloud Messaging gesendet werden.

Alle Dateien im Cache der Anwendung werden entfernt.

Android 11 Mit Android 11 Die Laufzeitberechtigungen Ihrer App wurden zurückgesetzt.
Android 11 Android 6.0 (API-Level 23) bis Android 10 (API-Level 29) ist kompatibel und wird durch Google Play-Dienste bereitgestellt.

Die Laufzeitberechtigungen Ihrer App wurden zurückgesetzt.

Dieses Verhalten tritt im Dezember 2021 in Kraft. In diesem Blogpost erfährst du mehr über das automatische Zurücksetzen von Berechtigungen für Milliarden weitere Geräte.

Systemverhalten, wenn eine App den Ruhezustand verlässt

Wenn der Nutzer das nächste Mal mit Ihrer Anwendung interagiert, wird der Ruhezustand beendet und es können wieder Jobs, Warnungen und Benachrichtigungen erstellt werden.

Folgendes wird jedoch nicht für Ihre App ausgeführt:

  1. Erteilen Sie die Laufzeitberechtigungen Ihrer App noch einmal.

    Der Nutzer muss diese Berechtigungen für Ihre App noch einmal erteilen.

  2. Verschieben Sie alle Jobs, Warnungen und Benachrichtigungen, die geplant wurden, bevor Ihre Anwendung in den Ruhezustand wechselte.

    Verwenden Sie WorkManager, um diesen Workflow einfacher zu unterstützen. Sie können dem Übertragungsempfänger ACTION_BOOT_COMPLETED auch eine Logik für die Neuplanung hinzufügen. Diese wird aufgerufen, wenn Ihre App den Ruhezustand beendet und das Gerät hochgefahren wird.

App-Nutzung

Die folgenden Abschnitte enthalten Beispiele für die App-Nutzung sowie Beispiele für Aktionen, die vom System nicht als App-Nutzung betrachtet werden.

Beispiele für die App-Nutzung

Wenn eine Aktivität in Ihrer Anwendung fortgesetzt wird, betrachtet das System dieses Ereignis als Nutzerinteraktion. Daher verlängert sich die Zeitspanne, in der Ihre Anwendung in den Ruhezustand wechselt.

Unter Android 11 und höher werden auch die folgenden Verhaltensweisen als Nutzerinteraktionen betrachtet:

  • Der Nutzer interagiert mit einem Widget.
  • Der Nutzer interagiert mit einer Benachrichtigung, außer dass die Benachrichtigung geschlossen wird.

Es ist zu beachten, dass für die Verwendung von Apps im Ruhezustand keine Nutzerinteraktion explizit erforderlich ist. Auch wenn eine Komponente des Pakets aufgerufen wird, gilt dies als Anwendungsnutzung. Hier einige Beispiele:

  • Apps, bei denen ein Dienst oder Contentanbieter an eine andere App auf dem Gerät oder Betriebssystem gebunden ist Beispiele: Input Method Editors (IMEs) oder Passwortmanager.
  • Übertragungsempfänger im Paket, die eine explizite Übertragung von einem externen Paket empfangen.

Keine Beispiele

Wenn Ihre App immer nur die in der folgenden Liste beschriebenen Verhaltensweisen aufweist, wechselt sie nach einigen Monaten in den Ruhezustand:

Systemausnahmen vom Ruhezustand

Bei Android werden in bestimmten Anwendungsfällen Ausnahmen vom App-Ruhezustand auf Systemebene gewährt. Wenn Ihre App in eine der folgenden Kategorien fällt, ist sie von den App-Nutzungsstandards ausgenommen und wechselt nicht in den Ruhezustand.

Apps, die nicht in der Übersicht angezeigt werden
Alle Apps, die im Launcher keine aktive Verknüpfungskachel haben.
Apps mit Android Work-Profil
Jede App, die ein Nutzer über ein Arbeitsprofil installiert. Wenn sich dieselbe App auch in einem privaten Profil befindet, ist nur die Arbeitsprofil-App ausgenommen.
Device Policy Controller
Apps, mit denen lokale Geräterichtlinien und Systemanwendungen auf Geräten gesteuert werden
Vom Mobilfunkanbieter privilegierte Apps
Alle Apps, die von Mobilfunkanbietern vorab auf Geräten geladen werden und für vertragliche Verpflichtungen als notwendig erachtet werden, z. B. Mailbox- oder Kundenservice-Apps.
Drittanbieter-Apps mit Installation
Drittanbieter-App-Shops für automatische Updates der installierten Apps bei Bedarf.

Nutzerausnahmen vom Ruhezustand

Wenn Sie davon ausgehen, dass ein wichtiger Anwendungsfall Ihrer App vom Ruhezustand betroffen ist, können Sie beim Nutzer eine Ausnahme vom Ruhezustand beantragen. Diese Ausnahme ist in Situationen nützlich, in denen der Nutzer erwartet, dass Ihre App hauptsächlich im Hintergrund ausgeführt wird, auch wenn der Nutzer nicht mit Ihrer App interagiert, z. B. wenn Ihre App eine der folgenden Aktionen ausführt:

  • Um die Sicherheit Ihrer Familie zu gewährleisten, melden Sie regelmäßig den Standort von Familienmitgliedern.
  • Synchronisieren Sie Daten zwischen einem Gerät und dem Server Ihrer App.
  • Kommunikation mit Smart-Home-Geräten wie einem Fernseher
  • Führen Sie ein Pairing mit Begleitgeräten wie einer Uhr durch.

Führen Sie die Schritte in den folgenden Abschnitten aus, um eine Ausnahme zu beantragen.

Prüfen, ob der Nutzer den Ruhezustand für Ihre App bereits deaktiviert hat

Verwenden Sie die getUnusedAppRestrictionsStatus() API, um zu prüfen, ob der Nutzer den Ruhezustand für Ihre Anwendung bereits deaktiviert hat.

Weitere Informationen zur Verwendung dieser API in Ihrer Anwendung finden Sie im API-Codebeispiel auf dieser Seite.

Nutzer bitten, den Ruhezustand für Ihre App zu deaktivieren

Wenn der Nutzer den Ruhezustand für Ihre Anwendung noch nicht deaktiviert hat, können Sie eine Anfrage an ihn senden. Führen Sie dazu die folgenden Schritte aus:

  1. Zeigt eine Benutzeroberfläche an, auf der der Nutzer erläutert wird, warum er den Ruhezustand für Ihre App deaktivieren muss.
  2. Rufen Sie die createManageUnusedAppRestrictionsIntent() API auf, wie im API-Codebeispiel gezeigt. Diese API erstellt einen Intent, mit dem der Bildschirm App info (App-Info) in den Einstellungen geladen wird. Hier können Nutzer den Ruhezustand für Ihre App deaktivieren.

    Es ist wichtig, dass Sie beim Senden dieses Intents startActivityForResult() und nicht startActivity() aufrufen.

    Wie in Tabelle 2 dargestellt, hängen der Speicherort und der Name der Option von den Eigenschaften des Geräts ab, auf dem die App installiert ist:

    Tabelle 2 Option, die den Ruhezustand für Ihre App deaktiviert
    Eigenschaften des Geräts Seite, auf der die Option angezeigt wird Name der zu deaktivierenden Option
    Mit Android 13 oder höher App-Informationen App-Aktivitäten bei Nichtnutzung pausieren
    Mit Android 12 App-Informationen Berechtigungen entfernen und Speicherplatz freigeben
    Mit Android 11 App-Info > Berechtigungen Berechtigungen entfernen, wenn die App nicht verwendet wird
    Das Gerät ist mit Android 6.0 bis Android 10 (einschließlich) und bereitgestellt durch Google Play-Dienste kompatibel. Play App > Menü > Play Protect > Berechtigungen für nicht verwendete Apps Berechtigungen entfernen, wenn die App nicht verwendet wird

API-Codebeispiel

In diesem Codebeispiel wird gezeigt, wie Sie prüfen können, ob der Ruhezustand für Ihre App aktiviert ist. Außerdem erfahren Sie, wie Sie Nutzer auffordern, den Ruhezustand für Ihre App zu deaktivieren.

Kotlin

val future: ListenableFuture<Int> =
    PackageManagerCompat.getUnusedAppRestrictionsStatus(context)
future.addListener({ onResult(future.get()) }, ContextCompat.getMainExecutor(context))

fun onResult(appRestrictionsStatus: Int) {
  when (appRestrictionsStatus) {
    // Couldn't fetch status. Check logs for details.
    ERROR -> { }

    // Restrictions don't apply to your app on this device.
    FEATURE_NOT_AVAILABLE -> { }

    // The user has disabled restrictions for your app.
    DISABLED -> { }

    // If the user doesn't start your app for a few months, the system will
    // place restrictions on it. See the API_* constants for details.
    API_30_BACKPORT, API_30, API_31 -> handleRestrictions(appRestrictionsStatus)
  }
}

fun handleRestrictions(appRestrictionsStatus: Int) {
  // If your app works primarily in the background, you can ask the user
  // to disable these restrictions. Check if you have already asked the
  // user to disable these restrictions. If not, you can show a message to
  // the user explaining why permission auto-reset or app hibernation should be
  // disabled. Then, redirect the user to the page in system settings where they
  // can disable the feature.
  val intent = IntentCompat.createManageUnusedAppRestrictionsIntent(context, packageName)

  // You must use startActivityForResult(), not startActivity(), even if
  // you don't use the result code returned in onActivityResult().
  startActivityForResult(intent, REQUEST_CODE)
}

Legacy-Plattform-API

Das Betriebssystem enthält auch eine API für die Interaktion mit der Ruhezustandsfunktion. Die API funktioniert jedoch nur auf Geräten mit Android 11 oder höher. Die API unterstützt keine Ruhezustandsfunktionen, die auf frühere Android-Versionen zurückportiert werden. Daher raten wir von der Verwendung der API ab.

Wenn Sie die API aus Kompatibilitätsgründen vorübergehend weiter verwenden müssen, finden Sie sie in der folgenden Liste:

Ruhezustand manuell aufrufen

So testen Sie, wie sich Ihre App verhält, nachdem sie vom System in den Ruhezustand versetzt wurde:

  1. (Nur Android 12 und höher) Aktivieren Sie auf Ihrem Gerät den Ruhezustand:

    adb shell device_config put app_hibernation app_hibernation_enabled true
    
  2. Legen Sie die Standardzeit fest, die das System auf den Ruhezustand wartet. So können Sie sie nach dem Testen wiederherstellen:

    threshold=$(adb shell device_config get permissions \
      auto_revoke_unused_threshold_millis2)
    
  3. Verkürzen Sie die Wartezeit des Systems. Im folgenden Beispiel wurde das System so geändert, dass Ihre Anwendung nur eine Sekunde nach dem Beenden der Interaktion mit der Anwendung in den Ruhezustand wechselt:

    adb shell device_config put permissions \
      auto_revoke_unused_threshold_millis2 1000
    
  4. Warten Sie mit dem folgenden Befehl, bis alle Broadcasts beim Starten auf dem Testgerät abgeschlossen sind:

    adb shell am wait-for-broadcast-idle
    

    Wenn die Broadcasts beendet sind, gibt dieser Befehl die folgende Nachricht zurück: All broadcast queues are idle!

  5. Rufen Sie den Ruhezustand der Anwendung manuell auf:

    adb shell cmd jobscheduler run -u 0 -f \
      com.google.android.permissioncontroller 2
    
  6. (Nur Android 12 und höher) Überprüfe mit einer der folgenden Methoden, ob sich die App im Ruhezustand befindet:

    • Beachten Sie, dass das Testgerät jetzt eine Benachrichtigung anzeigt, die darauf hinweist, dass nicht verwendete Apps im Ruhezustand sind.
    • Führen Sie den folgenden Befehl aus:

      adb shell cmd app_hibernation get-state PACKAGE-NAME
      
  7. Stellen Sie die Standarddauer wieder her, die das System wartet, bevor Ihre Anwendung in den Ruhezustand versetzt wird:

    adb shell device_config put permissions \
      auto_revoke_unused_threshold_millis2 $threshold