Anahtar/değer çiftlerini Android Backup Service ile yedekleme

Android Yedekleme Hizmeti, anahtar/değer çifti için bulutta depolama yedekleme ve geri yükleme sağlar verileri ekleyebilirsiniz. Bir anahtar/değer çifti yedekleme işlemi sırasında, uygulamanın yedeklemesi veriler, cihazın yedek aktarımına aktarılır. Cihaz varsayılan Google yedekleme aktarıcısını kullanıyorsa veriler arşivlenmek üzere Android Yedekleme Hizmeti'ne iletilir.

Veri, uygulamanızın kullanıcısı başına 5 MB ile sınırlıdır. Depolama için ücret alınmaz yedekleme verileri.

Android'in yedekleme seçeneklerine genel bakış ve hangi verileri hakkında daha fazla bilgi için Veri yedekleme genel bakış bölümüne bakın.

Anahtar/değer yedekleme özelliğini uygulama

Uygulama verilerinizi yedeklemek için bir yedek aracı uygulamanız gerekir. Yedekleme aracınız, Yedekleme Yöneticisi tarafından hem yedekleme hem de geri yükleme sırasında çağrılır.

Yedekleme aracısı uygulamak için:

  1. Manifest dosyanızda yedek aracınızı android:backupAgent özelliğini gönderin.

  2. Aşağıdakilerden birini yaparak bir yedekleme aracısı tanımlayın:

    • BackupAgent uzatılıyor

      BackupAgent sınıfı, uygulamanızın Yedekleme Yöneticisi ile iletişim kurmak için kullandığı merkezi arayüzü sağlar. Bu sınıfı doğrudan genişletirseniz verilerinizin yedekleme ve geri yükleme işlemlerini yönetmek için onBackup() ve onRestore() yöntemlerini geçersiz kılmanız gerekir.

    • BackupAgentHelper uzatılıyor

      İlgili içeriği oluşturmak için kullanılan BackupAgentHelper sınıfı, BackupAgent sınıfı için uygun bir sarmalayıcı sağlar. Bu yaklaşım, yazmanız gereken kod miktarını en aza indirmenize yardımcı olur. BackupAgentHelper'ünüzde, onBackup() ve onRestore()'yi uygulamak zorunda kalmamak için belirli veri türlerini otomatik olarak yedekleyen ve geri yükleyen bir veya daha fazla yardımcı nesne kullanmanız gerekir. Uygulamanızın yedeklemeleri üzerinde tam kontrole ihtiyacınız yoksa uygulamanızın yedeklerini yönetmek için BackupAgentHelper

      Android şu anda SharedPreferences ve dahili depolama alanlarındaki dosyaları yedekleyen ve geri yükleyen yedekleme yardımcıları sunmaktadır.

Yedekleme aracını manifest'inizde beyan etme

Yedek temsilcinizin sınıf adını belirledikten sonra manifesto dosyasında android:backupAgent özelliğini kullanarak <application> etiketi.

Örnek:

<manifest ... >
    ...
    <application android:label="MyApplication"
                 android:backupAgent="MyBackupAgent">
        <meta-data android:name="com.google.android.backup.api_key"
            android:value="unused" />
        <activity ... >
            ...
        </activity>
    </application>
</manifest>

Eski cihazları desteklemek için <meta-data> API anahtarını eklemenizi öneririz manifest dosyanıza ekleyin. Android Yedekleme Hizmeti artık hizmet anahtarı var, ancak bazı eski cihazlar yedekleme sırasında anahtar aramaya devam edebilir yukarıya doğru. android:name değerini com.google.android.backup.api_key, android:value değerini ise unused olarak ayarlayın.

İlgili içeriği oluşturmak için kullanılan android:restoreAnyVersion özelliği, uygulamayı geri yüklemek isteyip istemediğinizi belirtmek için bir boole değeri alır uygulamanın hangi sürüm olduğu fark etmeksizin, yedek verileri üretmiştir. Varsayılan değer: false. Bkz. Geri yüklemeyi kontrol etme veri sürümüne bakın.

Yedekleme AracısıYardımcısını Uzat

Dilerseniz BackupAgentHelper kullanarak yedek temsilcinizi oluşturmalısınız. SharedPreferences veya dahili depolama alanındaki tüm dosyaları yedekleyin. Yedekleme aracınızı BackupAgentHelper ile oluşturmak, onBackup() ve onRestore()'ı uygulamanız gerekmediği için BackupAgent'ü genişletmekten çok daha az kod gerektirir.

BackupAgentHelper uygulamanızda bir veya daha fazla yedek yardımcı kullanılmalıdır. Yedek yardımcı, BackupAgentHelper adlı kullanıcının çağırdığı özel bir bileşendir belirli bir veri türü için yedekleme ve geri yükleme işlemleri gerçekleştirme. Android çerçevesi şu anda iki farklı yardımcı sağlar:

BackupAgentHelper öğenize birden çok yardımcı ekleyebilirsiniz, ancak yalnızca bir yardımcı ekleyebilirsiniz. yardımcı olması gerekir. Yani, birden fazla SharedPreferences dosyanız varsa yalnızca bir SharedPreferencesBackupHelper dosyasına ihtiyacınız vardır.

BackupAgentHelper cihazınıza eklemek istediğiniz her yardımcı için şunları yapmanız gerekir: bu adımların onCreate() yöntemi:

  1. İstediğiniz yardımcı sınıfın bir örneğini oluşturun. Sınıfta oluşturucu olarak, yedeklemek istediğiniz dosyaları belirtmeniz gerekir.
  2. Yardımcıyı BackupAgentHelper'inize eklemek için addHelper() numaralı telefonu arayın.

Aşağıdaki bölümlerde, mevcut yardımcıların her birini kullanarak nasıl yedek ajans oluşturulacağı açıklanmaktadır.

SharedPreferences'ı yedekle

Bir SharedPreferencesBackupHelper örneği oluştururken bir veya daha fazla SharedPreferences dosyasının adını eklemeniz gerekir.

Örneğin, user_preferences adlı bir SharedPreferences dosyasını yedeklemek için BackupAgentHelper kullanan tam yedekleme aracısı şu şekilde görünür:

Kotlin

// The name of the SharedPreferences file
const val PREFS = "user_preferences"

// A key to uniquely identify the set of backup data
const val PREFS_BACKUP_KEY = "prefs"

class MyPrefsBackupAgent : BackupAgentHelper() {
    override fun onCreate() {
        // Allocate a helper and add it to the backup agent
        SharedPreferencesBackupHelper(this, PREFS).also {
            addHelper(PREFS_BACKUP_KEY, it)
        }
    }
}

Java

public class MyPrefsBackupAgent extends BackupAgentHelper {
    // The name of the SharedPreferences file
    static final String PREFS = "user_preferences";

    // A key to uniquely identify the set of backup data
    static final String PREFS_BACKUP_KEY = "prefs";

    // Allocate a helper and add it to the backup agent
    @Override
    public void onCreate() {
        SharedPreferencesBackupHelper helper =
                new SharedPreferencesBackupHelper(this, PREFS);
        addHelper(PREFS_BACKUP_KEY, helper);
    }
}

SharedPreferencesBackupHelper, bir SharedPreferences dosyasını yedeklemek ve geri yüklemek için gereken tüm kodu içerir.

Yedekleme Yöneticisi onBackup() ve onRestore()'ü çağrdığında BackupAgentHelper, belirtilen dosyalarınızı yedeklemek ve geri yüklemek için yedekleme yardımcılarınızı çağırır.

Diğer dosyaları yedekle

Bir FileBackupHelper örneği oluştururken, openFileOutput() dosyalarının yazıldığı konum olan getFilesDir() tarafından belirtildiği şekilde, uygulamanızın dahili depolama alanına kaydedilen bir veya daha fazla dosyanın adını eklemeniz gerekir.

Örneğin, scores ve stats adlı iki dosyayı yedeklemek için bir yedek aracı kullanın. BackupAgentHelper kullanıldığında aşağıdaki gibi görünür:

Kotlin

// The name of the file
const val TOP_SCORES = "scores"
const val PLAYER_STATS = "stats"
// A key to uniquely identify the set of backup data
const val FILES_BACKUP_KEY = "myfiles"

class MyFileBackupAgent : BackupAgentHelper() {
    override fun onCreate() {
        // Allocate a helper and add it to the backup agent
        FileBackupHelper(this, TOP_SCORES, PLAYER_STATS).also {
            addHelper(FILES_BACKUP_KEY, it)
        }
    }
}

Java

public class MyFileBackupAgent extends BackupAgentHelper {
    // The name of the file
    static final String TOP_SCORES = "scores";
    static final String PLAYER_STATS = "stats";

    // A key to uniquely identify the set of backup data
    static final String FILES_BACKUP_KEY = "myfiles";

    // Allocate a helper and add it to the backup agent
    @Override
    public void onCreate() {
        FileBackupHelper helper = new FileBackupHelper(this,
                TOP_SCORES, PLAYER_STATS);
        addHelper(FILES_BACKUP_KEY, helper);
    }
}

Yedekleme ve geri yükleme için gereken tüm kodlar FileBackupHelper içinde yer alır. uygulamanızın dahili depolama alanına kaydedilen dosyalar.

Ancak dahili depolama alanındaki dosyaları okumak ve bu dosyalara yazmak iş parçacığı açısından güvenli değildir. Yedekleme aracınızın, dosyalarınızı işlemlerinizle aynı anda okumadığından veya yazmadığından emin olmak için her okuma veya yazma işleminde senkronize ifadeler kullanmanız gerekir. Örneğin, bir nesne olması için bir nesne bulmanız gerekir. senkronize edilmiş deyimler:

Kotlin

// Object for intrinsic lock
companion object {
    val sDataLock = Any()
}

Java

// Object for intrinsic lock
static final Object sDataLock = new Object();

Ardından, dosyaları her okuduğunuzda veya yazdığınızda bu kilitle senkronize edilmiş bir ifade oluşturun. Örneğin, bir oyundaki en son skoru bir dosyaya yazmak için senkronize edilmiş bir ifade aşağıda verilmiştir:

Kotlin

try {
    synchronized(MyActivity.sDataLock) {
        val dataFile = File(filesDir, TOP_SCORES)
        RandomAccessFile(dataFile, "rw").apply {
            writeInt(score)
        }
    }
} catch (e: IOException) {
    Log.e(TAG, "Unable to write to file")
}

Java

try {
    synchronized (MyActivity.sDataLock) {
        File dataFile = new File(getFilesDir(), TOP_SCORES);
        RandomAccessFile raFile = new RandomAccessFile(dataFile, "rw");
        raFile.writeInt(score);
    }
} catch (IOException e) {
    Log.e(TAG, "Unable to write to file");
}

Okunmuş ifadeleri aynı kilitle senkronize etmeniz gerekir.

Ardından, BackupAgentHelper'ünüzde yedekleme ve geri yükleme işlemlerini aynı doğal kilitle senkronize etmek için onBackup() ve onRestore()'yi geçersiz kılmanız gerekir. Örneğin, yukarıdaki MyFileBackupAgent örneği için aşağıdaki yöntemler gerekir:

Kotlin

@Throws(IOException::class)
override fun onBackup(
        oldState: ParcelFileDescriptor,
        data: BackupDataOutput,
        newState: ParcelFileDescriptor
) {
    // Hold the lock while the FileBackupHelper performs back up
    synchronized(MyActivity.sDataLock) {
        super.onBackup(oldState, data, newState)
    }
}

@Throws(IOException::class)
override fun onRestore(
        data: BackupDataInput,
        appVersionCode: Int,
        newState: ParcelFileDescriptor
) {
    // Hold the lock while the FileBackupHelper restores the file
    synchronized(MyActivity.sDataLock) {
        super.onRestore(data, appVersionCode, newState)
    }
}

Java

@Override
public void onBackup(ParcelFileDescriptor oldState, BackupDataOutput data,
          ParcelFileDescriptor newState) throws IOException {
    // Hold the lock while the FileBackupHelper performs back up
    synchronized (MyActivity.sDataLock) {
        super.onBackup(oldState, data, newState);
    }
}

@Override
public void onRestore(BackupDataInput data, int appVersionCode,
        ParcelFileDescriptor newState) throws IOException {
    // Hold the lock while the FileBackupHelper restores the file
    synchronized (MyActivity.sDataLock) {
        super.onRestore(data, appVersionCode, newState);
    }
}

BackupAgent'ı genişletme

Çoğu uygulamanın BackupAgent sınıfını doğrudan genişletmesi gerekmese de bunun yerine BackupAgentHelper öğesini genişletin ve yerleşik yardımcı sınıflara göz atın. Ancak, aşağıdakileri yapmak için BackupAgent öğesini doğrudan uzatabilirsiniz:

  • Veri biçiminizi sürümlendirin. Örneğin, uygulama verilerinizi yazdığınız biçimi düzeltmeniz gerektiğini düşünüyorsanız geri yükleme işlemi sırasında uygulama sürümünüzü çapraz kontrol edecek ve cihazdaki sürüm yedekleme verilerinden farklıysa gerekli uyumluluk çalışmalarını yapacak bir yedekleme aracısı oluşturabilirsiniz. Daha fazla bilgi edinmek için bkz. Geri yükleme işlemini kontrol etme veri sürümüne sahip olmalıdır.
  • Yedeklenecek veri bölümlerini belirtin. Bir e-posta adresinin tamamını yedeklemek yerine dosyası üzerinde, yedeklenecek veri bölümlerini ve her bir bölümün daha sonra cihaza geri yüklendi. Bu sayede farklı proje yönetimi tarzlarını çünkü verilerinizi okumak ve yazmak yerine benzersiz varlıklar olarak tam dosyalardan daha yüksek olmayabilir.
  • Verileri bir veritabanına yedekleme Kullanıcı uygulamanızı yeniden yüklediğinde geri yüklemek istediğiniz bir SQLite veritabanınız varsa yedekleme işlemi sırasında uygun verileri okuyan bir özel BackupAgent oluşturmanız, ardından tablonuzu oluşturup geri yükleme işlemi sırasında verileri eklemeniz gerekir.

Yukarıdaki görevlerden hiçbirini gerçekleştirmeniz gerekmiyor ve verileri yedeklemek istiyorsanız SharedPreferences veya dahili depolama alanındaki dosyaları tamamlayın, bkz. Uzatma BackupAgentHelper.

Gerekli yöntemler

BackupAgent oluşturduğunuzda aşağıdaki geri çağırmayı uygulamanız gerekir yöntemleri:

onBackup()
Siz bir yedekleme. Bu yöntemde uygulama verilerinizi yedeklemek istediğiniz verileri aşağıdaki gibi Yedek Yöneticisi'ne iletin: Yedekleme işlemi gerçekleştirme konusunda bulabilirsiniz.
onRestore()

Yedek Yöneticisi, geri yükleme işlemi sırasında bu yöntemi çağırır. Bu yöntem uygulamanızın, eski verilerini geri yüklemek için kullanabileceği yedekleme verilerinizi sağlar. Geri yükleme işlemi gerçekleştirme bölümünde açıklandığı gibi geri yüklenmelidir.

Kullanıcı aşağıdaki işlemleri gerçekleştirdiğinde sistem, yedek verileri geri yüklemek için bu yöntemi çağırır. yeniden yükler ancak uygulamanız ayrıca bir geri yükle.

Yedekleme yapma

Yedek istek, onBackup() yönteminizle hemen bir arama yapılmasına neden olmaz. Bunun yerine, Yedek Yöneticisi uygun bir süre bekler ve son zamandan beri yedekleme isteğinde bulunan tüm uygulamalar için yedekleme yapar. yedekleme gerçekleştirildi. Bu aşamada uygulama verilerinizi sağlamanız gerekir Cloud Storage'a kaydedilebilmesi için verileri Yedekleme Yöneticisi'ne taşımalıdır.

Yedek aracınızın onBackup() yöntemini yalnızca Yedek Yönetici çağırabilir. Uygulama verileriniz değiştiğinde ve yedekleme yapmak istediğinizde dataChanged() çağrısını yaparak yedekleme işlemi isteğinde bulunmanız gerekir. Daha fazla bilgi için Yedek isteme konusuna bakın.

İpucu: Uygulamanızı geliştirirken anında yedekleme başlatabilirsiniz bmgr ile Yedekleme Yöneticisi'nden işlemi gerçekleştirme aracını kullanın.

Yedekleme Yöneticisi, onBackup() yönteminizi çağrdığında üç parametre iletir:

oldState
Uygulamanızın sağladığı son yedekleme durumunu gösteren açık, salt okunur bir ParcelFileDescriptor. Bu, bulut depolama alanındaki yedekleme verileri değil, newState tarafından tanımlandığı veya onRestore()'den çağrıldığı şekilde onBackup() son çağrıldığında yedeklenen verilerin yerel bir temsilidir. onRestore() konusu bir sonraki bölümde ele alınmıştır. Çünkü onBackup(), buluttaki mevcut yedekleme verilerini okumanıza izin vermez depolama alanı kullanıyorsanız verilerinizin bu yerel temsili kullanarak son yedeklemeden bu yana değişti.
data
Yedekleme verilerinizi Yedekleme Yöneticisi'ne iletmek için kullandığınız bir BackupDataOutput nesnesi.
newState
data'ye ilettiğiniz verilerin temsilini yazmanız gereken bir dosyayı işaret eden açık, okuma/yazma ParcelFileDescriptor. CEVAP dosyanızın son değiştirilme zaman damgası gibi basit bir uygulama olabilir. Bu nesne, Yedekleme Yöneticisi'nin bir sonraki çağrısında oldState olarak döndürülür. onBackup() yönteminiz. Yedekleme verilerinizi newState adresine yazmazsanız Yedekleme Yöneticisi bir sonraki sefer onBackup()'yi çağırdığında oldState boş bir dosyayı işaret eder.

Bu parametreleri kullanarak onBackup() yönteminizi uygulayarak aşağıdakileri yapın:

  1. oldState dosyasını mevcut verilerinizle karşılaştırarak verilerinizin son yedekten bu yana değişip değişmediğini kontrol edin. oldState ürününde verileri nasıl okuyacağınız aşağıdakilere göre değişir: bunu newState adlı içerik üreticiye ilk yazdığınız şekilde (bkz. 3. adıma bakın). Bir dosyanın durumunu kaydetmenin en kolay yolu, son değiştirilme zaman damgasını kullanmaktır. Örneğin, oldState kaynağındaki bir zaman damgasını nasıl okuyup karşılaştırabileceğinizi aşağıda görebilirsiniz:

    Kotlin

    val instream = FileInputStream(oldState.fileDescriptor)
    val dataInputStream = DataInputStream(instream)
    try {
       // Get the last modified timestamp from the state file and data file
       val stateModified = dataInputStream.readLong()
       val fileModified: Long = dataFile.lastModified()
       if (stateModified != fileModified) {
           // The file has been modified, so do a backup
           // Or the time on the device changed, so be safe and do a backup
       } else {
           // Don't back up because the file hasn't changed
           return
       }
    } catch (e: IOException) {
       // Unable to read state file... be safe and do a backup
    }

    Java

    // Get the oldState input stream
    FileInputStream instream = new FileInputStream(oldState.getFileDescriptor());
    DataInputStream in = new DataInputStream(instream);
    
    try {
       // Get the last modified timestamp from the state file and data file
       long stateModified = in.readLong();
       long fileModified = dataFile.lastModified();
    
       if (stateModified != fileModified) {
           // The file has been modified, so do a backup
           // Or the time on the device changed, so be safe and do a backup
       } else {
           // Don't back up because the file hasn't changed
           return;
       }
    } catch (IOException e) {
       // Unable to read state file... be safe and do a backup
    }

    Hiçbir şey değişmediyse ve yedeklemeniz gerekmiyorsa 3. adıma geçin.

  2. Verileriniz oldState ile karşılaştırıldığında değiştiyse mevcut verileri şuraya yazın: data adlı cihazı bulut depolama alanına yedekleyin.

    Her veri kümesini BackupDataOutput içinde bir öğe olarak yazmanız gerekir. Varlık, benzersiz bir anahtarla tanımlanan düz bir ikili veri kaydıdır dize. Bu nedenle, yedeklediğiniz veri kümesi kavramsal olarak bir anahtar/değer çifti kümesidir.

    Yedek veri kümenize varlık eklemek için:

    1. Telefonla arama writeEntityHeader(), yazmak üzere olduğunuz veri için benzersiz bir dize anahtarı iletmek ve veri boyutunuz.

    2. Verilerinizi ve arabellekten yazılacak bayt sayısını içeren bir bayt arabelleği ileterek writeEntityData() işlevini çağırın. Bu bayt sayısı, writeEntityHeader() işlevine iletilen boyutla eşleşmelidir.

    Örneğin, aşağıdaki kod bazı verileri bir bayt akışı içine düzleştirir ve tek bir varlığa yazar:

    Kotlin

    val buffer: ByteArray = ByteArrayOutputStream().run {
       DataOutputStream(this).apply {
           writeInt(playerName)
           writeInt(playerScore)
       }
       toByteArray()
    }
    val len: Int = buffer.size
    data.apply {
       writeEntityHeader(TOPSCORE_BACKUP_KEY, len)
       writeEntityData(buffer, len)
    }

    Java

    // Create buffer stream and data output stream for our data
    ByteArrayOutputStream bufStream = new ByteArrayOutputStream();
    DataOutputStream outWriter = new DataOutputStream(bufStream);
    // Write structured data
    outWriter.writeUTF(playerName);
    outWriter.writeInt(playerScore);
    // Send the data to the Backup Manager via the BackupDataOutput
    byte[] buffer = bufStream.toByteArray();
    int len = buffer.length;
    data.writeEntityHeader(TOPSCORE_BACKUP_KEY, len);
    data.writeEntityData(buffer, len);

    Yedeklemek istediğiniz her veri parçası için bu işlemi gerçekleştirin. Verilerinizi varlıklara nasıl böleceğiniz size bağlıdır. Sadece tek bir varlık bile kullanabilirsiniz.

  3. Yedekleme yapıp yapmamanız (2. adımda), newState ParcelFileDescriptor. Yedek Yönetici bu nesneyi verilerin bir temsili olarak yerel olarak tutar ve şu anda yedekleniyor. onBackup(), bir sonraki onBackup() çağrısında bu değeri oldState olarak size iletir. Böylece, 1. adımda açıklandığı gibi başka bir yedekleme gerekip gerekmediğini belirleyebilirsiniz. Mevcut veri durumunu bu dosyaya yazmazsanız sonraki geri çağırma sırasında oldState boş olur.

    Aşağıdaki örnekte, dosyanın son değiştirilme zaman damgası kullanılarak mevcut verilerin bir temsili newState içine kaydedilir:

    Kotlin

    val modified = dataFile.lastModified()
    FileOutputStream(newState.fileDescriptor).also {
       DataOutputStream(it).apply {
           writeLong(modified)
       }
    }

    Java

    FileOutputStream outstream = new FileOutputStream(newState.getFileDescriptor());
    DataOutputStream out = new DataOutputStream(outstream);
    
    long modified = dataFile.lastModified();
    out.writeLong(modified);

Geri yükleme yapma

Uygulama verilerinizi geri yükleme zamanı geldiğinde, Yedekleme Yöneticisi yedek uygulamanızı çağırır aracısının onRestore() yöntemi. Yedekleme Yöneticisi bu yöntemi çağrıldığında, yedek verilerinizi cihaza geri yükleyebilmeniz için sunar.

Yalnızca Yedekleme Yöneticisi onRestore() işlevini çağırabilir. Bu işlev, sistem uygulamanızı yükleyip mevcut yedekleme verilerini bulduğunda otomatik olarak çağrılır.

Yedekleme Yöneticisi, onRestore() yönteminizi çağrdığında üç parametre iletir:

data
Yedekleme verilerinizi okumanıza olanak tanıyan bir BackupDataInput nesnesi.
appVersionCode
Uygulamanızın değerini temsil eden bir tam sayı android:versionCode manifesto özelliğinde görünür. Bunu kullanabilirsiniz mevcut uygulama sürümünü karşılaştırmalı olarak kontrol edebilir ve veri biçiminin uyumlu olmalıdır. Bu işlevi, farklı geri yükleme versiyonlarını işlemek için kullanma hakkında daha fazla bilgi için Geri yükleme versiyonunu kontrol etme başlıklı makaleyi inceleyin.
newState
data ile sağlanan nihai yedekleme durumunu yazmanız gereken bir dosyayı işaret eden açık, okuma/yazma ParcelFileDescriptor. Bu nesne, onBackup() bir sonraki sefer çağrıldığında oldState olarak döndürülür. Bunu hatırla aynı newState nesnesini onBackup() içine de yazmalısınız geri çağırma; burada da bunu yapmak, oldState nesnesinin onBackup(), onBackup() etiketinden sonra ilk kez çağrıldığında bile geçerlidir geri yüklenir.

onRestore() uygulamanızda readNextHeader() veri kümesindeki tüm varlıklarda yineleme yapmak için data öğesini kullanın. Her varlık için şunları yapın:

  1. getKey() ile varlık anahtarını alın.
  2. Varlık anahtarını, BackupAgent sınıfınızda statik nihai dize olarak belirtmeniz gereken bilinen anahtar değerlerinin listesiyle karşılaştırın. anahtar, bilinen anahtar dizelerinizden biriyle eşleşirse, ayıklamak için bir ifadeye girin varlık verilerini kesin ve cihaza kaydedin:

    1. getDataSize() ile öğe veri boyutunu alın ve bu boyuta sahip bir bayt dizisi oluşturun.
    2. readEntityData() işlevini çağırın ve verileri içine alacak bayt dizisini iletin. Ayrıca başlangıç ofsetini ve okunacak boyutu belirtin.
    3. Bayt diziniz doldu. Verileri okuyup istediğiniz şekilde cihaza yazabilirsiniz.
  3. Verilerinizi okuyup cihaza geri yazdıktan sonra, verilerinizin durumunu onBackup() sırasında yaptığınız gibi newState parametresine yazın.

Örneğin, önceki bölümdeki örnekte yedeklenen verileri nasıl geri yükleyeceğiniz aşağıda açıklanmıştır:

Kotlin

@Throws(IOException::class)
override fun onRestore(data: BackupDataInput, appVersionCode: Int,
                       newState: ParcelFileDescriptor) {
    with(data) {
        // There should be only one entity, but the safest
        // way to consume it is using a while loop
        while (readNextHeader()) {
            when(key) {
                TOPSCORE_BACKUP_KEY -> {
                    val dataBuf = ByteArray(dataSize).also {
                        readEntityData(it, 0, dataSize)
                    }
                    ByteArrayInputStream(dataBuf).also {
                        DataInputStream(it).apply {
                            // Read the player name and score from the backup data
                            playerName = readUTF()
                            playerScore = readInt()
                        }
                        // Record the score on the device (to a file or something)
                        recordScore(playerName, playerScore)
                    }
                }
                else -> skipEntityData()
            }
        }
    }

    // Finally, write to the state blob (newState) that describes the restored data
    FileOutputStream(newState.fileDescriptor).also {
        DataOutputStream(it).apply {
            writeUTF(playerName)
            writeInt(mPlayerScore)
        }
    }
}

Java

@Override
public void onRestore(BackupDataInput data, int appVersionCode,
                      ParcelFileDescriptor newState) throws IOException {
    // There should be only one entity, but the safest
    // way to consume it is using a while loop
    while (data.readNextHeader()) {
        String key = data.getKey();
        int dataSize = data.getDataSize();

        // If the key is ours (for saving top score). Note this key was used when
        // we wrote the backup entity header
        if (TOPSCORE_BACKUP_KEY.equals(key)) {
            // Create an input stream for the BackupDataInput
            byte[] dataBuf = new byte[dataSize];
            data.readEntityData(dataBuf, 0, dataSize);
            ByteArrayInputStream baStream = new ByteArrayInputStream(dataBuf);
            DataInputStream in = new DataInputStream(baStream);

            // Read the player name and score from the backup data
            playerName = in.readUTF();
            playerScore = in.readInt();

            // Record the score on the device (to a file or something)
            recordScore(playerName, playerScore);
        } else {
            // We don't know this entity key. Skip it. (Shouldn't happen.)
            data.skipEntityData();
        }
    }

    // Finally, write to the state blob (newState) that describes the restored data
    FileOutputStream outstream = new FileOutputStream(newState.getFileDescriptor());
    DataOutputStream out = new DataOutputStream(outstream);
    out.writeUTF(playerName);
    out.writeInt(mPlayerScore);
}

Bu örnekte, onRestore() parametresine iletilen appVersionCode parametresi kullanılır. Ancak yedekleme yapmayı seçtiyseniz bu seçeneği kullanabilirsiniz kullanıcının uygulama sürümü aslında geri taşındığında (örneğin, Kullanıcı, uygulamanızın 1.5 sürümünden 1.0 sürümüne geçmiştir). Daha fazla bilgi için sonraki bölüme bakın.

Veri geri yükleme sürümünü kontrol edin

Yedekleme Yöneticisi, verilerinizi bulut depolama alanına kaydettiğinde, manifest dosyanızın android:versionCode özelliği tarafından tanımlandığı şekilde uygulamanızın sürümünü otomatik olarak dahil eder. Yedekleme Yöneticisi, yedeklemenizi aramadan önce aracısını siz geri yükleyecekseniz android:versionCode ve bunu, geri yükleme veri kümesinde kaydedilen değerle karşılaştırır. Yedekleme veri kümesine kaydedilen sürüm, cihazdaki uygulama sürümünden daha yeniyse kullanıcı, uygulamasının sürümünü düşürmüştür. Bu durumda Yedekleme Yöneticisi, uygulamanız için geri yükleme işlemini iptal eder ve geri yükleme kümesi eski bir sürüm için anlamsız olduğu için onRestore() yönteminizi çağırmaz.

Bu davranışı android:restoreAnyVersion özelliğiyle geçersiz kılabilirsiniz. Uygulamayı geri yüklemek istediğinizi belirtmek için bu özelliği true olarak ayarlayın sürümden bağımsız olarak değiştirebilirsiniz. Varsayılan değer: false. Şu durumda: bunu true olarak ayarlarsanız Yedekleme Yöneticisi android:versionCode ve her durumda onRestore() yönteminizi çağırın. Bu sayede, onRestore()yönteminizdeki sürüm farkını manuel olarak kontrol edebilir ve sürümler eşleşmezse verileri uyumlu hale getirmek için gereken tüm adımları atabilirsiniz.

Bir geri yükleme işlemi sırasında farklı sürümleri ele almanıza yardımcı olmak için onRestore() yöntemi, geri yükleme verilerinde bulunan sürüm kodunu size iletir appVersionCode parametresi olarak ayarlanır. Ardından, PackageInfo.versionCode alanını kullanarak mevcut uygulamanın sürüm kodunu sorgulayabilirsiniz. Örnek:

Kotlin

val info: PackageInfo? = try {
    packageManager.getPackageInfo(packageName, 0)
} catch (e: PackageManager.NameNotFoundException) {
    null
}

val version: Int = info?.versionCode ?: 0

Java

PackageInfo info;
try {
    String name = getPackageName();
    info = getPackageManager().getPackageInfo(name, 0);
} catch (NameNotFoundException nnfe) {
    info = null;
}

int version;
if (info != null) {
    version = info.versionCode;
}

Ardından, PackageInfo kaynağından alınan version değerini onRestore() kaynağına iletilen appVersionCode değeriyle karşılaştırın.

Yedekleme isteğinde bulunma

İstediğiniz zaman dataChanged() numaralı telefonu arayarak yedekleme işlemi isteyebilirsiniz. Bu yöntemi ile verilerinizi yedeklemek istediğinizi Yedekleme Yöneticisi'ne bildirir. aracılığıyla e-posta alırsınız. Ardından Yedekleme Yöneticisi, yedek temsilcinizin onBackup() yöntemini kullanabilirsiniz. Genellikle, Verileriniz her değiştiğinde (ör. kullanıcı bir uygulamayı değiştirdiğinde) yedekleyin tercihinizi belirtin). Yedekleme Yöneticisi temsilcinizden yedekleme isteğinde bulunmadan önce dataChanged()'ü birkaç kez ararsanız temsilciniz onBackup()'a yalnızca bir kez çağrı alır.

Geri yükleme isteğinde bulunma

Uygulamanızın normal ömrü boyunca bir geri yükleme işlemi istemeniz gerekmez. Sistem, uygulamanız yüklendiğinde yedek verileri otomatik olarak kontrol eder ve geri yükleme işlemi gerçekleştirir.

Otomatik Yedekleme'ye Taşıma

Uygulamanızı tam veri yedeklerine aktarmak için android:fullBackupOnly manifest dosyasındaki <application> öğesinde true olarak değiştirin. Çalışırken Android 5.1 (API düzeyi 22) veya önceki sürümü çalıştıran bir cihazda uygulamanız bunu yoksayar değerini döndürür ve anahtar/değer çifti yedeklemeleri gerçekleştirmeye devam eder. Çalışırken uygulamanız, Android 6.0 (API düzeyi 23) veya sonraki sürümleri çalıştıran bir cihazda Auto'yu çalıştırıyorsa Anahtar/değer çifti yedeği yerine yedekleme.

Kullanıcı gizliliği

Google olarak kullanıcıların bize duyduğu güvenin farkındayız. güvenliğini sağlama sorumluluğunu gizlilik. Google yedek verileri güvenli bir şekilde iletir ile Google sunucuları arasında paylaşılan yedekleme ve geri yükleme özelliklerini kullanır. Google bu verileri Google'ın Gizlilik Politikası'na uygun olarak kişisel bilgi olarak ele alır.

Ayrıca kullanıcılar, Android sisteminin yedekleme ayarlarından veri yedekleme işlevini devre dışı bırakabilir. Kullanıcı yedeklemeyi devre dışı bıraktığında Android Yedekleme Hizmeti kayıtlı tüm yedek verileri siler. Kullanıcı, cihazda yedeklemeyi yeniden etkinleştirebilir ancak Android Yedekleme Hizmeti daha önce silinen verileri geri yüklemez.