Androidエミュレータで使えるbmgrコマンドの使い方やバックアップサービスへの登録方法に加え、サンプルを通じて、アプリにバックアップ/レストア機能を組み込む方法などを解説します。
アプリが“設定”を持つような場合、またはゲームのハイスコアのような情報を保持する必要がある場合、開発者は「SharedPreferences」「File」「Database」などで、それらの状態を永続化することがあると思います。
ただ、こうしたAndroid内のストレージに保存するデータは、アプリのアンインストール時に削除され、再インストール時にはなくなってしまっています。そのため、機種変更などでデータを移行できませんでした。
この問題は、Android 2.2(Froyo、API Level 8)からは「android.app.backup」パッケージで提供されるバックアップ/レストア機能によって、グーグルの提供するクラウドサーバを使うことで解決できるようになりました。本連載のAndroid 2.2が登場した際の機能紹介でも取り上げています。
今回は、そんなAndroidアプリのデータをバックアップ/レストアするためのAPIについて、サンプルアプリを用いて具体的な使用方法を解説します。
アプリは以下よりダウンロードしてください。
アプリの仕様は以下の通りです。
このサンプルアプリはパッケージが「com.example」であることから、実際にGoogle Play Storeにアップロードしてグーグルのクラウドサーバにバックアップを取ることはできません。その代わり、エミュレータ上で手動によるバックアップ/レストアコマンドが実行できます。
コマンドプロンプトを開いて、以下のように入力します。
adb shell bmgr run
これでバックアップ処理が走り、エミュレータがデバイスの外にファイルをバックアップします。この状態でアプリをアンインストールして、再インストールすると、自動的にバックアップデータがレストアされます(※デバイスの設定による)。アプリの「Restore」ボタンでも強制的にレストア可能です。
また、以下のコマンドでもレストアを強制的に行えます。
adb shell bmgr restore com.example.android.backup
今回のアプリは、アプリ起動中にレストア処理が実行されても、すぐに画面に反映するように作ってあります。
先に少し紹介したエミュレータの「bmgr」コマンドは、バックアップ/レストアを実装したアプリのテストに役立ちます。このコマンドとバックアップ処理のライフサイクルについて説明します。
通常は、アプリからバックアップ対象のデータが変更されたことをBackupManagerに通知します。今回のアプリでは、それをボタンで実装しているので、任意のタイミングで通知できますが、実際のアプリではデータが変更されるタイミングを制御できない可能性があります。
そうした場合に、以下のコマンドでデータが変更されたことをBackupManagerに通知できます。
adb shell bmgr backup <package>
このコマンドも、BackupManagerへのデータ変更通知である「BackupManager.dataChanged()」メソッドも、それ自体は何も行わず、「自分で実装したバックアップエージェント(後述)を実行してください」という依頼をするだけです。バックアップがいつ実行されるかは分かりません。
これを強制的にバックアップ実行するのが、以下のコマンドです。
adb shell bmgr run
Android公式のドキュメントによると、「dataChanged()またはbmgr backupでバックアップ指示をしたものだけがバックアップされる」とのことなのですが、実際にはそれらを呼び出していなくてもバックアップは行われるようです。
データのレストアは、アプリの再インストール時には自動的に行われますが、以下のようにコマンドを入力して強制的に行うことも可能です。
adb shell bmgr restore <package>
「bmgr backup」コマンドが「BackupManager.dataChanged(String)」メソッドと同じであるのと同様、「bmgr restore」コマンドは「BackupManager.requestRestore(RestoreObserver)」メソッドと同じです。
backupがいつか行われる処理の依頼であるのに対し、restoreは即時実行です。これは、現在保持しているデータを破棄して、バックアップ状態に戻すことを意味しており、ユーザーデータが消失する危険を伴います。アプリの初回起動時に、端末が自動レストア設定になっていない場合に使用するのが安全で合理的だと思います。
一度データをバックアップすると、アプリをアンインストールしてもそのデータは残ったままになります。保存データの形式が変わったり、テストで最初からやり直したいような場合、以下のコマンドでエミュレータに保持しているバックアップデータを削除できます。
adb shell bmgr wipe <package>
また、コマンドでデバイスのバックアップ設定の確認・変更が行えます。
以下のコマンドで上記サンプルアプリの画面の「Back up my data」のチェック状態を取得できます。
adb shell bmgr enabled
以下のコマンドで、チェック状態を変更できます。
adb shell bmgr enable <true|false>
Copyright © ITmedia, Inc. All Rights Reserved.