7

Android 애플리케이션에서 SharedPreferences를 백업하는 방법에 대한 숙제를했습니다. 특히 이전 버전과의 호환성을 유지하기 위해 리플렉션을 사용했습니다. 적어도 나는 노력해왔다. 불행히도, 내 코드 중 실제로 백업을 만드는 끝나지 않아! 여기에는 here과 같이 에뮬레이터에서 adb bmgr 명령이 강제 실행됩니다. 커뮤니티에서 저를 도울 수 있을지 궁금합니다. 그리고 그 과정에서 좀 더 나은 문서화가 나오기를 바랍니다.Android SharedPreferences 백업이 작동하지 않습니다.

여기 내 코드가 있습니다. 이것을 다른 사람들을 위해 가능한 한 포괄적 인 것으로 유지하기 위해서, 나는 단지 Andycom.example.andy의 패키지 이름으로 호출 할 것이다.

안드로이드 매니페스트 (발췌)

<application 
    ... 
    android:backupAgent="com.example.andy.backupHelper" 
    android:restoreAnyVersion="true"> 
    ... 
    <meta-data 
     android:name="com.google.android.backup.api_key" 
     android:value="GIVEN KEY GOES HERE" /> 
    ... 

backupHelper.java

참고 : /data/data/com.example.andy/shared_prefs/com.example.andy_preferences.xml

package com.example.andy; 

import android.app.backup.BackupAgentHelper; 
import android.app.backup.SharedPreferencesBackupHelper; 

public class BlinkyBackup extends BackupAgentHelper { 

    static final String PREFS_FILE = "andy_preferences"; 
    static final String BACKUP_KEY = "AndyPreferencesBackup"; 

    public void onCreate() { 

     SharedPreferencesBackupHelper backupHelper = new SharedPreferencesBackupHelper(this, PREFS_FILE); 
     addHelper(BACKUP_KEY, backupHelper); 
    } 
} 

BackupAgentWrapper

package com.example.andy; 

import android.app.backup.BackupManager; 
import android.content.Context; 

public class BackupAgentWrapper { 

    private BackupManager wrappedInstance; 

    static { 

     try { 

      Class.forName("android.app.backup.BackupManager"); 
     } 
     catch (Exception e) { 

      throw new RuntimeException(e); 
     } 
    } 

    public static void checkAvailable() {} 

    public void dataChanged() { 

     wrappedInstance.dataChanged(); 
    } 

    public BackupAgentWrapper(Context ctx) { 

     wrappedInstance = new BackupManager(ctx); 
    } 
} 

마지막으로 런타임 중에 백업을 시작하는 명령입니다. 내 응용 프로그램에서이 코드는 내 응용 프로그램에서 사용할 수있는 클래스 (주 활동이 아님)에서 실행되며 이 생성시 컨텍스트로 전달 된 다음 개인 변수 mContext에 저장됩니다. 주요 통화 활동 (앱에서 시작하는 첫 번째)에서

$ adb shell bmgr enable true 
$ adb shell bmgr backup com.example.andy 
$ adb shell bmgr run 

답변

5

, 당신은 BackupManager를 인스턴스화해야합니다

private void backupData() { 

    boolean backupAgentAvailable = false; 

    try { 

     BackupAgentWrapper.checkAvailable(); 
     backupAgentAvailable = true; 
    } 
    catch (Throwable t) { 

     // really nothing to do 
    } 

    if(backupAgentAvailable) { 

     BackupAgentWrapper backupWrapper = new BackupAgentWrapper(mContext); 
     backupWrapper.dataChanged(); 
    } 
} 

은 위의 기능도 실제로 백업 데이터 아래의 명령이 모두 요약하자면, :

이렇게하면 백업 관리자가 백업 파일을 찾아로드하도록 지시합니다.

환경 설정 파일의 형식이 "packagename_preferences"인지 확인해야합니다 (예 : andy_preferences. 처음 환경 설정을 저장할 때 같은 이름을 사용하십시오.

mBackupManger.dataChanged(); 
: (! 아주 중요한) 활동이 apply() 또는 commit()를 통해 저장하는 설정 후

, 그렇게 직후 포함 뭔가가 변경된 것을 BackupManager 말할 필요