回答:
注:同期アダプターは非同期で実行されるため、データを定期的かつ効率的に転送することを期待して使用する必要がありますが、即時ではありません。リアルタイムのデータ転送を行う必要がある場合は、AsyncTaskまたはIntentServiceで行う必要があります。- ソース。
基本的に、リアルタイム転送が必要な場合はIntentService(最初のオプション)を使用し、そうでない場合はSyncAdapterを使用します。IntentServiceの方がカスタマイズしやすいと思うので、私はIntentServiceを好みますが、もっと簡単なアプローチはSyncAdapterを使用することです。
必要な同期の種類に大きく依存します。
アプリが毎日特定の時間に投稿を発行するニュースアプリ(毎日午前7時45分)の場合、午前8時にバックグラウンドサービスで定期的なタスクを実行します。
例:ドリッパー。毎日1回(午後6時30分頃)通知されます。定期的なタスクを使用していると思います。
データ転送がユーザーのアクションによってトリガーされる場合は、データ転送にバックグラウンドサービスまたはAsyncTaskを使用します。
例:DropBox / Evernote。アプリを操作すると同期します。
アプリでインスタントメッセージング/メール/定期的ではない重要な更新を実行する場合は、プッシュ通知が必要です。ユーザーにすぐにアラートを送信するためです。この場合は、GCMまたはParseを使用します。例:WhatsApp / Googleチャット。あなたが明示的にあなたがGCMを使用したくない言及したので、あなたはなぜ、私が教えてくれるはずです代わりに、独自のものを書くの標準プッシュ通知プロバイダを使用します。
プッシュ通知は瞬時に機能します-遅延はほとんどありません(数秒、まれに数分)。これを行うための独自のソリューション/ライブラリを実装する場合、単純なモデルでは、ステータスを確認するために1秒ごと、5秒ごと、または1分ごとにサーバーにpingを実行します。これは、CPU(およびバッテリー)、モバイルの帯域幅、サーバーの負荷を消費するため、非常に非効率的です。ただし、GCM / Parseでは、常にサーバーに対してポートを開いたままにします(こちらを参照)。これが標準で最も効率的な方法です。さらに、10個のアプリがGCMを使用する場合、10個のオープン接続は必要ありません。デバイスごとに1個だけ必要です。そして、あなたはそうする正当な理由/資金/時間がない限り、あなた自身のソリューションを開発したくありません。
同期アダプターに関する注意:同期アダプターは、上記の3つのすべてのケースでうまく機能します。同期アダプターの実行を確認すると、GCMまたは独自のメカニズム(イベントトリガーまたはカスタムソリューション)またはネットワークの可用性(イベントトリガー)または定期的なイベントに依存していることがわかります。全体として、これは毎回長い初期化リストを作成したり、上記のすべてのケースを1か所で実装したりすることなく、データを同期するための便利なクラスです。
SyncAdapter
他の回答では言及されていないaの1つの側面があります。
このSyncAdapter
パターンでは、同期する特定のContentProvider機関と、同期される特定のアカウントタイプ(認証システムを参照)が必要です。そのため、アーキテクチャ内にこれらのコンポーネントが既に存在しない限り(たとえば、他のアプリにデータへのアクセスを許可したり、アカウントをサポートする必要があるため)、SyncAdapter
実装のオーバーヘッドが大きくなります。
接続性を含むデータの同期に関しては、スケーリングも可能にする必要があります。推奨される方法は、同期アダプターを使用することです。
また、Androidのトレーニングガイドを確認すると、そのように見えます:同期アダプターの作成
アプリの同期アダプターコンポーネントは、デバイスとサーバー間でデータを転送するタスクのコードをカプセル化します。アプリで提供するスケジューリングとトリガーに基づいて、同期アダプターフレームワークは同期アダプターコンポーネントでコードを実行します...
データ変更、経過時間、時刻などのさまざまな基準に基づいてデータ転送を自動化するため、リアルタイムデータが必要でない限り、同期アダプタを使用する必要があります。他のアプリからのデータ転送により、バッテリーの使用量が削減されます。
使用できる瞬時のタスクには、
短時間のタスクのAsyncTaskは、3〜4秒です。
長時間実行タスク用のIntentService。