Skip to content
This repository has been archived by the owner on Jun 20, 2023. It is now read-only.

2.15. ContentProvider の発展

Keishin Yokomaku edited this page Feb 26, 2014 · 23 revisions

この章では、ContentProvider の発展的な使用について解説します。

参考:Content Provider Basics | Android Developers
参考:Transferring Data Using Sync Adapter | Android Developers

目次

  • [ContentProvider へのアクセス](#ContentProvider へのアクセス)
    • バッチ処理
    • Intent によるアクセス
  • データの同期
    • AbstractThreadedSyncAdapter
    • Service
    • メタデータの宣言
    • AndroidManifest の宣言
    • 同期の実行と下位互換

ContentProvider へのアクセス

ContentProvider へのアクセスは、ContentResolver を介して行うことは、2.10. データベースにて解説しました。このページの方法では、1 回のアクセスで 1 回の操作(挿入、更新、削除)を行うように動作します。

今回は、1 回のアクセスで複数の操作(挿入、更新、削除)を行う、バッチ処理について解説するとともに、ContentResolver 以外の手段を用いた ContentProvider へのアクセスについて解説します。

バッチ処理

Intent によるアクセス

データの同期

しばしば、アプリケーションはサーバサイドとのデータのやり取りを密接にやりとりします。ネットワークにつながらない場所に居ても、最低限、それ以前にサーバからダウンロードしておいたデータへのアクセス性を確保したり、定期的にアプリケーション内に蓄積したデータをサーバへ送信することでバックアップを取ったりするような仕組みは、ネットワークへの接続が必ずしも常にあるとは限らない環境において、また、多様な端末を複数使用する環境においては、とても大切な仕組みとなります。

Android では、これらを支援する仕組みとして、クラウドとの同期のためのフレームワークを提供しています。今回は、特に ContentProvider を用いたフレームワークに注目して解説します。

ContentProvider 以外にも同期の仕組みが存在しますが、この仕組は3.08. クラウド同期で解説します。

AbstractThreadedSyncAdapter

ContentProvider のデータの同期を目的としたクラスで、ContentResolver によって同期のタイミングが管理されます。

このクラスは、アプリケーションプロセスが実行中、ワーカスレッド上でクラウドとの同期処理を記述するフレームワークを提供しています。UI スレッドとは別のスレッド上で実行される為、各種の IO を同期的に記述しても問題ありません。

Service

データの同期のタイミングで呼び出され、AbstractThreadedSyncAdapter に記述した同期の手続きを実行するための Service を定義します。

AbstractThreadedSyncAdapter のインスタンスは、アプリケーションのライフサイクルの中で Singleton として扱うようにし、複数の AbstractThreadedSyncAdapter のインスタンスを生成して並列に同期を実行してしまうことを防ぎます。

Singleton として扱うための手続きとして、Double Checked Locking のイディオムが用いられます。

public MySyncService extends Service {
    private static AbstractThreadedSyncAdapter sAdapter;
    private static final Object LOCK = new Object();
    @Override
    public void onCreate() {
        if (sAdapter == null) {
            synchronized (LOCK) {
                if (sAdapter == null) {
                    sAdapter = new MySyncAdapter(getApplicationContext(), true);
                }
            }
        }
    }

    @Override
    public IBinder onBind(Intent intent) {
        return sAdapter.getSyncAdapterBinder();
    }
}

メタデータの宣言

AndroidManifest の宣言

同期の実行と下位互換

GitHub Pagesへ移行しましたmixi-inc.github.ioへお願いします。

Clone this wiki locally