Mit der Funktion Automatische Sicherung für Apps werden automatisch die Daten von Apps gesichert, die auf Android 6.0 (API-Level 23) oder höher ausgerichtet sind und darauf ausgeführt werden. Android speichert App-Daten, indem es sie in Google Drive des Nutzers hochlädt. Dort sind sie durch die Google-Konto-Anmeldedaten des Nutzers geschützt. Auf Geräten mit Android 9 oder höher wird die Sicherung 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 Kosten an. In deiner App kannst du den Sicherungsvorgang anpassen oder die Sicherung deaktivieren.
Eine Übersicht über die Sicherungsoptionen von Android und eine Anleitung dazu, welche Daten gesichert und wiederhergestellt werden sollten, findest du in der Übersicht über die Datensicherung.
Gesicherte Dateien
Standardmäßig werden bei der automatischen Sicherung Dateien in den meisten Verzeichnissen berücksichtigt, die Ihrer App vom System zugewiesen werden:
Dateien mit freigegebenen Einstellungen
Dateien, die im internen Speicher Ihrer App gespeichert sind und auf die über
getFilesDir()odergetDir(String, int)zugegriffen wirdDateien im Verzeichnis, das von
getDatabasePath(String)zurückgegeben wird, einschließlich Dateien, die mit der KlasseSQLiteOpenHelpererstellt wurdenDateien im externen Speicher im Verzeichnis, das von
getExternalFilesDir(String)zurückgegeben wird
Die automatische Sicherung schließt Dateien in Verzeichnissen aus, die von getCacheDir(), getCodeCacheDir() und getNoBackupFilesDir() zurückgegeben werden. Die an diesen Speicherorten gespeicherten Dateien werden nur vorübergehend benötigt und sind absichtlich von Sicherungsvorgängen ausgeschlossen.
Sie können Ihre Anwendung so konfigurieren, dass bestimmte Dateien ein- und ausgeschlossen werden. Weitere Informationen finden Sie im Abschnitt Dateien ein- und ausschließen.
Sicherungsort
Sicherungsdaten werden in einem privaten Ordner im Google Drive-Konto des Nutzers gespeichert, der auf 25 MB pro App beschränkt ist. 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 die vorherige Sicherung gelöscht. Die Sicherungsdaten können weder vom Nutzer noch von anderen Apps auf dem Gerät gelesen werden.
Nutzer können eine Liste der Apps, die gesichert wurden, in der Google Drive Android-App aufrufen. Auf einem Android-Gerät finden Nutzer diese Liste in der Navigationsleiste der Drive App unter Einstellungen > Sichern und zurücksetzen.
Sicherungen aus jeder Geräteeinrichtungs-Lebensdauer werden in separaten Datasets gespeichert, wie in den folgenden Beispielen beschrieben:
Wenn der Nutzer zwei Geräte besitzt, ist für jedes Gerät ein Sicherungs-Dataset vorhanden.
Wenn der 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 gewissen 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 finden Sie 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 (wenn der Gerätenutzer keine Sicherungen über mobile Daten aktiviert hat).
In der Praxis treten diese Bedingungen ungefähr jede Nacht auf, aber ein Gerät wird möglicherweise nie gesichert (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 beendet, damit sie nicht mehr in das Dateisystem schreibt. Standardmäßig ignoriert das Sicherungssystem Apps, die im Vordergrund ausgeführt werden, 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, enthält Android Tools, mit denen du manuell eine Sicherung deiner App initiieren kannst. Weitere Informationen findest du unter Sicherung und Wiederherstellung testen.
Zeitplan wiederherstellen
Daten werden immer dann wiederhergestellt, wenn die App installiert wird, sei es über den Google Play Store, während der Geräteeinrichtung (wenn das System zuvor installierte Apps installiert) oder durch Ausführen von adb install. Die Wiederherstellung erfolgt nach der Installation des APK, aber bevor die App vom Nutzer gestartet werden kann.
Im Einrichtungsassistenten wird dem Nutzer eine Liste der verfügbaren Sicherungs-Datasets angezeigt und er wird gefragt, aus welchem Dataset die Daten wiederhergestellt werden sollen. Das ausgewählte Sicherungs-Dataset wird zum übergeordneten Dataset für das Gerät. Das Gerät kann entweder aus seinen eigenen Sicherungen oder aus dem übergeordneten Dataset wiederhergestellt werden. Wenn Sicherungen aus beiden Quellen verfügbar sind, priorisiert das Gerät die eigene Sicherung. Wenn der Nutzer den Einrichtungsassistenten des Geräts nicht verwendet hat, kann das Gerät nur aus seinen eigenen Sicherungen wiederhergestellt werden.
Um das Testen zu vereinfachen, enthält Android Tools, mit denen Sie die Wiederherstellung Ihrer App manuell initiieren können. Weitere Informationen finden Sie unter Sicherung und Wiederherstellung testen.
Sicherung aktivieren und deaktivieren
Apps, die auf Android 6.0 (API-Level 23) oder höher ausgerichtet sind, werden automatisch in die automatische Sicherung einbezogen. Legen Sie in der Manifestdatei Ihrer App 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 kann sinnvoll sein, wenn Ihre App ihren Status über einen anderen Mechanismus wiederherstellen kann oder wenn Ihre App mit vertraulichen Informationen arbeitet.
Dateien ein- und ausschließen
Standardmäßig werden fast alle App-Daten gesichert. Weitere Informationen finden Sie im Abschnitt zu gesicherten Dateien.
Sie können festlegen, welche Daten je nach Übertragungstyp in der Sicherung enthalten sind.
Die automatische Sicherung unterstützt Cloud-Sicherungen in Google Drive und direkte Übertragungen von Gerät zu Gerät (D2D). Die Konfigurationsmethoden variieren je nach Android-Version und targetSdkVersion Ihrer App.
- Informationen zu Geräten mit Android 11 oder niedriger finden Sie unter Sicherung auf Android 11 und niedriger steuern.
- 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 steuern. - Das
data-extraction-rules-Format unterstützt auch plattformübergreifende Übertragungen (z.B. zu iOS). Diese Funktion ist ab Android 16 QPR2 verfügbar. Weitere Informationen finden Sie unter Plattformübergreifende Übertragungen konfigurieren.
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 außerdevice.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 deine App vertrauliche Informationen auf dem Gerät speichert, kannst du Bedingungen festlegen, unter denen die Daten deiner App in die Sicherung des Nutzers aufgenommen werden. Unter 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 Back-up auf ein anderes Gerät, das die lokale Übertragung von Gerät zu Gerät 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 dann mit einem clientseitigen Secret verschlüsselt, wenn Nutzer in den Einstellungen oder im Einrichtungsassistenten darüber informiert wurden.
Wenn Sie die Einschlussbedingungen deklarieren möchten, setzen Sie das Attribut requireFlags auf einen oder mehrere ausgewählte Werte in den <include>-Elementen innerhalb Ihrer Sicherungsregeln:
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 deine App ein Schlüssel/Wert-Sicherungssystem implementiert oder wenn du BackupAgent selbst implementierst, kannst du diese bedingten Anforderungen auch auf deine Sicherungslogik anwenden. Dazu führst du einen bitweisen Vergleich zwischen den Transport-Flags eines BackupDataOutput-Objekts und den Flags FLAG_CLIENT_SIDE_ENCRYPTION_ENABLED oder FLAG_DEVICE_TO_DEVICE_TRANSFER deines 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 deine App auf Android 12 (API-Level 31) oder höher ausgerichtet ist, folge den Schritten 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.xmldem Element<application>das Attributandroid:dataExtractionRuleshinzu, 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 außerdevice.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 Android-Version, für die Ihre App vorgesehen ist 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, die die Sicherung für Geräte mit Android 12 oder höher steuert.
<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 von Google Drive-Sicherungen ausschließen, sie aber trotzdem bei Übertragungen von Gerät zu Gerät (D2D) oder plattformübergreifenden Übertragungen übertragen. Das ist nützlich, wenn Sie Dateien haben, die zu groß für die Sicherung in der Cloud sind, aber problemlos zwischen Geräten übertragen werden können.
Wenn es keine Regeln für einen bestimmten Sicherungsmodus gibt, z. B. wenn der Abschnitt <device-transfer> fehlt, ist dieser Modus für alle Inhalte vollständig aktiviert, mit Ausnahme der Verzeichnisse no-backup und cache, wie im Abschnitt Gesicherte Dateien beschrieben.
In Ihrer App kann das Flag disableIfNoEncryptionCapabilities im Abschnitt <cloud-backup> festgelegt werden, damit die Sicherung nur dann erfolgt, wenn sie verschlüsselt werden kann, z. B. wenn der Nutzer einen Sperrbildschirm hat. Wenn Sie diese Einschränkung festlegen, werden keine Sicherungen mehr an 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 einschließende und ausschließende Elemente
In den 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 bzw. der gesichert werden soll. Standardmäßig umfasst die automatische Sicherung fast alle App-Dateien. Wenn Sie ein
<include>-Element angeben, werden standardmäßig keine Dateien mehr einbezogen und nur die angegebenen Dateien gesichert. Wenn Sie mehrere Dateien einbeziehen möchten, verwenden Sie mehrere<include>-Elemente.Unter Android 11 und niedriger kann dieses Element auch das Attribut
requireFlagsenthalten, das im Abschnitt Bedingte Anforderungen für die Sicherung definieren 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 bzw. der bei der Sicherung ausgeschlossen werden soll. Hier sind einige Dateien, die normalerweise von der Sicherung ausgeschlossen werden:
Dateien mit gerätespezifischen Kennungen, die entweder von einem Server ausgegeben oder auf dem Gerät generiert wurden. Beispielsweise muss Firebase Cloud Messaging (FCM) jedes Mal ein Registrierungstoken generieren, wenn ein Nutzer Ihre App auf einem neuen Gerät installiert. Wenn das alte Registrierungstoken wiederhergestellt wird, verhält sich die App möglicherweise unerwartet.
Dateien im Zusammenhang mit dem App-Debugging.
Große Dateien, die dazu führen, dass die App das Sicherungskontingent von 25 MB überschreitet.
Jedes <include>- und <exclude>-Element muss die folgenden beiden Attribute enthalten:
domainGibt den Standort 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. MitSQLiteOpenHelpererstellte Datenbanken werden hier gespeichert.sharedpref: das Verzeichnis, in demSharedPreferencesgespeichert sind.external: das vongetExternalFilesDir()zurückgegebene Verzeichnis.device_root: wieroot, aber für den gerätegeschützten Speicher.device_file: wiefile, aber für den gerätegeschützten Speicher.device_database: wiedatabase, aber für den gerätegeschützten Speicher.device_sharedpref: wiesharedpref, aber für den gerätegeschützten Speicher.
pathGibt eine Datei oder einen Ordner an, die bzw. der in die Sicherung einbezogen oder davon ausgeschlossen werden soll. 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 von und zu Nicht-Android-Geräten konfigurieren. Fügen Sie dazu das Element <cross-platform-transfer> in die Konfiguration <data-extraction-rules> ein, wie in der Syntax für Android 12 oder höher gezeigt. 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, wie unter Syntax für Ein- und Ausschlusselemente beschrieben, um anzugeben, welche Daten übertragen werden sollen.
Außerdem müssen Sie das Element <platform-specific-params> einfügen, damit das System Ihre App der entsprechenden App auf der Zielplattform zuordnen kann.
Dieses Element hat die folgenden erforderlichen Attribute:
bundleId: Die Paket-ID der App auf der anderen Plattform (z.B. die Paket-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 mit dem exportierten Datenformat verknüpft ist.
Die Attribute bundleId und teamId werden verwendet, um die Datenintegrität und die korrekte Zuordnung von App zu App zu überprüfen. Sie garantieren, dass Daten während eines Exports nur an die angegebene App auf der anderen Plattform übertragen werden und dass diese Android-App während eines Imports nur Daten von dieser bestimmten App importiert.
Wenn Sie die Datentransformation und den Übertragungsprozess genauer steuern möchten, als es mit den XML-Regeln möglich ist, können Sie eine benutzerdefinierte BackupAgent implementieren und die plattformübergreifenden Transfer APIs verwenden.
Dateizuordnung für iOS-Übertragungen
Beim Übertragen von Dateien auf iOS werden die Android-domain und -path, die Sie in den <include>-Regeln angeben, einer bestimmten Verzeichnisstruktur zugeordnet. In der folgenden Tabelle sind die Zielpfade unter iOS relativ zum Stammverzeichnis des Übertragungsziels basierend auf dem Android-domain aufgeführt:
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 Datei, die mit <include domain="file"
path="my_settings.txt"/> eingeschlossen ist, ist beispielsweise auf der iOS-Seite unter app/files/my_settings.txt relativ zum Stammverzeichnis des Übertragungsziels verfügbar.
BackupAgent implementieren
Apps, die die automatische Sicherung implementieren, müssen keinen BackupAgent implementieren.
Sie können jedoch optional einen benutzerdefinierten 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 ausdrücken. 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 Basisklasse mitsuper.onFullBackup()auf.
Wenn Sie einen BackupAgent implementieren, erwartet das System standardmäßig, dass Ihre App eine Schlüssel/Wert-Sicherung und -Wiederherstellung durchführt. Wenn Sie stattdessen die dateibasierte automatische Sicherung verwenden möchten, setzen Sie das Attribut android:fullBackupOnly im Manifest Ihrer App auf true.
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 um der App die Ausführung von Callback-Methoden in ihrer BackupAgent zu ermöglichen. In diesem eingeschränkten Modus wird die Hauptaktivität der App nicht automatisch gestartet, ihre Contentanbieter werden nicht initialisiert und die Basisklasse Application wird anstelle einer im Manifest der App deklarierten Unterklasse instanziiert.
Ihr BackupAgent muss die abstrakten Methoden onBackup() und onRestore() implementieren, die für die Sicherung von Schlüssel/Wert-Paaren verwendet werden. Wenn du keine Schlüssel/Wert-Sicherung durchführen möchtest, kannst du 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.
Neues Transport-Flag:
FLAG_CROSS_PLATFORM_TRANSFER_IOS: Dieses Flag wird demtransportFlagshinzugefügt, das fürBackupAgentbereitgestellt 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 verwendet. Dieses Objekt bietet 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 String für die Inhaltsversion zurück, der von der Quellanwendung auf der anderen Plattform während einer plattformübergreifenden Übertragung bereitgestellt wurde. 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 die geschätzte Größe der Daten angeben, die Ihre App sichern soll. Die Implementierung wird dringend empfohlen, wenn deine App während der Sicherung umfangreiche Datentransformationen durchführt oder ein großes Datenvolumen verarbeitet. Dadurch kann die Effizienz verbessert werden, da der standardmäßige System-Probelauf vermieden wird. Bei Apps mit kleinen, einfachen Sicherungen 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();
}