ほとんどのアプリで、サーバーとクライアント間でデータを同期するための2つの実装を見てきました。これは、GCMがセットアップされていないことを前提としています。
上記のどれをアプリに含めることをお勧めしますか、またその理由は何ですか?
注:同期アダプターは非同期で実行されるため、データを定期的かつ効率的に転送するが、瞬時には転送しないことを期待して使用する必要があります。リアルタイムのデータ転送が必要な場合は、AsyncTaskまたはIntentServiceで実行する必要があります。- source 。
基本的に、リアルタイム転送が必要な場合はIntentService(最初のオプション)を使用し、それ以外の場合はSyncAdapterを使用します。私はIntentServiceを好みますが、それはよりカスタマイズ可能に感じるためですが、より簡単なアプローチはSyncAdapterを使用することです。
必要な同期の種類に大きく依存します。
アプリが毎日特定の時間に投稿を発行するニュースアプリ(毎日7.45 AMとしましょう)の場合、バックグラウンドサービスで定期的にタスクを実行します(たとえば、午前8時)。
例::ドリップラー。彼らは私に毎日1回通知します(午後6時30分頃)。彼らは定期的な仕事をしていると思います。
データ転送がユーザーアクションによってトリガーされる場合は、データ転送にバックグラウンドサービスまたはAsyncTaskを使用します。
例::DropBox/Evernote。アプリを操作すると同期します。
アプリがインスタントメッセージング/メール/非定期的な重要な更新を実行する場合、ユーザーにすぐに警告するため、プッシュ通知が必要です。この場合は、GCMまたはParseを使用します。例:WhatsApp/Googleチャット。 GCMを使用しないことを明示的に述べたので、独自に記述する代わりに標準のプッシュ通知プロバイダーを使用する必要がある理由を説明します:
プッシュ通知は瞬時に機能します-遅延はほとんどありません(秒単位、まれに数分)。これを行うための独自のソリューション/ライブラリを実装する場合-単純なモデルでは、毎秒または5秒または1分ごとにサーバーにpingして、ステータスを確認します。これは、CPU(およびバッテリー)、モバイルの帯域幅、サーバーの負荷を消費するため、非常に非効率的です。ただし、GCM/Parseでは、サーバーとのポートを常に開いたままにします( ここ を参照)。これが標準で最も効率的な方法です。さらに、10個のアプリがGCMを使用している場合、10個のオープン接続は必要なく、デバイスごとに1つだけ必要です。また、正当な理由/資金/時間がない限り、独自のソリューションを開発したくありません。
同期アダプターに関する注意:同期アダプターは、上記の3つのケースすべてに適しています。 同期アダプタの実行 を確認すると、GCMまたは独自のメカニズム(イベントトリガーまたはカスタムソリューション)またはネットワークの可用性(イベントトリガー)または定期的なイベントに依存していることがわかります。全体として、これは毎回初期化の長いリストを実行したり、上記のすべてのケースを1か所に実装したりすることなくデータを同期するための優れた便利なクラスです。
他の回答では言及されていないSyncAdapter
の1つの側面があります。
SyncAdapter
パターンでは、同期する特定の ContentProvider 権限と、同期される特定のアカウントタイプ( Authenticator を参照)が必要です。そのため、アーキテクチャにこれらのコンポーネントがすでにある場合(たとえば、他のアプリにデータへのアクセスを許可する場合や、アカウントをサポートする必要がある場合)を除いて、SyncAdapter
は実装に大きなオーバーヘッドを引き起こします。
Sync Adaptersは、リアルタイムのデータが必要でない限り使用する必要があります。これは、データの変更、経過時間、時刻などのさまざまな基準に基づいてデータ転送を自動化するためです。データ転送は、他のアプリからのデータ転送と組み合わせて行われるため、バッテリーの使用量が削減されます。
使用できる瞬時のタスクには、
AsyncTask短時間のタスクの場合、3〜4秒になることがあります。
IntentService長時間実行タスクの場合。
接続性を伴うデータの同期に関しては、スケーリングも可能にする必要があります。私はそれを行うために推奨される方法は同期アダプターを使用することだと思います。
Androidトレーニングガイド: 同期アダプターの作成 を確認すると、そのようにも見えます。
アプリの同期アダプターコンポーネントは、デバイスとサーバーの間でデータを転送するタスクのコードをカプセル化します。アプリで指定したスケジュールとトリガーに基づいて、同期アダプターフレームワークが同期アダプターコンポーネントのコードを実行します...
デザインについて話しているので、SyncAdapters、SyncResultオブジェクト、およびその後の処理について説明する必要があります。
私は実際にSyncAdapterを使用して、ライブラリにサーバーへのIntentService Web呼び出しを行うように指示しています。この「同期」操作の管理には注意が必要です。
私が今取っている1つのアプローチは、SyncResultオブジェクトを完全に無視し、サービスを使用して個々の「同期」の結果をログに記録することです