連載
» 2013年07月18日 18時00分 公開

あなたのアプリはクラウドにデータをバックアップできますか?Androidで動く携帯Javaアプリ作成入門(44)(2/3 ページ)

[緒方聡,イーフロー]

バックアップする対象

 バックアップ対象は、プログラマが自由に設定することが可能ですが、大まかに「ファイル」「共有環境設定」「何でも」という分類になります。ファイルだけ、あるいは共有環境設定だけのバックアップ/レストアなら非常に簡単です。データベースもファイルとしてバックアップしてしまうなら、簡単に済みます。「ファイル」「共有環境設定」で、それぞれデータを保持するようなケースだと、少し複雑になります。

 今回のサンプルアプリでは、説明上機能的に簡単にしたので、「ファイル」を2通りの方法でバックアップ/レストアしています。1つは「FileBackupHelper」クラスを用いた簡単な方法、もう1つは「Helper」クラスを用いない、複雑だけど柔軟な方法です。

バックアップサービスへの登録

 アプリをバックアップするには、以下よりグーグルが提供する開発者向けサービスへ登録する必要があります。

 ここでアプリのパッケージ名を入力すると、以下のような「Android Backup Service Key」が発行されます。

 ここに記載されている<meta-data>タグを以下のように「AndroidManifest.xml」に追加します。

    <meta-data
        android:name="com.google.android.backup.api_key"
        android:value="AEdPqrEAAAAIbZCy_LgG1Y-fX57dd-sVMCpwOgnmaPAtctSnsQ" />

 上記キーは、今回のサンプルでしか使用できないので、自身で作成したアプリには必ず自身のパッケージ名で登録したキーを入力してください。

バックアップエージェントの登録

 AndroidManifest.xmlの<application>タグに、バックアップ関連の属性を追加します。

    <application
        android:allowBackup="true"
        android:backupAgent="DataBackupAgent"

 重要なのは上記2つです。「android:allowBackup」は、これがtrueになっていなければバックアップが行われません。「android:backupAgent」は、バックアップの実装が行われているBackupAgentを継承したクラスを指定します。

 今回のサンプルアプリは、2種類のバックアップエージェントを実装してあります。「DataBackupAgent」クラスではなく「FileBackupAgent」クラスの動作を確認したい場合は、android:backupAgentの中を「FileBackupAgent」に書き換えて実行してください。その際、バックアップデータは「bmgr」コマンドで「wipe」するようにしてください。

 バックアップ関連のその他の設定項目は、開発者が知っておきたいAndroid 2.2の新機能12連発【3】クラウド向けデータバックアップ用APIを参照してください。

バックアップエージェントの実装(BackupAgentHelper編)

 「BackupAgentHelper」クラスを継承するバックアップエージェントの実装は、とても簡単です。以下のコードで説明します。

public class FileBackupAgent extends BackupAgentHelper {
    static final String FILENAME = "data.txt"; // 【1】
    static final String FILES_BACKUP_KEY = "files"; // 【2】
    static final Object LOCK = new Object(); // 【3】
    static final String TAG = "FileBakupAgent";
    @Override
    public void onCreate() {
        FileBackupHelper helper = new FileBackupHelper(this, FILENAME);
        addHelper(FILES_BACKUP_KEY, helper); // 【4】
    }
    @Override
    public void onBackup(ParcelFileDescriptor oldState, BackupDataOutput data,
            ParcelFileDescriptor newState) throws IOException {
        Log.d(TAG, "Backup files...");
        synchronized (LOCK) { // 【5】
            super.onBackup(oldState, data, newState);
        }
    }
    @Override
    public void onRestore(BackupDataInput data, int appVersionCode,
            ParcelFileDescriptor newState) throws IOException {
        Log.d(TAG, "Restore files...");
        synchronized (LOCK) {
            super.onRestore(data, appVersionCode, newState);
        }
        MainActivity.sendBroadcast(this);
    }
}

 【1】では、ファイル名を保持しています。ファイルはContext#getFilesDir()で取得するファイル用ディレクトリにあることが前提になるため、データベースファイルなどをバックアップする際には工夫が必要になります。

 【2】では、バックアップヘルパーに関連付けるキーを保持しています。このキーを用いてレストア時にデータを個別に取り出すことも可能です。

 【3】は、ファイル入出力を同期するロックオブジェクトです。バックアップ、レストア、アプリによるファイルアクセスはすべて非同期で行われるため、【5】のようにバックアップやレストアを排他しなければなりません。

 【4】では、対象ファイルを登録したヘルパーをキーに関連付けて追加します。

 基本的には、これだけでバックアップとレストアは自動的に行われます。ファイルの場合は同期処理が必要なので、onBackup()やonRestore()をオーバーライドしていますが、これがSharedPreferencesの場合は、SharedPreferences自体がスレッドセーフなので、バックアップエージェントはonCreate()だけで済んでしまいます。

Copyright © ITmedia, Inc. All Rights Reserved.

RSSについて

アイティメディアIDについて

メールマガジン登録

@ITのメールマガジンは、 もちろん、すべて無料です。ぜひメールマガジンをご購読ください。