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:
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:
Erteilen Sie die Laufzeitberechtigungen Ihrer App noch einmal.
Der Nutzer muss diese Berechtigungen für Ihre App noch einmal erteilen.
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:
- Führt einen geplanten Job mit
JobScheduler
aus. - Empfängt eine implizite Übertragung.
- Stellt Wecker
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:
- Zeigt eine Benutzeroberfläche an, auf der der Nutzer erläutert wird, warum er den Ruhezustand für Ihre App deaktivieren muss.
-
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 nichtstartActivity()
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:
- So prüfen Sie, ob der Ruhezustand für Ihre App deaktiviert ist:
isAutoRevokeWhitelisted()
- Wenn Sie den Nutzer zur Seite mit den Einstellungen für den Ruhezustand weiterleiten möchten, erstellen Sie mit
ACTION_APPLICATION_DETAILS_SETTINGS
einen Intent
Ruhezustand manuell aufrufen
So testen Sie, wie sich Ihre App verhält, nachdem sie vom System in den Ruhezustand versetzt wurde:
(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
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)
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
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!
Rufen Sie den Ruhezustand der Anwendung manuell auf:
adb shell cmd jobscheduler run -u 0 -f \ com.google.android.permissioncontroller 2
(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
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