53

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"
/>
4

3 に答える 3

72

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

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

前者は、このサンプル アプリで行われていることです。彼らは、連絡先のリストを持つ Web サイトをいくつか持っており、それらを他の連絡先と一緒にデバイスに保存したいと考えています。いずれの場合も、これがすべて機能する方法は、次の 3 つのコンポーネント間の関係を通じて行われます。

  1. データを格納する ContentProvider。
  2. リモート サーバーと通信して ContentProvider に入れるデータを取得する SyncAdapter。
  3. SyncAdapters と ContentProviders をペアにする方法を理解する Android ContentResolver。

Android デバイスは、さまざまな ContentProvider とさまざまな SyncAdapter を持つことができます。ContentResolver は SyncAdapter と同じ.apkの一部ではない可能性があるため、ContentResolver は、特定の種類のデータを格納するための適切な ContentProvider を見つけるシステム サービスです。これは、1 つの特定の 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 が一意であることを確認する必要があります。これを行う最善の方法は、Authority でドメイン名 (Java クラス スタイル) の一部を使用することです。逆の順序で書きます。これは彼らの例に示されています... com.android.contacts.

于 2011-03-02T16:24:21.060 に答える
5

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

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

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

それが関係の始まりであり、用語のいくつかの内訳です。

于 2010-12-22T02:07:52.813 に答える
2

Account-type、Sync Adapter と Content Authority の間の関係を作成する方法です。

AndroidManifest をもう一度見てみると、同期サービスの奇妙なメタデータ タグは、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" />

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

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

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

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

于 2014-06-25T10:34:48.700 に答える