Androidアプリケーションでの同期の機能

A. 画像



多くのAndroidアプリケーションを開発する場合、データをサーバー上のデータと同期するプロセスを整理する必要があります。 この同期を実装するには、主に2つの方法があります。

最初の方法は、 AlarmManagerServiceを使用した古典的な方法(最も一般的で最も簡単な方法)です。 たとえば、この記事で説明されているように。

2番目の方法は「正しい」方法です(ただし、これまでのところ、明らかに誰にも使用されることはほとんどありません) -SyncAdapterを使用しています



アプリケーションの開発中、最初に「正しい」ものを実装しようとしました(つまり、2番目の方法)。



実装方法は少し低くなります。 最初に、実装中に遭遇した困難と機能について説明します。



SyncAdapterを使用した同期の実装の機能



まず第一に、この方法はドキュメントにあまり説明されていません。 Android開発者のサイトには実装例がありますがこのリンクの記事がより良い例です(説明付き)。



この同期方法が機能するには、プロポーザル専用の別のタイプのアカウントを作成する必要があります(既存のアカウント、たとえばGoogleアカウントが適切でない場合)。これは別の記事のトピックです(例については、 こちらを参照してください )。

このアカウントは、 [設定] / [ アカウントと同期]セクションで利用できます。 アカウントの作成(および削除)は、アプリケーションからだけでなく、このセクションからも可能になります。 その中で、アプリケーションに複数のアカウントを作成できます(アプリケーションに必要ですか?)。 アカウントごとに名前が必要です(OAuthアカウントの場合、架空の名前を使用する必要があります)。

同時に、誤って記述されたアカウントコードはデバイスとエミュレーターの両方を再起動します-テストするのは困難です。 同時に、アカウントを担当するコードのみを作成してテストしたい場合、うまくいきません。SyncAdapterコードが完全に書かれていないと、 アカウントと同期に 入るとデバイスが再起動します

同期プロセスにアカウントが必要ない場合はどうなりますか? ダミーアカウントを作成する必要があります。



アプリケーションが既存のデータベース(電話の連絡先、カレンダーイベント、または写真など)とデータを同期する場合、すべてがよりシンプルになります(ネットワーク上のほとんどの例は、このタイプの同期に関するものです)。 データと同期を行う場合は、 ContentProviderを作成する必要があります。

アプリケーションがベースを他のアプリケーションと共有したくない場合はどうなりますか? たとえば、 ダミーContentProviderを作成する必要があります。



すべてが完了し、独自のSyncAdapterが書き込まれた場合(以下を参照)、ローカルデータベースのデータが変更されたときに同期が自動的に開始されます。



同期を手動で開始する必要がある場合、このためのrequestSync()関数があります。以下に関数の制限について記述します。 同期を自動的に開始する必要がある場合、このための別の関数-addPeriodicSync()があります。 ただし、Android 2.2以降でのみ機能します。 ただし、この機能は正常に機能します。たとえば、同期時にインターネット接続がない場合、表示された瞬間に同期が自動的に行われます。



SyncAdapter 'aを使用して同期を実装する方法



SyncAdapterを使用して同期を実装するには、何をする必要がありますか? (StackOverflowからの翻訳応答



1.アプリケーションが同期をサポートしていることをAndroidに通知します


これを行うには、AndroidManifest.xmlで同期サービスを指定します。

<service android:name=".sync.mySyncService" android:exported="true"> <intent-filter> <action android:name="android.content.SyncAdapter" /> </intent-filter> <meta-data android:name="android.content.SyncAdapter" android:resource="@xml/sync_myapp" /> </service>
      
      





ここで、 nameは同期のクラスの名前に対応する名前です(これについては後で詳しく説明します)。 エクスポート -サービスを他のコンポーネント(同期サービスとの対話に使用されるContentResolverを含む)で利用できるようにします。 intent-filterを使用すると、同期が必要なイベント(たとえば、 ContentResolver 'aのRequestSync()関数によって同期が要求されたときに発生するイベント)をインターセプトできます。



2. SyncAdapter 'aを見つけるサービス(サービス)を作成します


例:

 public class mySyncService extends Service { private static mySyncAdapter mSyncAdapter = null; public SyncService() { super(); } @Override public void onCreate() { super.onCreate(); if (mSyncAdapter == null) { mSyncAdapter = new mySyncAdapter(getApplicationContext(), true); } } @Override public IBinder onBind(Intent arg0) { return mSyncAdapter.getSyncAdapterBinder(); } }
      
      





クラスはServiceを拡張する必要があり、 AbstractThreadedSyncAdapterインスタンス変数が必要です。 パブリックIBinder onBind(Intent)を実装し、 SyncAdapterBinderを返す必要があります

このクラスにはかなり多くの実装が必要です。なぜなら、 このサービスは、 Android SyncAdapterの標準インターフェースを提供します。



3.直接同期のためのSyncAdapterクラスを作成します


mySyncAdapter-同期ロジック自体が含まれる場所。 同期時間が来ると、 onPerformSync()が呼び出されます。



4.アカウントタイプとContent Authorityのバインド


AndroidManifest.xmlファイルの段落1の名前フィールドで、 ContentAuthorityとアカウント間の接続を形成する値を指定しました。 AndroidManifest.xmlは別のxmlファイルを参照します。 この例では、これはsync_myapp.xmlです。

 <?xml version="1.0" encoding="utf-8" ?> <sync-adapter xmlns:android="http://schemas.android.com/apk/res/android" android:contentAuthority="com.android.contacts" android:accountType="com.google" android:userVisible="true" />
      
      





このファイルは、 作成したSyncAdapterが連絡先を同期することをAndroidに伝えます。



contentAuthorityのすべての文字列値は、同期が発生する値と一致する必要があります。 同期が独自のデータベースで発生する場合は、値を使用します。 既存のデータベース(連絡先やカレンダーイベントなど)を使用する場合は、標準値を使用します。 たとえば、上記の値「com.android.contacts」は標準の連絡先を識別します。



accountTypeの値は、値または標準値のいずれかに一致する必要があります。 独自のタイプのアカウントを作成する場合、サーバーで認証するためにAccountAuthenticatorのサブクラスを作成する必要があります(上記の記事を参照)。 この例で指定されている値「com.google」は、Googleアカウントを使用していることを示しています。



5.作成されたアカウント -ContentAuthorityペアの同期を有効にする


最後に、同期プロセスを有効にすることができます。 これは、 [設定] / [ アカウントと同期]セクションで実行するか、アプリケーションでプログラムで実行できます。



 ContentResolver.setSyncAutomatically(account, AUTHORITY, true);
      
      







同期を行うには、アプリケーションだけでなく許可する必要があります-同期のためのグローバル許可が必要です( [設定 / アカウントと同期]セクションで、対応するチェックボックスをオンにする必要があります)。

これらの条件のいずれかが満たされない場合、 RequestSync()を呼び出してもすぐには何も起こりませんが、要求された同期は、同期がオンになるとすぐに実行されます。 ただし、これを回避する方法があります。



さらに、定期的な自動同期を有効にすることができます。



結論



それで、 ASyncTaskと比較したSyncAdapterとの良い(+)および悪い(-)同期はですか?



(+)標準に準拠(アプリケーションはすべての同期アプリケーションのリストにあります)

(+)複数のアカウントのサポート

(+)自動同期の実装の容易さ(他のすべてがすでに記述されている場合)

(+)インターネット接続時の自動同期

(+)標準データベース(連絡先、カレンダーなど)との同期の利便性

(-)アカウントを作成する必要性

(-)完全なドキュメントの欠如

(-)実装とテストの複雑さ

(-)自動定期同期のためのAndroid 2.2以降の必要性

(-)ContentProvider'aを作成する必要性



合計で、 アプリケーションの同期にASyncTaskを選択しました (ただし、SyncAdapterのコードはほぼ完全に記述されていますが)-まず、Androidのバージョン2.2に制限されたくありませんでした。



All Articles