あなたのアプリはクラウドにデータをバックアップできますか?:Androidで動く携帯Javaアプリ作成入門(44)(3/3 ページ)
Androidエミュレータで使えるbmgrコマンドの使い方やバックアップサービスへの登録方法に加え、サンプルを通じて、アプリにバックアップ/レストア機能を組み込む方法などを解説します。
バックアップエージェントの実装(BackupAgent編)
「BackupAgentHelper」クラスを継承したバックアップエージェントは、ほとんどonCreate()だけで実装が済んでしまいましたが、「BackupAgent」クラスを継承するバックアップエージェントは少し複雑です。ただし、細かな制御も可能になります。
実装が少し長いので、onCreate()から見ていきましょう。
@Override public void onCreate() { mDataFile = new File(getFilesDir(), FILENAME); }
ファイルディレクトリに保存されているデータファイルを作成します。後で、このファイルから内容を読み出してバックアップデータを生成します。
次はonBackup()です。
@Override public void onBackup(ParcelFileDescriptor oldState, BackupDataOutput data, ParcelFileDescriptor newState) throws IOException { Log.d(TAG, "Backup..."); synchronized (LOCK) { // 【1】 RandomAccessFile file = new RandomAccessFile(mDataFile, "r"); mCount = file.readInt(); // 【2】 file.close(); } boolean doBackup = (oldState == null); // 【3】 if (!doBackup) { doBackup = compareStateFile(oldState); // 【4】 } if (doBackup) { ByteArrayOutputStream baos = new ByteArrayOutputStream(); DataOutputStream dos = new DataOutputStream(baos); dos.writeInt(mCount); byte[] buffer = baos.toByteArray(); int len = buffer.length; data.writeEntityHeader(APP_DATA_KEY, len); // 【5】 data.writeEntityData(buffer, len); } writeStateFile(newState); // 【6】 }
ファイル内容を読み出す場合も、【1】のようにsynchronizedで排他するのは同様です。
【2】では、ファイルからデータを取り出しています。FileBackupHelperを用いる実装と異なるのはバックアップ対象データを扱う柔軟さですが、実装が複雑になる部分でもあります。
【3】では、バックアップを取る必要があるかどうかを判断しています。oldStateがnullならバックアップが必要、または【4】でバックアップ実装またはデータ内容が異なる場合はバックアップが必要、と判断しています。
バックアップが必要な場合、【5】でバックアップデータを書き出しています。【6】では、現在の状態をnewStateに書き出します。
最後にonRestore()です。
@Override public void onRestore(BackupDataInput data, int appVersionCode, // 【1】 ParcelFileDescriptor newState) throws IOException { Log.d(TAG, "Restore..."); while (data.readNextHeader()) { // 【2】 String key = data.getKey(); int dataSize = data.getDataSize(); if (APP_DATA_KEY.equals(key)) { // 【3】 byte[] dataBuf = new byte[dataSize]; data.readEntityData(dataBuf, 0, dataSize); ByteArrayInputStream bais = new ByteArrayInputStream(dataBuf); DataInputStream din = new DataInputStream(bais); mCount = din.readInt(); // 【4】 MainActivity.sendBroadcast(this, mCount); // 【5】 synchronized (LOCK) { // 【6】 RandomAccessFile file = new RandomAccessFile(mDataFile, "rw"); file.setLength(0L); file.writeInt(mCount); file.close(); } } else { data.skipEntityData(); // 【7】 } } writeStateFile(newState); // 【8】 }
今回の実装では使いませんでしたが、【1】のようなappVersionCodeでアプリのバージョンコードが渡されてきます。バージョンコードはバックアップの際には自動的に収集されます。
今回はバックアップエージェントにバージョンを独自に持ちましたが、アプリのバージョンコードで実装の違いを管理するのも1つの方法です。
バックアップされたデータには複数の領域が存在する可能性があるため、データを読み出す際には、【2】のようにwhileループですべてのヘッダを読み出して目的のデータを探し出す必要があります。
目的のデータかどうかは【3】のように確認します。データ形式が分かっているので【4】のようにデータを直接読み出します。
【5】では、Intentをブロードキャストしてデータを画面に即時反映しています。繰り返しになりますが、ファイルの読み書きは【6】のような排他が必要です。
目的のデータではなかった場合、【7】のようにスキップします。これは通常は起こりませんが、古いアプリが新しいバックアップデータを読んでしまうようなケースに限られるでしょう。
【8】のように現在の状態をnewStateに書き出してレストアは終了です。
データバックアップ時の4つの注意点
アプリのデータバックアップ、いかがだったでしょうか。買い替えなどで新しい端末にアプリを再インストールしたとき、以前の状態が復元されると、ユーザーの利便性が増し、「おおっ」とか「ちゃんとしてるな」という印象を得られるのではないでしょうか。
最後になりますが、バックアップで注意すべき点を個条書きにして今回は終わりにします。
- バックアップをデータ同期の目的で使用しない
- バックアップ対象のデータが変更されたらdataChanged()を呼び出すべき
- バックアップはいつ実施されるか分からないため、過度に信頼しない
- requestRestore()はユーザーデータが失われる可能性があるので、使う際は注意
- グーグルのAPIを使うときに欠かせないGoogle OAuthの作り方と使い方
- 細か過ぎて伝わってないけど開発者が知っておきたいAndroid Mの新機能まとめ
- 腕時計から電話をかけるAndroid Wearアプリの作り方
- Android Wear用アプリの花形、時計アプリ「Watch Face」の基本的な作り方
- Android 5.0発表&スマホと連動する音声認識Android Wearアプリの作り方
- ウェアラブル端末用Android Wearアプリ開発の基礎知識
- 変わらないと生き残れないAndroid Lの新機能まとめ
- Android WearやIoTで注目のAndroidセンサー機能8選
- ウェアラブル時代に見直したいAndroidの加速度/重力センサー、ジャイロスコープ
- あなたの知らないAndroid SDKの便利tools、14選まとめ
- Android 4.4のメモリ使用状況を把握する3つのツールの使い方
- Androidでリアルタイムマルチプレーゲームを開発するには
- 低性能端末でも使えるか? Android 4.4 KitKatの新機能39選
- もはや無料BaaS。ゲーム以外でも使いたくなるGoogle Play Game Servicesのデータ管理機能
- アプリにGoogle+のソーシャルグラフを持ち込めるGoogle Play Game Servicesの基礎知識
- あなたのアプリはクラウドにデータをバックアップできますか?
- Eclipse ADTに代わるIDEとなるか? Android Studioの基礎知識
- ActionBarで、アプリのUIはこんなにスマートになる
- Android 4.x時代のアプリにないと残念なActionBarとは
- 動的クラスローディングでAndroidアプリ“裏”開発
- Android 4.xのAndroidビームをアプリに組み込むには
- AndroidアプリでNFCタグを読み書きするための基礎知識
- 新タブレット時代を見据えるAndroid 4.2の新機能9選
- Androidからイヤフォンやヘルス機器とBluetooth通信するには
- Bluetoothを使ってAndroidアプリ同士で通信するには
- Androidアプリをアプリ内購読に対応してもうける方法
- 開発者が知らないと残念過ぎるAndroid 4.1の新機能36選
- Androidのプロセス間通信を自由自在にするAIDL
- Android 4.0のサービス/プロセス間通信の基本
- Androidアプリでマルチメディアを扱うための基礎知識
- Androidのウィジェットにノーティフィケーションするには
- Android 4.0で注目の顔認識をアプリに組み込むには
- Android 4.0でアプリ開発を始めるための環境構築
- 開発者が知らないと損するAndroid 4.0の新機能44選
- Android Compatibility packageで2.x系でもマルチサイズ対応
- Androidの画面の大きさの違いを解決するFragments
- Android 3.0の新APIで簡単ドラッグ&ドロップ実装
- 開発者が知って得するAndroid 2.3の新機能18選
- アニメーションでAndroidに独創的な画面エフェクトを
- Androidアプリで“アニメーション”するための基礎知識
- XMLレイアウトでAndroidアプリに“設定画面”を追加
- 開発者が知っておきたいAndroid 2.2の新機能12連発
- もはやケータイに必須のカメラをAndroidで制御しよう
- 地図/位置情報/GPSを使うAndroidアプリを作るには
- Android NDKでJNIを使用してアプリを高速化するには
- Android 2.1の新機能「Live Wallpaper」で作る、美しく燃える“待ち受け”
- iPhoneより多彩なAndroidのセンサをアプリで操作
- SurfaceViewならAndroidで高速描画ゲームが作れる
- Android 1.6のジェスチャーとテキスト読み上げを使う
- Androidのホーム画面に常駐するアプリを作るには
- Netbookにも広まるAndroidで、かつてないWeb体験を
- アプリを国際化してAndroid Marketから世界へ発信
- 常駐アプリが作成できるAndroidの“サービス”とは
- AndroidでSQLiteのDB操作をするための基礎知識
- Androidアプリの使いやすさを左右する5つのレイアウト
- 簡単でワクワクするAndroidウィジェット10連発!
- ブラウザや地図、ストリートビューの基、Intentとは?
- Androidアプリ作成の基本“Activity”とは何か?
- Android Market配布を目指しEclipseでHelloWorld!
Copyright © ITmedia, Inc. All Rights Reserved.
関連記事
- 安藤幸央のランダウン(62):スマホアプリ開発に超絶便利なBaaSとは、MEAPとは
バックエンドの設定用のモバイル向けクラウドサービス「BaaS」と、企業向け業務アプリの複数プラットフォーム対応ソリューション「MEAP」についてまとめて紹介します - Java 7ランタイムもサポート:Google App Engine、「Cloud Endpoints」でモバイルバックエンド環境を提供
米Googleは2月21日、PaaS環境「Google App Engine」の新機能として、Webやモバイル用のバックエンド構築をシンプル化した「Google Cloud Endpoints」のプレビューを公開した。 - D89クリップ(22):「iCloud」が示す「こちら側」を中心とした世界観とは?
15分で体験するApple WWDC 2011 Keynote。コンテンツが自動的に同期される「こちら側」を中心とした世界観。アップルならではの「クラウド」の姿とは - 「スマートフォンとクラウドをつなぐ技術カタログ」最新記事一覧
スマートフォンとクラウドコンピューティングの技術を組み合わせた際に、アプリ開発を効率化できるToolkitやSDKを取り上げていきます
関連リンク
- バックエンドはクラウドにお任せ「BaaS」の現在−第34回HTML5とか勉強会レポート
アプリのフロントエンド開発者向けに生み出されたBackend as a Service。すでに米国では多数のベンダが存在。現状をまとめてお伝え