SyncAdapterのススメ



SyncAdapterの練習用にSmartTrainingにSyncAdapter機能を実装してみました。これを基にざっくりSyncAdapterについてまとめてみました。細かい実装方法は面倒なのでここでは載せませんので、以下のキーワードから自分で調べてください。(と、突き放す。) 宝くじでも当たって仕事しなくて良くなるくらい暇になったらもっと細かい実装方法についても書くかもしれません。
  • SyncAdapterの定義
    • SampleSyncAdapterのように、クラウド上のデータと端末上のデータを相互に連携するための一連の仕組みを指します。
  • SyncAdapterの概要
    • アプリケーション内データとクラウド上データの連携をサポートしてくれる仕組み。
    • 端末のアカウント設定(AccountManager)と連動する。
    • API Level 5以上で利用可。
  • SyncAdapterがやってくれること
    • Syncのトリガを提供してくれる。
    • Sync中にシステムSyncアイコンを表示してくれる。
  • SyncAdapterがやってくれないこと
    • Sync処理(Syncロジック)そのもの
    • 認証処理そのもの
  • メリット
    • アカウント管理を端末のアカウント設定と統合できる。
    • システムSyncアイコンが使える。
      • 同期中の状態をユーザに通知するのにNotificationではちょっと主張が強すぎる。通知領域以外で、バックグラウンドでタスクが実行されていることを表現するのに適している。
    • Sync開始したときに通信不可状態だった場合、通信が復活したら自動的にsyncをしてくれる。
      • 個人的にはこれがSyncAdapterを実装する最大のモチベーション。
      • 一応、ネットワークの状態監視とキュー管理を自前で作れないことはないけど。
  • デメリット
    • 実装しなければいけないことがわりと多い。一般的には以下の実装が必要。
      • SyncAdapter
      • SyncService
      • Authenticator
      • DataProvider
      • SyncServiceのXML定義
      • AuthenticatorのXML定義
      • Syncロジック
      • 認証画面
  • SyncAdapterに必要な実装
    • SyncAdapter
      • Sync動作のエントリポイント(onPerformSync())
      • extends AbstractThreadedSyncAdapter
    • SyncService
      • SyncAdapterのインスタンス生成とそのバインドの返却
      • SampleSyncAdapterサンプルの実装がそのまま使える。
    • Authenticator
      • 認証情報の管理(アカウントの追加、tokenの取得、認証情報の更新など)
      • extends AbstractAccountAuthenticator
    • ContentProvider
      • ローカルデータへのアクセス手段(query, insert, update, delete...)を提供
      • Sync動作はContentResolver単位(≒Authority単位)でトリガをひくため、複数のテーブル、DBなどを1回のSyncで実行するためにはトリガの単位とAuthorityの単位を一致させておく必要がある(Authority設計上の注意)。
    • sync-adapterのXML定義
      • OSにSyncAdapterを認識させるための定義
      • 端末設定の「アカウントと同期」に表示されるようになる。
      • 設定によっては非表示にすることもできる。
    • account-authenticatorのXML定義
      • OSにAuthenticatorを認識させるための定義
      • 端末設定の「アカウントと同期」に表示されるようになる。
      • 設定によっては非表示にすることもできる。
    • Syncロジック
      • アプリケーション固有の実装が必要。
    • 認証画面
      • ユーザに認証情報を入力させるためのUI。
      • 他の認証サービスに相乗りすることもできる。その場合は不要。
    • Syncを利用するアプリケーション
      • Syncのトリガをひく(ContentResolver#requestSync())
  • 必須ではないが関連する実装項目
    • BatchOperation
      • 同期処理をバックグラウンドで実行してくれるための仕組み。
      • ArrayListにoperationを追加しておく。
  • その他テクニック
結構大変だったけど、実装して良かったよ。

いじょうだ。

コメント

このブログの人気の投稿

Joinノードを使う(その1)

Execノードを使う

Joinノードを使う(その4)