안녕하세요^^
좋은 강의 덕분에 제대로된 안드로이드 개념을 잡아가고 있는 초보 개발자 입니다~ㅎ
예전에 댓글로 질문을 달았었는데 감질맛이 나서 자세하게 풀어서 질문드리고 싶네요-!
일단 저의 최종 목표는 BackupAgent기능을 설정하였을 경우 이용자가 어플을 삭제 후 재설치 or 본인의 구글계정으로
다른 새로운 디바이스에 설치하였을때 백업된 Internal Data나 Preference값이 복구되길 원하는것인데요..
adb명령으로는 즉각 확인이 됩니다만, 일반적인 코드 명령으로는 감감 무소식입니다 ^^;
제가 구현한 방법은
http://developer.android.com/resources/samples/BackupRestore/index.html
소스를 참조하였습니다.
Manifest는 다음과 같이 필수조건을 기재해 주었구요..
기타소스는 샘플예제와 동일합니다.
샘플예제에서 궁금한점 한가지가..
BackupAgentHelper를 상속받을경우 onBackup()과 onRestore()를 오버라이딩 받지 않아도 된다고 하였는데..
다음과 같이 선언된 이유는
SharedPreferencesBackupHelper가 아닌
FileHelper를 이용할경우 ThreadSafe하지 않기 때문에 Mutex개념으로 Lock을 걸어준다.. 라고 이해하는게 맞을까요?
일단 위의 코드를 Device에 올렸을경우
- adb shell dumpsys backup 수행 시 다음과 같은 결과를 보여줍니다.
다음과 같이 정상적으로 등록된 것을 확인 하였습니다.
초기 실행화면입니다.
원하는값을 변경할때마다
백업매니져의 dataChanged()메소드를 호출하며,
Framework 소스를 따라가면 다음과 같이 호출됨을 확인하였습니다.
이때, 만약 BackupManager.dataChanged()메소드를 여러번 호출하면 호출한만큼 백업을 수행하는지, 아니면
일정시간동안 메세지큐에 쌓아놓은 후 특정시간에 백업요청을 할때 가장 최신의 데이터만 백업요청을하는지 궁금합니다.
(당최 제눈으로 확인할 방법이 없네요..)
변경 후 모습. 개발자의 의도대로라면 어플리케이션 삭제 후 재 설치시 해당 메뉴가 저절로 선택되어 있어야합니다.
삭제 후 재 설치시 그냥 초기화면과 동일합니다.(혹시나 싶어 그 다음날까지 어플리케이션을 유지 시킨 후 해보았지만 동일결과)
여기서 Restore last data 버튼을 클릭시
RequestRestore명령을 수행하게 되고
프레임워크 소스를 따라 디버깅하면 result의 리턴값은 -1을 반환합니다.
설명에 따르면 0일경우만 성공이고, 그 외의 값은 실패라고 설명이 되어있군요..
즉 복구에 실패합니다.
그러면 이제 adb 명령을 이용하여 복구를 시도해 보겠습니다.
•$ adb shell bmgr enable true
–Bakup기능 활성화
•$ adb shell bmgr backup “패키지 명”
–Backup Manager queue에 backup 요청 추가
•$ adb shell bmgr run
–Backup 강제 수행
•adb uninstall “패키지 명”
–어플리케이션 삭제
다음과 같은 순서로 진행하였습니다.
테스트결과 현재 이방법으로도 복구가 안됩니다^^;
(이전에 꽤나 많이 테스트했을때는 위의 질문사항은 모두 동일한 결과를, 그리고 아래의 adb명령은 직통으로 수행되었었습니다.)
지금 구글서버에 문제가 있는걸까요~~ 이후에 테스트하여 잘 실행되면 업데이트 하도록 하겠습니다~ㅎ
아무튼 제 질문은 여기까지 입니다.
추가로 해당 테스트를 진행하다보면 다음과 같은 로그캣이 발견될 때가 있습니다.(adb shell bmgr run 수행)
혹시 관련이 있을까요?
혹시라도 제 방법에 빠진부분이나 잘못된방법이 있다면 지적해주시면 감사하겠습니다.
좋은하루 되세요!!
*추가수정(11.12.06 15:05)
백업기능이 Device의 영향을 받는경우가 있을까요?(어떤곳에서는 되고 어떤곳에서는 안되는등..)
다음과 같은 허니컴 시료에서는 adb 명령이 정상 작동하여 uninstall 후 재 실행해도 데이터가 복구되어 있네요 ..^^
Restore last data 버튼 클릭시.
첫댓글 자문자답입니다~ dataChanged()명령을 아무리 많이 수행해도 첫 명령이 실제로 수행되기 이전까지의 dataChanged()명령은 다 무효화 시키는것 같네요.
프레임웤 소스 주석에 나와있는설명입니다.
* When an application has made changes to data which should be backed up, a
* call to {@link #dataChanged()} will notify the backup service. The system
* will then schedule a backup operation to occur in the near future. Repeated
* calls to {@link #dataChanged()} have no further effect until the backup
* operation actually occurs.
자답 하나 더 추가합니다.
프레임웤 상에선 12시간이라고 되어 있었지만
정말 인내심을 가지고 5일정도 기다리니 복구가 잘 되네요 ^^(인내심이 필요한 테스트네요..)
^^b 고생하셨습니다.
이거 순전히 한번 되는거 보기만 하면 되는데...
보지를 못하니까? 자신이 잘못 구현한건지... 답답하셨을것 같네요. ^^