web-dev-qa-db-fra.com

Comment utiliser le Android SyncAdapter?

J'essaie de comprendre la logique de synchronisation Android. Ce que je ne comprends pas, c'est le fichier syncadapter.xml contenu dans le Android exemple de projet SDK SampleSyncAdapter. Si vous avez téléchargé les exemples SDK, il doit se trouver dans le dossier suivant:

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

Je lis, l'autorité d'un fournisseur de contenu doit être une chaîne ou une référence à une ressource. Quelle est exactement l'autorité de contenu et où se trouve com.Android.contacts? Voici le contenu du fichier (sans informations et commentaires sur la licence, API niveau 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

Il existe deux méthodes de base que vous pouvez utiliser lors de la création d'un SyncAdapter:

  1. Remplissez les données dans un ContentProvider existant.
  2. Créez votre propre ContentProvider pour stocker un nouveau type de données.

Le premier est ce qui se passe dans cet exemple d'application. Ils ont un site Web qui contient une liste de contacts, et ils veulent les stocker avec les autres contacts sur l'appareil. Dans les deux cas, la façon dont tout cela fonctionne est basée sur une relation entre trois composants:

  1. Un ContentProvider, qui stocke les données.
  2. Un SyncAdapter, qui communique avec un serveur distant pour obtenir des données à placer dans ContentProvider.
  3. Le Android ContentResolver, qui explique comment associer SyncAdapters et ContentProviders.

Un appareil Android peut avoir de nombreux ContentProviders différents et de nombreux SyncAdapters différents. Puisqu'un ContentResolver peut ne pas faire partie du même . Apk en tant que SyncAdapter, ContentResolver est un service système qui trouve le bon ContentProvider pour stocker un type de données donné. Il le fait en utilisant la chaîne ContentAuthority, qui identifie de manière unique un ContentProvider spécifique. De plus, chaque ContentProvider doit être déclaré dans AndroidManifest.xml Qui garantit qu'il peut être trouvé par ContentResolver. Dans cette déclaration, vous pouvez spécifier si ContentProvider peut être utilisé par d'autres applications, voir: Android:exported.

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

Dans ce cas, en utilisant un ContentProvider existant, vous devrez consulter la documentation de la plateforme pour voir quelle chaîne ContentAuthority ils utilisent et utiliser la même chaîne. Si vous créez votre propre ContentProvider, il vous suffit de vous assurer que le ContentAuthority que vous créez est unique. La meilleure façon de procéder consiste à utiliser des parties de votre nom de domaine (style de classe Java) dans l'Autorité. Écrivez-les dans l'ordre inverse. Ceci est illustré dans leur exemple ... com.Android.contacts.

71
jcwenger

Lorsque votre fichier APK est chargé, les directives du manifeste indiquent au système d'exploitation de revoir toutes les métadonnées. Dans ce cas, il s'agit de métadonnées de contenu pour les contacts Android. Le nom utilisé pour rechercher le fournisseur est com.Android.contacts (défini par Android) - et le propriétaire possède le " "pour fournir l'accès au contenu à sa base de données (c'est-à-dire le ContentProvider).

N.B. Vous pourriez être un fournisseur de contenu de vos propres données qui peuvent être synchronisées avec vos services Web qui ne sont pas des contacts. Les métadonnées sont un mécanisme d'enregistrement auprès du système d'exploitation afin que vous puissiez les retrouver lors d'un message de diffusion.

Ces métadonnées définies vont être associées à votre SyncAdapter en raison du "type de synchronisation" que vous fournissez. Le nom du type est Android: accountType et peut être "com.mycompany.myapp". Cette clé est utilisée lors d'une diffusion vers tous les adaptateurs de synchronisation et votre BroadcastReceiver codé traitera le message avec votre type.

C'est le début des relations et une rupture de la terminologie.

5
mobibob

C'est un moyen de créer une relation entre un type de compte, un adaptateur de synchronisation et une autorité de contenu

En repensant à AndroidManifest, cette étrange balise de métadonnées dans le service Sync est l'élément clé qui établit la liaison entre une ContentAuthority et un compte. Il référence en externe un autre fichier xml (appelez-le comme vous voulez, quelque chose de pertinent pour votre application.)

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

Il indique Android que l'adaptateur de synchronisation que nous avons défini (la classe qui a été appelée dans l'élément name de la balise qui inclut la balise qui inclut ce fichier, synchronisera les contacts à l'aide d'une com. exemple: compte de style Android.samplesync. Le type de compte et l'autorité sont uniques pour votre application.

Toutes vos chaînes contentAuthority doivent toutes correspondre et correspondre à ce que vous synchronisez - Ce doit être une chaîne que vous définissez, si vous créez votre propre base de données, ou vous devez utiliser certaines chaînes de périphérique existantes si vous synchronisez types de données (comme les contacts ou les événements de calendrier ou ce que vous avez.) Ce qui précède ("com.Android.contacts") se trouve être la chaîne ContentAuthority pour les données de type contacts (surprise, surprise.)

accountType doit également correspondre à l'un de ces types de comptes connus qui sont déjà entrés, ou il doit correspondre à celui que vous créez.

Last userVisible true signifie montré à l'utilisateur.

2
Nishant Shah