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:
Manifest dosyanızda yedek aracınızı
android:backupAgent
özelliğini gönderin.Aşağıdakilerden birini yaparak bir yedekleme aracısı tanımlayın:
-
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çinonBackup()
veonRestore()
yöntemlerini geçersiz kılmanız gerekir. -
İ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()
veonRestore()
'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çinBackupAgentHelper
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:
SharedPreferencesBackupHelper
yedekleyebilirSharedPreferences
dosyaları kullanabilirsiniz.- Arkaya
FileBackupHelper
kadar büyük bir kayıt görevi görebilir.
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:
- İ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.
- Yardımcıyı
BackupAgentHelper
'inize eklemek içinaddHelper()
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ığı veyaonRestore()
'den çağrıldığı şekildeonBackup()
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/yazmaParcelFileDescriptor
. 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ındaoldState
olarak döndürülür.onBackup()
yönteminiz. Yedekleme verilerinizinewState
adresine yazmazsanız Yedekleme Yöneticisi bir sonraki seferonBackup()
'yi çağırdığındaoldState
boş bir dosyayı işaret eder.
Bu parametreleri kullanarak onBackup()
yönteminizi uygulayarak aşağıdakileri yapın:
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: bununewState
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.
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:
Telefonla arama
writeEntityHeader()
, yazmak üzere olduğunuz veri için benzersiz bir dize anahtarı iletmek ve veri boyutunuz.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.
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 sonrakionBackup()
çağrısında bu değerioldState
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ındaoldState
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/yazmaParcelFileDescriptor
. Bu nesne,onBackup()
bir sonraki sefer çağrıldığındaoldState
olarak döndürülür. Bunu hatırla aynınewState
nesnesinionBackup()
içine de yazmalısınız geri çağırma; burada da bunu yapmak,oldState
nesnesininonBackup()
,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:
getKey()
ile varlık anahtarını alın.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:getDataSize()
ile öğe veri boyutunu alın ve bu boyuta sahip bir bayt dizisi oluşturun.readEntityData()
işlevini çağırın ve verileri içine alacak bayt dizisini iletin. Ayrıca başlangıç ofsetini ve okunacak boyutu belirtin.- Bayt diziniz doldu. Verileri okuyup istediğiniz şekilde cihaza yazabilirsiniz.
Verilerinizi okuyup cihaza geri yazdıktan sonra, verilerinizin durumunu
onBackup()
sırasında yaptığınız gibinewState
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.