Mit Auto Backup for Apps werden die Daten eines Nutzers automatisch von Apps gesichert, die auf Android 6.0 (API-Level 23) oder höher ausgerichtet sind und darauf ausgeführt werden. Android sichert App-Daten, indem sie in das Google Drive des Nutzers hochgeladen werden. Dort sind sie durch die Anmeldedaten des Google-Kontos des Nutzers geschützt. Die Sicherung wird auf Geräten mit Android 9 oder höher mit der PIN, dem Muster oder dem Passwort des Geräts Ende-zu-Ende-verschlüsselt. Jede App kann bis zu 25 MB Sicherungsdaten pro App-Nutzer zuweisen. Für das Speichern von Sicherungsdaten fallen keine Gebühren an. Ihre App kann den Sicherungsprozess anpassen oder ihn durch Deaktivieren von Sicherungen deaktivieren.
Eine Übersicht über die Sicherungsoptionen von Android und Informationen dazu, welche Daten gesichert und wiederhergestellt werden sollten, finden Sie in der Übersicht zur Datensicherung.
Dateien, die gesichert werden
Standardmäßig umfasst das automatische Back-up Dateien in den meisten Verzeichnissen, die Ihrem Gerät vom System zugewiesen werden:
Dateien mit freigegebenen Einstellungen
Dateien, die im internen Speicher Ihrer App gespeichert und über
getFilesDir()odergetDir(String, int)aufgerufen werdenDateien im Verzeichnis, das von
getDatabasePath(String)zurückgegeben wird, einschließlich Dateien, die mit der KlasseSQLiteOpenHelpererstellt wurdenDateien auf externem Speicher im Verzeichnis, das von
getExternalFilesDir(String)zurückgegeben wird
Bei der automatischen Sicherung werden Dateien in Verzeichnissen ausgeschlossen, die von getCacheDir(), getCodeCacheDir() und getNoBackupFilesDir() zurückgegeben werden. Die an diesen Speicherorten gespeicherten Dateien werden nur vorübergehend benötigt und sind bewusst von Sicherungsvorgängen ausgeschlossen.
Sie können Ihre App so konfigurieren, dass bestimmte Dateien ein- und ausgeschlossen werden. Weitere Informationen finden Sie im Abschnitt Dateien ein- und ausschließen.
Speicherort der Sicherung
Sicherungsdaten werden in einem privaten Ordner im Google Drive-Konto des Nutzers gespeichert. Das Limit liegt bei 25 MB pro App. Die gespeicherten Daten werden nicht auf das persönliche Google Drive-Kontingent des Nutzers angerechnet. Es wird nur die letzte Sicherung gespeichert. Wenn eine Sicherung erstellt wird, wird jede vorherige Sicherung gelöscht. Die Sicherungsdaten können vom Nutzer oder anderen Apps auf dem Gerät nicht gelesen werden.
Nutzer können in der Google Drive App für Android eine Liste der Apps aufrufen, die gesichert wurden. Auf einem Android-Gerät finden sie diese Liste in der Drive App im Navigationsmenü unter Einstellungen > Sichern und zurücksetzen.
Sicherungen aus jedem Zeitraum der Geräteeinrichtung werden in separaten Datasets gespeichert, wie in den folgenden Beispielen beschrieben:
Wenn der Nutzer zwei Geräte besitzt, gibt es für jedes Gerät ein Sicherungs-Dataset.
Wenn ein Nutzer ein Gerät auf die Werkseinstellungen zurücksetzt und es dann mit demselben Konto einrichtet, wird die Sicherung in einem neuen Dataset gespeichert. Veraltete Datasets werden nach einer bestimmten Zeit der Inaktivität automatisch gelöscht.
Zeitplan für die Sicherung
Sicherungen werden automatisch erstellt, wenn alle folgenden Bedingungen erfüllt sind:
- Der Nutzer hat die Sicherung auf dem Gerät aktiviert. In Android 9 befindet sich diese Einstellung unter Einstellungen > System > Sicherung.
- Seit der letzten Sicherung sind mindestens 24 Stunden vergangen.
- Das Gerät ist inaktiv.
- Das Gerät ist mit einem WLAN verbunden (sofern der Gerätenutzer keine Sicherungen über mobile Daten aktiviert hat).
In der Praxis treten diese Bedingungen ungefähr jede Nacht auf. Es kann aber auch sein, dass ein Gerät nie gesichert wird, z. B. wenn es nie mit einem Netzwerk verbunden ist. Um Netzwerkbandbreite zu sparen, erfolgt der Upload nur, wenn sich die App-Daten geändert haben.
Während der automatischen Sicherung wird die App vom System geschlossen, damit sie nicht mehr in das Dateisystem schreibt. Standardmäßig werden Apps, die im Vordergrund ausgeführt werden, vom Sicherungssystem ignoriert, um eine schlechte Nutzererfahrung zu vermeiden. Sie können das Standardverhalten überschreiben, indem Sie das Attribut android:backupInForeground auf „true“ setzen.
Um das Testen zu vereinfachen, bietet Android Tools, mit denen Sie manuell eine Sicherung Ihrer App starten können. Weitere Informationen finden Sie unter Sichern und Wiederherstellen testen.
Programm wiederherstellen
Daten werden immer dann wiederhergestellt, wenn die App installiert wird, unabhängig davon, ob dies über den Play Store, während der Geräteeinrichtung (wenn das System zuvor installierte Apps installiert) oder durch Ausführen von adb install erfolgt. Die Wiederherstellung erfolgt nach der Installation des APK, aber bevor die App vom Nutzer gestartet werden kann.
Während des Einrichtungsassistenten für das Gerät wird dem Nutzer eine Liste der verfügbaren Sicherungs-Datasets angezeigt und er wird gefragt, von welchem er Daten wiederherstellen möchte. Das ausgewählte Sicherungs-Dataset wird zum übergeordneten Dataset für das Gerät. Das Gerät kann Daten entweder aus seinen eigenen Sicherungen oder aus dem ursprünglichen Dataset wiederherstellen. Wenn Sicherungen aus beiden Quellen verfügbar sind, wird die Sicherung des Geräts priorisiert. Wenn der Nutzer den Einrichtungsassistenten für das Gerät nicht durchlaufen hat, kann das Gerät nur aus seinen eigenen Sicherungen wiederhergestellt werden.
Um das Testen zu vereinfachen, bietet Android Tools, mit denen Sie die Wiederherstellung Ihrer App manuell starten können. Weitere Informationen finden Sie unter Sichern und Wiederherstellen testen.
Sicherung aktivieren und deaktivieren
Apps, die auf Android 6.0 (API-Level 23) oder höher ausgerichtet sind, nehmen automatisch an der automatischen Sicherung teil. Legen Sie in der App-Manifestdatei den booleschen Wert android:allowBackup fest, um die Sicherung zu aktivieren oder zu deaktivieren. Der Standardwert ist true. Wir empfehlen jedoch, das Attribut explizit in Ihrem Manifest festzulegen, wie im folgenden Beispiel gezeigt:
<manifest ... >
...
<application android:allowBackup="true" ... >
...
</application>
</manifest>
Sie können Sicherungen deaktivieren, indem Sie android:allowBackup auf false setzen. Das ist beispielsweise sinnvoll, wenn der Status Ihrer App über einen anderen Mechanismus wiederhergestellt werden kann oder wenn Ihre App vertrauliche Informationen verarbeitet.
Dateien ein- und ausschließen
Standardmäßig werden fast alle App-Daten gesichert. Weitere Informationen finden Sie im Abschnitt zu Dateien, die gesichert werden.
Je nach Übertragungstyp können Sie festlegen, welche Daten in die Sicherung aufgenommen werden.
Die automatische Sicherung unterstützt Cloud-Sicherungen in Google Drive und direkte Gerät-zu-Gerät-Übertragungen (D2D). Die Konfigurationsmethoden variieren je nach Android-Version und targetSdkVersion Ihrer App.
- Informationen zu Geräten mit Android 11 oder niedriger finden Sie hier.
- Auf Geräten mit Android 12 oder höher verwenden Apps, die auf API-Level 31 oder höher ausgerichtet sind, das Format
data-extraction-rules. Weitere Informationen finden Sie unter Sicherung auf Android 12 oder höher verwalten. - Das
data-extraction-rules-Format unterstützt auch plattformübergreifende Übertragungen (z.B. auf iOS). Diese Funktion ist ab Android 16 QPR2 verfügbar. Weitere Informationen
Sicherung unter Android 11 und niedriger steuern
Folgen Sie der Anleitung in diesem Abschnitt, um festzulegen, welche Dateien auf Geräten mit Android 11 (API‑Level 30) oder niedriger gesichert werden.
Fügen Sie in der Datei
AndroidManifest.xmldem Element<application>das Attributandroid:fullBackupContenthinzu, wie im folgenden Beispiel gezeigt. Dieses Attribut verweist auf eine XML-Datei, die Sicherungsregeln enthält.<application ... android:fullBackupContent="@xml/backup_rules"> </application>
Erstellen Sie im Verzeichnis
res/xml/eine XML-Datei mit dem Namen@xml/backup_rules. Fügen Sie in dieser Datei Regeln mit den Elementen<include>und<exclude>hinzu. Im folgenden Beispiel werden alle freigegebenen Einstellungen mit Ausnahme vondevice.xmlgesichert:<?xml version="1.0" encoding="utf-8"?> <full-backup-content> <include domain="sharedpref" path="."/> <exclude domain="sharedpref" path="device.xml"/> </full-backup-content>
Gerätebedingungen für die Sicherung definieren
Wenn in Ihrer App vertrauliche Informationen auf dem Gerät gespeichert werden, können Sie Bedingungen festlegen, unter denen die Daten Ihrer App in die Sicherung des Nutzers aufgenommen werden. In Android 9 (API‑Level 28) oder höher können Sie die folgenden Bedingungen hinzufügen:
clientSideEncryption: Die Sicherung des Nutzers ist mit einem clientseitigen Secret verschlüsselt. Diese Form der Verschlüsselung ist auf Geräten mit Android 9 oder höher aktiviert, sofern der Nutzer die Sicherung in Android 9 oder höher aktiviert und eine Displaysperre (PIN, Muster oder Passwort) für sein Gerät eingerichtet hat.deviceToDeviceTransfer: Der Nutzer überträgt sein Backup auf ein anderes Gerät, das lokale Gerät-zu-Gerät-Übertragung unterstützt (z. B. Google Pixel).
Wenn Sie Ihre Entwicklungsgeräte auf Android 9 aktualisiert haben, müssen Sie die Datensicherung nach dem Upgrade deaktivieren und dann wieder aktivieren. Das liegt daran, dass Android Sicherungen nur mit einem clientseitigen Secret verschlüsselt, nachdem Nutzer in den Einstellungen oder im Einrichtungsassistenten darüber informiert wurden.
Um die Einschlussbedingungen zu deklarieren, legen Sie das Attribut requireFlags in den <include>-Elementen in Ihrem Satz von Sicherungsregeln auf einen oder mehrere ausgewählte Werte fest:
backup_rules.xml
<?xml version="1.0" encoding="utf-8"?> <full-backup-content> <!-- App data isn't included in user's backup unless client-side encryption is enabled. --> <include domain="file" path="." requireFlags="clientSideEncryption" /> </full-backup-content>
Wenn Ihre App ein Schlüssel/Wert-Sicherungssystem implementiert oder Sie BackupAgent selbst implementieren, können Sie diese bedingten Anforderungen auch auf Ihre Sicherungslogik anwenden. Führen Sie dazu einen bitweisen Vergleich zwischen den Transport-Flags eines BackupDataOutput-Objekts und den FLAG_CLIENT_SIDE_ENCRYPTION_ENABLED- oder FLAG_DEVICE_TO_DEVICE_TRANSFER-Flags Ihres benutzerdefinierten Sicherungs-Agents durch.
Das folgende Code-Snippet zeigt ein Beispiel für die Verwendung dieser Methode:
Kotlin
class CustomBackupAgent : BackupAgent() { override fun onBackup(oldState: ParcelFileDescriptor?, data: BackupDataOutput?, newState: ParcelFileDescriptor?) { if (data != null) { if ((data.transportFlags and FLAG_CLIENT_SIDE_ENCRYPTION_ENABLED) != 0) { // Client-side backup encryption is enabled. } if ((data.transportFlags and FLAG_DEVICE_TO_DEVICE_TRANSFER) != 0) { // Local device-to-device transfer is enabled. } } } // Implementation of onRestore() here. }
Java
public class CustomBackupAgent extends BackupAgent { @Override public void onBackup(ParcelFileDescriptor oldState, BackupDataOutput data, ParcelFileDescriptor newState) throws IOException { if ((data.getTransportFlags() & FLAG_CLIENT_SIDE_ENCRYPTION_ENABLED) != 0) { // Client-side backup encryption is enabled. } if ((data.getTransportFlags() & FLAG_DEVICE_TO_DEVICE_TRANSFER) != 0) { // Local device-to-device transfer is enabled. } } // Implementation of onRestore() here. }
Sicherung unter Android 12 oder höher steuern
Wenn Ihre App auf Android 12 (API‑Level 31) oder höher ausgerichtet ist, folgen Sie der Anleitung in diesem Abschnitt, um festzulegen, welche Dateien auf Geräten mit Android 12 oder höher gesichert werden.
Fügen Sie in der Datei
AndroidManifest.xmldas Attributandroid:dataExtractionRulesdem Element<application>hinzu, wie im folgenden Beispiel gezeigt. Dieses Attribut verweist auf eine XML-Datei, die Sicherungsregeln enthält.<application ... android:dataExtractionRules="backup_rules.xml"> </application>
Erstellen Sie im Verzeichnis
res/xml/eine XML-Datei mit dem Namenbackup_rules.xml. Fügen Sie in dieser Datei Regeln mit den Elementen<include>und<exclude>hinzu. Im folgenden Beispiel werden alle freigegebenen Einstellungen mit Ausnahme vondevice.xmlgesichert:<?xml version="1.0" encoding="utf-8"?> <data-extraction-rules> <cloud-backup [disableIfNoEncryptionCapabilities="true|false"]> <include domain="sharedpref" path="."/> <exclude domain="sharedpref" path="device.xml"/> </cloud-backup> </data-extraction-rules>
XML-Konfigurationssyntax
Die XML-Syntax für die Konfigurationsdatei variiert je nach der Android-Version, für die Ihre App entwickelt wurde und auf der sie ausgeführt wird.
Android 11 oder niedriger
Verwenden Sie die folgende XML-Syntax für die Konfigurationsdatei, die die Sicherung für Geräte mit Android 11 oder niedriger steuert.
<full-backup-content> <include domain=["file" | "database" | "sharedpref" | "external" | "root" | "device_file" | "device_database" | "device_sharedpref" | "device_root" ] path="string" requireFlags=["clientSideEncryption" | "deviceToDeviceTransfer"] /> <exclude domain=["file" | "database" | "sharedpref" | "external" | "root" | "device_file" | "device_database" | "device_sharedpref" | "device_root" ] path="string" /> </full-backup-content>
Android 12 oder höher
Wenn Ihre App auf Android 12 (API‑Level 31) oder höher ausgerichtet ist, verwenden Sie die folgende XML-Syntax für die Konfigurationsdatei, mit der die Sicherung für Geräte mit Android 12 oder höher gesteuert wird.
<data-extraction-rules> <cloud-backup [disableIfNoEncryptionCapabilities="true|false"]> ... <include domain=["file" | "database" | "sharedpref" | "external" | "root" | "device_file" | "device_database" | "device_sharedpref" | "device_root" ] path="string"/> ... <exclude domain=["file" | "database" | "sharedpref" | "external" | "root" | "device_file" | "device_database" | "device_sharedpref" | "device_root" ] path="string"/> ... </cloud-backup> <device-transfer> ... <include domain=["file" | "database" | "sharedpref" | "external" | "root" | "device_file" | "device_database" | "device_sharedpref" | "device_root" ] path="string"/> ... <exclude domain=["file" | "database" | "sharedpref" | "external" | "root" | "device_file" | "device_database" | "device_sharedpref" | "device_root" ] path="string"/> ... </device-transfer> <cross-platform-transfer platform="ios"> ... <include domain=["file" | "database" | "sharedpref" | "external" | "root" | "device_file" | "device_database" | "device_sharedpref" | "device_root" ] path="string"/> ... <exclude domain=["file" | "database" | "sharedpref" | "external" | "root" | "device_file" | "device_database" | "device_sharedpref" | "device_root" ] path="string"/> ... <platform-specific-params bundleId="string" teamId="string" contentVersion="string"/> ... </cross-platform-transfer> </data-extraction-rules>
Jeder Abschnitt der Konfiguration (<cloud-backup>, <device-transfer>, <cross-platform-transfer>) enthält Regeln, die nur für diesen Übertragungstyp gelten. Durch diese Trennung können Sie beispielsweise eine Datei oder ein Verzeichnis aus Google Drive-Sicherungen ausschließen, sie aber trotzdem bei der Übertragung von Gerät zu Gerät (D2D) oder bei plattformübergreifenden Übertragungen übertragen. Das ist nützlich, wenn Sie Dateien haben, die zu groß sind, um in der Cloud gesichert zu werden, aber problemlos zwischen Geräten übertragen werden können.
Wenn für einen bestimmten Sicherungsmodus keine Regeln vorhanden sind, z. B. wenn der Abschnitt <device-transfer> fehlt, ist dieser Modus für alle Inhalte mit Ausnahme der Verzeichnisse no-backup und cache vollständig aktiviert, wie im Abschnitt Dateien, die gesichert werden beschrieben.
Ihre App kann das Flag disableIfNoEncryptionCapabilities im Abschnitt <cloud-backup> festlegen, damit die Sicherung nur erfolgt, wenn sie verschlüsselt werden kann, z. B. wenn der Nutzer einen Sperrbildschirm hat. Wenn Sie diese Einschränkung festlegen, werden Back-ups nicht in die Cloud gesendet, wenn das Gerät des Nutzers keine Verschlüsselung unterstützt. Da D2D-Übertragungen jedoch nicht an den Server gesendet werden, funktionieren sie auch auf Geräten, die keine Verschlüsselung unterstützen.
Syntax für Ein- und Ausschluss von Elementen
Innerhalb der Tags <full-backup-content>, <cloud-backup> und <device-transfer> (je nach Android-Version des Geräts und targetSDKVersion Ihrer App) können Sie die Elemente <include> und <exclude> definieren:
<include>Gibt eine Datei oder einen Ordner an, die gesichert werden sollen. Standardmäßig werden bei der automatischen Sicherung fast alle App-Dateien berücksichtigt. Wenn Sie ein
<include>-Element angeben, werden vom System standardmäßig keine Dateien mehr einbezogen und nur die angegebenen Dateien gesichert. Wenn Sie mehrere Dateien einfügen möchten, verwenden Sie mehrere<include>-Elemente.Unter Android 11 und niedriger kann dieses Element auch das Attribut
requireFlagsenthalten, das im Abschnitt zum Definieren von bedingten Anforderungen für die Sicherung ausführlicher beschrieben wird.Dateien in Verzeichnissen, die von
getCacheDir(),getCodeCacheDir()odergetNoBackupFilesDir()zurückgegeben werden, werden immer ausgeschlossen, auch wenn Sie versuchen, sie einzuschließen.<exclude>Gibt eine Datei oder einen Ordner an, die bei der Sicherung ausgeschlossen werden sollen. Hier sind einige Dateien, die in der Regel nicht gesichert werden:
Dateien mit gerätespezifischen Kennungen, die entweder von einem Server ausgestellt oder auf dem Gerät generiert werden. Firebase Cloud Messaging (FCM) muss beispielsweise jedes Mal ein Registrierungstoken generieren, wenn ein Nutzer Ihre App auf einem neuen Gerät installiert. Wenn das alte Registrierungstoken wiederhergestellt wird, kann es zu unerwartetem Verhalten der App kommen.
Dateien im Zusammenhang mit dem Debugging von Apps.
Große Dateien, die dazu führen, dass das Sicherungskontingent von 25 MB für die App überschritten wird.
Jedes <include>- und <exclude>-Element muss die folgenden zwei Attribute enthalten:
domainGibt den Speicherort der Ressource an. Gültige Werte für dieses Attribut sind:
root: Das Verzeichnis im Dateisystem, in dem alle privaten Dateien dieser App gespeichert sind.file: Verzeichnisse, die vongetFilesDir()zurückgegeben werden.database: Verzeichnisse, die vongetDatabasePath()zurückgegeben werden. Hier werden Datenbanken gespeichert, die mitSQLiteOpenHelpererstellt wurden.sharedpref: Das Verzeichnis, in demSharedPreferencesgespeichert sind.external: Das Verzeichnis, das vongetExternalFilesDir()zurückgegeben wird.device_root: wieroot, aber für den geräteschutzgesicherten Speicher.device_file: wiefile, aber für den geräteschutzgesicherten Speicher.device_database: wiedatabase, aber für den geräteschutzgesicherten Speicher.device_sharedpref: Wiesharedpref, aber für den geräteschutzgesicherten Speicher.
pathGibt eine Datei oder einen Ordner an, die in die Sicherung einbezogen oder aus der Sicherung ausgeschlossen werden sollen. Wichtige Hinweise:
- Dieses Attribut unterstützt keine Platzhalter oder regulären Ausdrücke.
- Sie können mit
./auf das aktuelle Verzeichnis verweisen, aber aus Sicherheitsgründen nicht auf das übergeordnete Verzeichnis, z. B. mit... - Wenn Sie ein Verzeichnis angeben, gilt die Regel für alle Dateien im Verzeichnis und in rekursiven Unterverzeichnissen.
Plattformübergreifende Übertragungen konfigurieren
Ab Android 16 QPR2 (API-Level 36.1) können Sie die automatische Sicherung für Datenübertragungen zu und von Nicht-Android-Geräten konfigurieren. Fügen Sie dazu das Element <cross-platform-transfer> in die <data-extraction-rules>-Konfiguration ein, wie in der Syntax für Android 12 oder höher beschrieben. Sie müssen die Zielplattform mit dem erforderlichen Attribut platform angeben. Der einzige unterstützte Wert ist ios.
In diesem Abschnitt können Sie die Standardelemente <include> und <exclude> verwenden, um anzugeben, welche Daten übertragen werden sollen. Weitere Informationen finden Sie unter Syntax für „include“- und „exclude“-Elemente.
Außerdem müssen Sie das <platform-specific-params>-Element einfügen, damit das System Ihre App mit der entsprechenden App auf der Zielplattform abgleichen kann.
Dieses Element hat die folgenden erforderlichen Attribute:
bundleId: Die Bundle-ID der App auf der anderen Plattform (z.B. die Bundle-ID Ihrer iOS-App).teamId: Die Team-ID der App auf der anderen Plattform (z.B. die Team-ID Ihrer iOS-App).contentVersion: Ein von Ihnen definierter Versionsstring, der dem exportierten Datenformat zugeordnet ist.
Die Attribute bundleId und teamId werden verwendet, um die Datenintegrität und den korrekten App-zu-App-Abgleich zu überprüfen. Sie garantieren, dass Daten bei einem Export nur an die angegebene App auf der anderen Plattform übertragen werden und dass diese Android-App bei einem Import nur Daten aus dieser bestimmten App importiert.
Wenn Sie die Datenübertragung und ‑transformation genauer steuern möchten, als es mit den XML-Regeln möglich ist, können Sie eine benutzerdefinierte BackupAgent implementieren und die Cross-Platform Transfer APIs verwenden.
Dateizuordnung für iOS-Übertragungen
Beim Übertragen von Dateien auf iOS werden die Android-Verzeichnisse domain und path, die Sie in den <include>-Regeln angeben, einer bestimmten Verzeichnisstruktur zugeordnet. In der folgenden Tabelle sind die Zielpfade auf iOS relativ zum Stammverzeichnis des Übertragungsziels aufgeführt, basierend auf dem Android-domain:
Android domain |
Pfad unter iOS (relativ zum Stammverzeichnis der Übertragung) |
|---|---|
root |
app/ |
file |
app/files/ |
database |
app/databases/ |
sharedpref |
app/shared_prefs/ |
external |
external/files/ |
device_root |
device/app/ |
device_file |
device/app/files/ |
device_database |
device/app/databases/ |
device_sharedpref |
device/app/shared_prefs/ |
Eine mit <include domain="file"
path="my_settings.txt"/> eingeschlossene Datei ist beispielsweise auf der iOS-Seite unter app/files/my_settings.txt relativ zum Stammverzeichnis des Übertragungsziels verfügbar.
BackupAgent implementieren
Apps, die Auto Backup implementieren, müssen keine BackupAgent implementieren.
Optional können Sie jedoch eine benutzerdefinierte BackupAgent implementieren. Dafür gibt es in der Regel zwei Gründe:
Sie möchten Benachrichtigungen zu Sicherungsereignissen wie
onRestoreFinished()undonQuotaExceeded()erhalten. Diese Callback-Methoden werden auch dann ausgeführt, wenn die App nicht ausgeführt wird.Sie können die Dateien, die Sie sichern möchten, nicht einfach mit XML-Regeln angeben. In diesen seltenen Fällen können Sie eine
BackupAgentimplementieren, dieonFullBackup(FullBackupDataOutput)überschreibt, um die gewünschten Daten zu speichern. Wenn Sie die Standardimplementierung des Systems beibehalten möchten, rufen Sie die entsprechende Methode für die Superklasse mitsuper.onFullBackup()auf.
Wenn Sie ein BackupAgent implementieren, erwartet das System standardmäßig, dass Ihre App Schlüssel/Wert-Paare sichert und wiederherstellt. Wenn Sie stattdessen die dateibasierte automatische Sicherung verwenden möchten, legen Sie das Attribut android:fullBackupOnly im Manifest Ihrer App auf true fest.
Während der automatischen Sicherung und Wiederherstellung startet das System die App in einem eingeschränkten Modus, um zu verhindern, dass die App auf Dateien zugreift, die Konflikte verursachen könnten, und damit die App Callback-Methoden in ihrem BackupAgent ausführen kann. In diesem eingeschränkten Modus wird die Hauptaktivität der App nicht automatisch gestartet, ihre Content-Provider werden nicht initialisiert und die Basisklasse Application wird anstelle einer in der Manifestdatei der App deklarierten Unterklasse instanziiert.
Ihre BackupAgent muss die abstrakten Methoden onBackup() und onRestore() implementieren, die für die Schlüssel-Wert-Sicherung verwendet werden. Wenn Sie keine Schlüssel/Wert-Sicherung durchführen möchten, können Sie die Implementierung dieser Methoden leer lassen.
Weitere Informationen finden Sie unter BackupAgent erweitern.
Plattformübergreifende Übertragungen in BackupAgent verarbeiten
Ab Android 16 QPR2 (API-Level 36.1) sind in BackupAgent mehrere neue APIs verfügbar, um plattformübergreifende Datenübertragungen besser zu unterstützen.
Neue Transport-Flag:
FLAG_CROSS_PLATFORM_TRANSFER_IOS: Dieses Flag wird demtransportFlagshinzugefügt, das für IhreBackupAgentbereitgestellt wird.- In
onFullBackupwird dieses Flag gesetzt, wenn der aktuelle Sicherungsvorgang Teil eines Datenexports auf ein iOS-Gerät ist. - In der neuen
onRestoreFile-Überladung wird dieses Flag gesetzt, wenn die Daten von einem iOS-Gerät importiert werden.
- In
Neue onRestoreFile-Methode:
Es wird eine neue Überladung von onRestoreFile eingeführt, die einen einzelnen FullRestoreDataInput-Parameter akzeptiert. Dieses Objekt enthält mehr Kontext zum Wiederherstellungsvorgang:
FullRestoreDataInput.getTransportFlags(): Gibt die Transport-Flags für den aktuellen Wiederherstellungsvorgang zurück, dieFLAG_CROSS_PLATFORM_TRANSFER_IOSenthalten können.FullRestoreDataInput.getContentVersion(): Gibt den von der Quellanwendung auf der anderen Plattform während einer plattformübergreifenden Übertragung bereitgestellten String für die Inhaltsversion zurück. Dieser Wert ist ein leerer String, wenn er nicht von der Quelle bereitgestellt wird.
Neue Methode zur Schätzung der Größe:
onEstimateFullBackupBytes(): Mit dieser Methode können Sie eine geschätzte Größe der Daten angeben, die Ihre App sichern möchte. Die Implementierung wird dringend empfohlen, wenn Ihre App während der Sicherung umfangreiche Datentransformationen durchführt oder große Datenmengen verarbeitet, da sie die Effizienz verbessern kann, indem der standardmäßige System-Probelauf vermieden wird. Bei Apps mit kleinen, unkomplizierten Back-ups ist diese Methode in der Regel nicht erforderlich.
Beispiel für die Verwendung:
Kotlin
// In your custom BackupAgent class
override fun onFullBackup(out: FullBackupDataOutput) {
// Check if this is a cross-platform export to iOS
if ((out.transportFlags and FLAG_CROSS_PLATFORM_TRANSFER_IOS) != 0) {
Log.d(TAG, "onFullBackup for iOS transfer")
// Your custom export logic here
// Call fullBackupFile() for files to include
}
}
override fun onRestoreFile(input: FullRestoreDataInput) {
if ((input.transportFlags and FLAG_CROSS_PLATFORM_TRANSFER_IOS) != 0) {
val sourceContentVersion = input.contentVersion
Log.d(TAG, "onRestoreFile from iOS, content version: $sourceContentVersion")
// Your custom import logic here, using input.data, input.destination, etc.
}
}
// Optional: Provide an estimate of the backup size
override fun onEstimateFullBackupBytes(): Long {
return calculateEstimatedBackupSize()
}
Java
// In your custom BackupAgent class
@Override
public void onFullBackup(FullBackupDataOutput out) throws IOException {
// Check if this is a cross-platform export to iOS
if ((out.getTransportFlags() & FLAG_CROSS_PLATFORM_TRANSFER_IOS) != 0) {
Log.d(TAG, "onFullBackup for iOS transfer");
// Your custom export logic here
// Call fullBackupFile() for files to include
}
}
@Override
public void onRestoreFile(FullRestoreDataInput input) {
if ((input.getTransportFlags() & FLAG_CROSS_PLATFORM_TRANSFER_IOS) != 0) {
String sourceContentVersion = input.getContentVersion();
Log.d(TAG, "onRestoreFile from iOS, content version: " + sourceContentVersion);
// Your custom import logic here, using input.getData(), input.getDestination(), etc.
}
}
// Optional: Provide an estimate of the backup size
@Override
public long onEstimateFullBackupBytes() {
return calculateEstimatedBackupSize();
}