Wenn Ihre App auf Android 11 (API‑Level 30) oder höher ausgerichtet ist und der Nutzer einige Monate lang nicht mit Ihrer App interagiert, versetzt das System Ihre App in den Ruhezustand. Das System ist für Speicherplatz statt für Leistung optimiert und schützt Nutzerdaten. Dieses Systemverhalten ähnelt dem, was passiert, wenn der Nutzer Ihre App manuell über die Systemeinstellungen beendet.
Auswirkungen des Ruhezustands
Wie in Tabelle 1 dargestellt, hängen die Auswirkungen des Ruhezustands von der Ziel-SDK-Version Ihrer App und dem Gerät ab, auf dem Ihre App ausgeführt wird:
SDK-Zielversion | Geräteeigenschaften | Auswirkungen des Winterschlafs |
---|---|---|
Android 12 oder höher | Auf dem Gerät muss Android 12 oder höher installiert sein. |
Die Laufzeitberechtigungen Ihrer App werden zurückgesetzt. Diese Aktion hat dieselbe Wirkung, als ob der Nutzer eine Berechtigung in den Systemeinstellungen aufgerufen und die Zugriffsebene Ihrer App in Verweigern geändert hätte. Ihre App kann keine Jobs oder Benachrichtigungen im Hintergrund 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 App werden entfernt. |
Android 11 | Mit Android 11 | Die Laufzeitberechtigungen Ihrer App werden zurückgesetzt. |
Android 11 | Auf dem Gerät wird Android 6.0 (API‑Level 23) bis Android 10 (API‑Level 29) ausgeführt und es nutzt Google Play-Dienste. |
Die Laufzeitberechtigungen Ihrer App werden zurückgesetzt. Dieses Verhalten tritt im Dezember 2021 in Kraft. Weitere Informationen |
Systemverhalten, wenn eine App aus dem Ruhezustand beendet wird
Wenn der Nutzer das nächste Mal mit Ihrer App interagiert, wird der Ruhezustand der App beendet und sie kann wieder Jobs, Benachrichtigungen und Hinweise erstellen.
Das System führt jedoch nicht die folgenden Aktionen für Ihre App aus:
Erteilen Sie die Laufzeitberechtigungen Ihrer App noch einmal.
Der Nutzer muss diese Berechtigungen für Ihre App noch einmal erteilen.
Planen Sie alle Jobs, Benachrichtigungen und Mitteilungen neu, die vor dem Ruhezustand Ihrer App geplant waren.
Um diesen Workflow zu vereinfachen, verwenden Sie WorkManager. Sie können auch eine Logik zum Verschieben von Terminen im
ACTION_BOOT_COMPLETED
-Broadcast-Receiver hinzufügen, der aufgerufen wird, wenn Ihre App den Ruhezustand verlässt und nach dem Hochfahren des Geräts.
App-Nutzung
In den folgenden Abschnitten finden Sie Beispiele für die App-Nutzung sowie Beispiele für Aktionen, die das System nicht als App-Nutzung betrachtet.
Beispiele für die App-Nutzung
Wenn eine Aktivität in Ihrer App fortgesetzt wird, betrachtet das System dieses Ereignis als Nutzerinteraktion. Daher verlängert das System die Zeit, bis Ihre App in den Ruhezustand wechselt.
Unter Android 11 und höher gelten auch die folgenden Verhaltensweisen als Nutzerinteraktionen:
- Der Nutzer interagiert mit einem Widget.
Der Nutzer interagiert mit einer Benachrichtigung, außer wenn er die Benachrichtigung schließt.
Die App-Nutzung für den Ruhezustand erfordert nicht explizit eine Nutzerinteraktion. Solange eine Komponente des Pakets aufgerufen wird, gilt dies weiterhin als App-Nutzung. Dazu gehören unter anderem:
- Apps, die einen Dienst oder Contentanbieter haben, der durch eine andere App auf dem Gerät oder das Betriebssystem gebunden ist. Dazu gehören beispielsweise Eingabemethoden-Editoren (IMEs) oder Passwortmanager.
Broadcast-Empfänger im Paket, die einen expliziten Broadcast von einem externen Paket empfangen.
Keine Beispiele
Wenn Ihre App nur die in der folgenden Liste beschriebenen Verhaltensweisen aufweist, wird sie nach einigen Monaten in den Ruhezustand versetzt:
- Führt einen geplanten Job mit
JobScheduler
aus. - Empfängt einen impliziten Broadcast.
- Wecker planen:
Systemausnahmen vom Ruhezustand
Android gewährt in bestimmten Anwendungsfällen Ausnahmen auf Systemebene für den Ruhezustand von Apps. Wenn Ihre App in eine der folgenden Kategorien fällt, ist sie von den Standards für die App-Nutzung ausgenommen und wird nicht in den Ruhezustand versetzt.
- Apps werden nicht im Launcher angezeigt
- Alle Apps, die keine aktive Verknüpfungskachel im Launcher haben.
- Apps mit Android Work-Profil
- Alle Apps, die ein Nutzer in einem Arbeitsprofil installiert. Wenn dieselbe App auch in einem persönlichen Profil vorhanden ist, ist nur die Arbeitsprofil-App ausgenommen.
- Device Policy Controller
- Apps, die lokale Geräterichtlinien und Systemanwendungen auf Geräten steuern.
- Apps mit Mobilfunkanbieterberechtigungen
- Apps, die von Mobilfunkanbietern auf Geräten vorinstalliert werden und die für vertragliche Serviceverpflichtungen erforderlich sind, z. B. Voicemail- oder Kundenservice-Apps.
- Drittanbieter-Installations-Apps
- App-Shops von Drittanbietern für automatische Updates der installierten Apps, wenn nötig.
Nutzerausnahmen für den Ruhezustand
Wenn Sie davon ausgehen, dass ein wichtiger Anwendungsfall in Ihrer App durch den Ruhezustand beeinträchtigt wird, können Sie vom Nutzer eine Ausnahme vom Ruhezustand der App anfordern. Diese Ausnahme ist nützlich, wenn der Nutzer erwartet, dass Ihre App hauptsächlich im Hintergrund funktioniert, auch wenn er nicht mit ihr interagiert, z. B. wenn Ihre App Folgendes tut:
- Für die Sicherheit der Familie sorgen, indem der Standort von Familienmitgliedern regelmäßig gemeldet wird.
- Daten zwischen einem Gerät und dem Server Ihrer App synchronisieren
- Mit Smart-Home-Geräten wie einem Fernseher kommunizieren
- Mit Companion-Geräten wie einer Smartwatch koppeln
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
Mit der getUnusedAppRestrictionsStatus()
API können Sie prüfen, ob der Nutzer den Ruhezustand für Ihre App bereits deaktiviert hat.
Weitere Informationen zur Verwendung dieser API in Ihrer App finden Sie auf dieser Seite im API-Codebeispiel.
Nutzer bitten, den Ruhezustand für Ihre App zu deaktivieren
Wenn der Nutzer den Ruhezustand für Ihre App noch nicht deaktiviert hat, können Sie eine Anfrage an ihn senden. Führen Sie dazu die folgenden Schritte aus:
- Zeigen Sie eine Benutzeroberfläche an, auf der dem Nutzer erklärt wird, warum er den Ruhezustand für Ihre App deaktivieren muss.
-
Rufen Sie die
createManageUnusedAppRestrictionsIntent()
API auf, wie im API-Codebeispiel gezeigt. Mit dieser API wird eine Absicht erstellt, mit der der Bildschirm App-Info in den Einstellungen geladen wird. Hier kann der Nutzer den Ruhezustand für Ihre App deaktivieren.Es ist wichtig, dass Sie beim Senden dieses Intents
startActivityForResult()
und nichtstartActivity()
aufrufen.Wie in Tabelle 2 zu sehen ist, hängen der Speicherort und der Name der Option von den Merkmalen des Geräts ab, auf dem Ihre App installiert ist:
Tabelle 2 Option zum Deaktivieren des Ruhezustands für Ihre App Geräteeigenschaften Seite, auf der die Option angezeigt wird Name der Option, die deaktiviert werden soll Auf dem Gerät muss Android 13 oder höher installiert sein. App-Informationen App-Aktivität bei Nichtnutzung stoppen Mit Android 12 App-Informationen Berechtigungen löschen und Speicherplatz freigeben Mit Android 11 App-Info > Berechtigungen Berechtigungen entfernen, wenn die App nicht verwendet wird Auf dem Gerät wird Android 6.0 bis Android 10 ausgeführt und es wird von den Google Play-Diensten unterstützt. 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, ob der Ruhezustand für Ihre App aktiviert ist, und wie Sie Nutzer richtig 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 Funktion für den Ruhezustand. Die API funktioniert jedoch nur auf Geräten mit Android 11 oder höher. Die in früheren Android-Versionen backportierten Funktionen für den Ruhezustand werden von der API nicht verarbeitet. Daher raten wir von der Verwendung der API ab.
Wenn Sie die API vorübergehend aus Kompatibilitätsgründen weiterhin verwenden müssen, finden Sie in der folgenden Liste Informationen dazu:
- So prüfen Sie, ob der Ruhezustand für Ihre App deaktiviert ist:
isAutoRevokeWhitelisted()
- So leiten Sie den Nutzer zur Seite mit den Einstellungen für den Ruhezustand weiter: Erstellen Sie einen Intent mit
ACTION_APPLICATION_DETAILS_SETTINGS
.
Ruhezustandsverhalten manuell aufrufen
So testen Sie, wie sich Ihre App verhält, nachdem das System sie in den Ruhezustand versetzt hat:
Nur Android 12 und höher: Aktiviere das Verhalten im Ruhezustand auf deinem Gerät:
adb shell device_config put app_hibernation app_hibernation_enabled true
Legen Sie die Standardzeit fest, die das System wartet, bevor es in den Ruhezustand wechselt. So können Sie sie nach dem Testen wiederherstellen:
threshold=$(adb shell device_config get permissions \ auto_revoke_unused_threshold_millis2)
Verkürzen Sie die Wartezeit des Systems. Im folgenden Beispiel wird das System so geändert, dass Ihre App erst eine Sekunde nach dem Beenden der Interaktion in den Ruhezustand wechselt:
adb shell device_config put permissions \ auto_revoke_unused_threshold_millis2 1000
Warten Sie, bis alle Boot-Time-Broadcasts auf Ihrem Testgerät abgeschlossen sind. Führen Sie dazu den folgenden Befehl aus:
adb shell am wait-for-broadcast-idle
Wenn die Übertragungen abgeschlossen sind, gibt dieser Befehl die folgende Meldung zurück:
All broadcast queues are idle!
So rufen Sie den App-Ruhezustand manuell auf:
adb shell cmd jobscheduler run -u 0 -f \ com.google.android.permissioncontroller 2
(Nur Android 12 und höher) Prüfen Sie mit einer der folgenden Methoden, ob die App in den Ruhezustand versetzt wurde:
- Auf dem Testgerät wird jetzt eine Benachrichtigung angezeigt, die darauf hinweist, dass ungenutzte Apps in den Ruhezustand versetzt wurden.
Führen Sie den folgenden Befehl aus:
adb shell cmd app_hibernation get-state PACKAGE-NAME
So stellen Sie die Standardzeit wieder her, die das System wartet, bevor Ihre App in den Ruhezustand versetzt wird:
adb shell device_config put permissions \ auto_revoke_unused_threshold_millis2 $threshold