web-dev-qa-db-ja.com

Android SyncAdapterを使用するにはどうすればよいですか?

Android同期ロジック。理解できないのはファイルsyncadapter.xml Android SDKサンプルプロジェクトSampleSyncAdapter。に含まれています。SDKサンプルをダウンロードした場合、次のフォルダーにある必要があります。

SDK/Android-sdk-PLATFORM/samples/Android-VERSION/SampleSyncAdapter/res/xml/syncadapter.xml

コンテンツプロバイダーの権限は、文字列またはリソースへの参照でなければなりません。コンテンツオーソリティとは何ですか。com.Android.contacts?ファイルの内容は次のとおりです(ライセンス情報とコメントなし、APIレベル16)。

<sync-adapter xmlns:Android="http://schemas.Android.com/apk/res/Android"
    Android:contentAuthority="com.Android.contacts"
    Android:accountType="com.example.Android.samplesync"
    Android:supportsUploading="false"
    Android:userVisible="true"
/>
51
xpepermint

SyncAdapterを作成するときに使用できる2つの基本的な方法があります。

  1. 既存の ContentProvider にデータを入力します。
  2. 独自のContentProviderを作成して、新しい種類のデータを保存します。

前者は、このサンプルアプリで行われていることです。連絡先のリストを含むWebサイトがいくつかあり、それらをデバイス上の他の連絡先とともに保存する必要があります。いずれの場合でも、これがすべて機能する方法は、3つのコンポーネント間の関係を介したものです。

  1. データを保存するContentProvider。
  2. SyncAdapter。リモートサーバーと通信して、ContentProviderに入れるデータを取得します。
  3. AndroidContentResolver。SyncAdaptersとContentProvidersをペアにする方法を見つけます。

Androidデバイスは多くの異なるContentProviderと多くの異なるSyncAdapterを持つことができます。ContentResolverは同じ。apkSyncAdapterとしてのContentResolverは、特定の種類のデータを保存する適切なContentProviderを見つけるシステムサービスです。特定のContentProviderを一意に識別するContentAuthority文字列を使用してこれを行います。さらに、各ContentProviderはAndroidManifest.xmlこれは、ContentResolverがそれを見つけられるようにします。この宣言内で、ContentProviderを他のアプリケーションで使用できるかどうかを指定できます。参照:Android:exported

<provider
    Android:name=".CustomProvider"
    Android:authorities="com.example.app.provider"
    Android:exported="false"
    Android:multiprocess="true" >
</provider>

この場合、既存のContentProviderを使用して、プラットフォームのドキュメントを見て、使用するContentAuthority文字列を確認し、同じ文字列を使用する必要があります。独自のContentProviderを作成している場合、作成するContentAuthorityが一意であることを確認する必要があります。これを行う最良の方法は、認証局でドメイン名の一部(Javaクラススタイル)を使用することです。それらを逆の順序で記述します。これはその例で示されています... com.Android.contacts

71
jcwenger

APKがロードされると、マニフェスト内のディレクティブはOSにすべてのメタデータを確認するよう指示します。この場合、Android連絡先のコンテンツメタデータです。プロバイダーの検索に使用される名前はcom.Android.contacts(Androidで定義)です。データベース(つまり、ContentProvider)へのコンテンツアクセスを提供する権限。

N.B。連絡先ではないWebサービスと同期できる独自のデータのコンテンツプロバイダーになる可能性があります。メタデータは、OSに登録するメカニズムであるため、ブロードキャストメッセージ中に見つけることができます。

この定義されたメタデータは、指定した「同期タイプ」によってSyncAdapterに関連付けられます。タイプの名前はAndroid:accountTypeで、「com.mycompany.myapp」の場合があります。このキーは、すべての同期アダプターへのブロードキャスト中に使用され、コード化されたBroadcastReceiverがユーザーのタイプのメッセージを処理します。

これが関係の始まりであり、用語の一部の内訳です。

5
mobibob

これは、アカウントタイプ、同期アダプタとContent Authority間の関係を作成する方法です

AndroidManifestを振り返ってみると、Syncサービスの奇妙なメタデータタグは、ContentAuthorityとアカウント間のバインディングを確立する重要な要素です。外部で別のxmlファイルを参照します(好きなもの、アプリに関連するものを呼び出します)。

Sync_myapp.xmlを見てみましょう。

    <sync-adapter xmlns:Android="http://schemas.Android.com/apk/res/Android"
    Android:contentAuthority="com.Android.contacts"
    Android:accountType="com.example.Android.samplesync"
    Android:supportsUploading="false"
    Android:userVisible="true" />

Android定義した同期アダプター(このファイルを含むタグを含むタグのname要素で呼び出されたクラスは、comを使用して連絡先を同期します。 example.Android.samplesyncスタイルのアカウント:アカウントの種類と権限は、アプリケーションに固有です。

すべてのcontentAuthority文字列は、すべて一致し、同期対象と一致する必要があります-これは、独自のデータベースを作成する場合は定義する文字列、同期を行う場合は既存のデバイス文字列を使用する必要がありますデータタイプ(連絡先、カレンダーイベント、またはあなたが持っているものなど)上記(「com.Android.contacts」)は、連絡先タイプデータ(サプライズ、サプライズ)のContentAuthority文字列です。

accountTypeは、すでに入力されている既知のアカウントタイプの1つと一致するか、作成中のアカウントタイプと一致する必要があります。

Last userVisible trueは、ユーザーに表示されることを意味します。

2
Nishant Shah