一、支持allowBackup
在安卓Manifest.xml文件中有一個非常重要的標籤,就是android:allowBackup屬性。這個屬性決定了是否允許系統備份應用數據,是在開發應用時需要特別注意的一個點。
首先我們看看這個屬性的聲明方式:
android:allowBackup=["true" | "false"]
其中,”true”表示允許備份;”false”表示禁止備份。默認情況下,該屬性為true。
如果應用程序中沒有聲明這個屬性,系統默認為true,就允許我們應用程序的數據通過備份工具(如adb backup)進行備份。
那麼,我們為什麼需要備份呢?
一方面,開發者可能需要這些數據來測試他們的應用程序,比如你可以恢復用戶在你的應用程序中輸入的數據,從而進行驗證。
另一方面,如果用戶升級了他們的設備,或者因某種原因重新安裝應用程序,那麼他們可以從備份中恢復他們的數據,而不是失去它們。
二、編程中的allowBackup什麼意思
如果你不想讓應用程序中的數據被備份,可以將這個屬性設置為false。通常,在開發應用程序時,我們希望保存用戶數據並在必要時使用它們,這樣我們就需要在Manifest文件中聲明這個屬性。
一般情況下,直接在Manifest文件中添加屬性即可,例如:
<application
android:name=".MyApplication"
android:allowBackup="false"
...>
這裡我們聲明了一個名為MyApplication的類,並將屬性allowBackup設置為false,這樣我們就禁止了應用程序的備份。
三、allowBackup怎麼辦
那麼,如果我們需要備份應用程序中的數據呢?此時我們需要做一些配置。讓我們進一步探討一下:
四、安卓allowBackup選取
1、聲明備份數據類型
首先,我們需要聲明哪些數據應該被備份。這是通過在Manifest文件中定義<backupagent>元素來實現的:
<application
android:name=".MyApplication"
android:allowBackup="true"
...>
<backupagent android:name=".MyBackupAgent" android:allowBackup="true" />
...
</application>
這裡我們聲明了一個名為MyBackupAgent的備份代理,並將屬性allowBackup設置為true。我們也可以在backupagent元素中定義備份的數據類型:
<application
android:name=".MyApplication"
android:allowBackup="true"
...>
<backupagent
android:name=".MyBackupAgent"
android:allowBackup="true"
android:backupAgent=".MyBackupAgent"
android:killAfterRestore="false">
<include
android:domain="sharedPreference"
android:path="my_prefs.xml" />
<exclude
android:domain="file"
android:path="my_file.txt" />
</backupagent>
...
</application>
這裡我們定義了兩個<include>和<exclude>元素,用於指定哪些數據類型應該被包含在備份中,哪些應該被排除。
2、創建備份代理類
接下來我們需要創建一個備份代理類,並在類中實現備份和恢複數據方法。備份代理通常繼承自BackupAgent類,並重寫onBackup()和onRestore()方法。
public class MyBackupAgent extends BackupAgent {
static final String PREFS_BACKUP_KEY = "my_prefs";
static final String FILE_BACKUP_KEY = "my_file";
@Override
public void onBackup(ParcelFileDescriptor oldState, BackupDataOutput data, ParcelFileDescriptor newState) throws IOException {
// 備份shared preferences
SharedPreferences prefs = getSharedPreferences("my_prefs", MODE_PRIVATE);
byte[] bytes = prefs.getString("my_prefs", "").getBytes();
data.writeEntityHeader(PREFS_BACKUP_KEY, bytes.length);
data.writeEntityData(bytes, bytes.length);
// 備份文件
File file = new File(getFilesDir(), "my_file.txt");
FileInputStream fis = new FileInputStream(file);
byte[] buffer = new byte[(int) file.length()];
fis.read(buffer);
data.writeEntityHeader(FILE_BACKUP_KEY, buffer.length);
data.writeEntityData(buffer, buffer.length);
}
@Override
public void onRestore(BackupDataInput data, int appVersionCode, ParcelFileDescriptor newState) throws IOException {
while (data.readNextHeader()) {
String key = data.getKey();
int dataSize = data.getDataSize();
byte[] buffer = new byte[dataSize];
data.readEntityData(buffer, 0, dataSize);
if (PREFS_BACKUP_KEY.equals(key)) {
String prefsString = new String(buffer);
SharedPreferences prefs = getSharedPreferences("my_prefs", MODE_PRIVATE);
prefs.edit().putString("my_prefs", prefsString).commit();
} else if (FILE_BACKUP_KEY.equals(key)) {
FileOutputStream fos = openFileOutput("my_file.txt", MODE_PRIVATE);
fos.write(buffer);
fos.close();
}
}
}
}
這裡,我們重寫了onBackup()和onRestore()方法。onBackup()方法中,我們備份了shared preferences和一個文件。onRestore()方法中,我們恢復了這兩個數據類型。
注意,在onBackup()方法中,我們需要確保要備份的數據以字節數組的形式寫入BackupDataOutput。在onRestore()方法中,我們需要從BackupDataInput中讀取備份數據,並根據鍵值類型進行恢復處理。
3、跟蹤備份和恢復過程
假設我們已經完成了備份代理的設置和實現,並想查看備份和恢復過程中發生的情況。我們可以使用命令行工具來執行備份和還原操作。
下面是一個備份命令的例子:
adb backup -f myapp.ab com.example.myapp
在這個例子中,我們使用adb工具,在myapp.ab文件中備份了com.example.myapp應用程序的數據。注意,我們要使用應用程序的包名來指定應用程序。
還原數據的命令如下:
adb restore myapp.ab
我們可以在應用程序的onRestore()方法中打印日誌來跟蹤數據還原過程。
本文代碼示例:
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.example.myapp">
<application
android:name=".MyApplication"
android:allowBackup="false"
...>
<backupagent android:name=".MyBackupAgent" android:allowBackup="true" />
...
</application>
</manifest>
public class MyBackupAgent extends BackupAgent {
static final String PREFS_BACKUP_KEY = "my_prefs";
static final String FILE_BACKUP_KEY = "my_file";
@Override
public void onBackup(ParcelFileDescriptor oldState, BackupDataOutput data, ParcelFileDescriptor newState) throws IOException {
// 備份shared preferences
SharedPreferences prefs = getSharedPreferences("my_prefs", MODE_PRIVATE);
byte[] bytes = prefs.getString("my_prefs", "").getBytes();
data.writeEntityHeader(PREFS_BACKUP_KEY, bytes.length);
data.writeEntityData(bytes, bytes.length);
// 備份文件
File file = new File(getFilesDir(), "my_file.txt");
FileInputStream fis = new FileInputStream(file);
byte[] buffer = new byte[(int) file.length()];
fis.read(buffer);
data.writeEntityHeader(FILE_BACKUP_KEY, buffer.length);
data.writeEntityData(buffer, buffer.length);
}
@Override
public void onRestore(BackupDataInput data, int appVersionCode, ParcelFileDescriptor newState) throws IOException {
while (data.readNextHeader()) {
String key = data.getKey();
int dataSize = data.getDataSize();
byte[] buffer = new byte[dataSize];
data.readEntityData(buffer, 0, dataSize);
if (PREFS_BACKUP_KEY.equals(key)) {
String prefsString = new String(buffer);
SharedPreferences prefs = getSharedPreferences("my_prefs", MODE_PRIVATE);
prefs.edit().putString("my_prefs", prefsString).commit();
} else if (FILE_BACKUP_KEY.equals(key)) {
FileOutputStream fos = openFileOutput("my_file.txt", MODE_PRIVATE);
fos.write(buffer);
fos.close();
}
}
}
}
原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-hant/n/188731.html
微信掃一掃
支付寶掃一掃