7

Data Backupで説明されているように BackupAgent を実装し、API キーを登録し、マニフェストで BackupAgent を宣言しました。バックアップ部分は非常にうまく機能していると思います。コマンド ラインで実行するadb shell bmgr runと、次の出力が LogCat に表示されます。

01-11 22:23:09.002: DEBUG/PerformBackupThread(97): starting agent for backup of BackupRequest{app=ApplicationInfo{4547c5b8 com.meins.nightclock} full=false}
01-11 22:23:09.002: DEBUG/BackupManagerService(97): awaiting agent for ApplicationInfo{4547c5b8 com.meins.nightclock}
01-11 22:23:09.013: DEBUG/BackupManagerService(97): agentConnected pkg=com.meins.nightclock agent=android.os.BinderProxy@4536a7f8
01-11 22:23:09.032: DEBUG/BackupHelperDispatcher(9122): handling existing helper 'alarms' android.app.backup.FileBackupHelper@44e197b0
01-11 22:23:09.032: DEBUG/BackupHelperDispatcher(9122): handling existing helper 'prefs' android.app.backup.SharedPreferencesBackupHelper@44e19478
01-11 22:23:09.032: VERBOSE/LocalTransport(97): performBackup() pkg=com.meins.nightclock
01-11 22:23:09.032: VERBOSE/LocalTransport(97): Got change set key=alarms:alarms size=16 key64=YWxhcm1zOmFsYXJtcw==
01-11 22:23:09.042: VERBOSE/LocalTransport(97):   data size 16
01-11 22:23:09.062: VERBOSE/LocalTransport(97): Got change set key=prefs:com.meins.nightclock_preferences size=265 key64=cHJlZnM6Y29tLm1laW5zLm5pZ2h0Y2xvY2tfcHJlZmVyZW5jZXM=
01-11 22:23:09.072: VERBOSE/LocalTransport(97):   data size 265
01-11 22:23:09.072: VERBOSE/LocalTransport(97): finishBackup()

一方、onReceive()メソッドが呼び出されない場合、復元部分はまったく機能しません。アプリを再インストールすると、BackupAgent を参照する可能性のある (?) 唯一の出力は

01-11 22:14:01.042: DEBUG/vending(7426): [100] LocalAssetCache.updateOnePackage(): No local info for com.meins.nightclock

実行するadb shell bmgr restore com.meins.nightclockと、単に状態になりUnable to restore package com.meins.nightclockます。


次の実装を使用していますBackupAgentHelper

package com.meins.nightclock;

import java.io.IOException;

import android.app.backup.BackupAgentHelper;
import android.app.backup.BackupDataInput;
import android.app.backup.BackupDataOutput;
import android.app.backup.FileBackupHelper;
import android.app.backup.SharedPreferencesBackupHelper;
import android.os.ParcelFileDescriptor;
import android.util.Log;

public class MyBackupAgent extends BackupAgentHelper {

    public static final Object[] DATA_LOCK = new Object[0];

    private static final String PREFS_BACKUP_KEY = "prefs";
    private static final String ALARMS_BACKUP_KEY = "alarms";

    private DataLayerAlarms d;

    @Override
    public void onBackup(ParcelFileDescriptor oldState, BackupDataOutput data,
            ParcelFileDescriptor newState) throws IOException {

        if (d.backup() != 0)
            return;

        synchronized (DATA_LOCK) {
            super.onBackup(oldState, data, newState);
        }
    }

    @Override
    public void onCreate() {
        SharedPreferencesBackupHelper preferencesHelper = new SharedPreferencesBackupHelper(this,
                getPackageName() + "_preferences");
        addHelper(PREFS_BACKUP_KEY, preferencesHelper);

        FileBackupHelper fileHelper = new FileBackupHelper(this, DataLayerAlarms.BACKUP_FILE);
        addHelper(ALARMS_BACKUP_KEY, fileHelper);

        d = new DataLayerAlarms(this);
    }

    @Override
    public void onRestore(BackupDataInput data, int appVersionCode, ParcelFileDescriptor newState)
            throws IOException {
        Log.d(toString(), "onRestore()");
        synchronized (DATA_LOCK) {
            super.onRestore(data, appVersionCode, newState);
        }

        d.restore();
    }

}

完全を期すために、関連するマニフェスト部分:

<application
    android:icon="@drawable/icon"
    android:label="@string/app_name"
    android:debuggable="true"
    android:backupAgent="MyBackupAgent">
    <meta-data
        android:name="com.google.android.backup.api_key"
        android:value="AEdPqrEAAAAI4MsUOC-[...]" />

    ...

</application>

BackupManager がこのパッケージを復元できない理由を知っている人はいますか?

4

3 に答える 3

3

次のように、バックアップ クラス名の前にドットを追加してみてください。

android:backupAgent=".MyBackupAgent"

または、バックアップ クラスがルート パッケージにない場合は、パスを追加します。

android:backupAgent=".package.MyBackupAgent"
于 2011-12-25T13:05:29.437 に答える
0

この問題は、パッケージ名を変更したときに発生し、その後、他の問題が発生しました。理解するのに数時間かかりました。

インスタントランを無効にします。それは私にとって物事を台無しにしました。

トランスポート リストを確認し、Google が設定されていることを確認します。

adb shell bmgr list transports
    android/com.android.internal.backup.LocalTransport
  * com.google.android.gms/.backup.BackupTransportService

BackupAgentHelper パッケージ名とメタデータ パッケージ名が同じ名前であることを確認してください。名前の競合により、問題が発生する可能性があります。

android:backupAgent BackupAgent のサブクラスであるアプリケーションのバックアップ エージェントを実装するクラスの名前。属性値は、完全修飾クラス名 (「com.example.project.MyBackupAgent」など) である必要があります。ただし、省略形として、名前の最初の文字がピリオド (「.MyBackupAgent」など) の場合は、要素で指定されたパッケージ名に追加されます。デフォルトはありません。名前を指定する必要があります。

于 2018-02-18T00:46:26.727 に答える