Comment utiliser Android SyncAdapter?



android-contentprovider android-syncadapter (2)

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

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

J'ai lu, l'autorité d'un fournisseur de contenu devrait ê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 information de licence ni commentaires, niveau 16 de l'API).

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

https://ffff65535.com


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

En regardant de nouveau AndroidManifest, cet étrange tag de métadonnées du service Sync est l'élément clé qui établit la liaison entre un ContentAuthority et un compte. Il référence en externe un autre fichier XML (appelez-le comme bon vous semble, correspondant à 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 appelée dans l'élément de nom de la balise contenant la balise contenant ce fichier, synchronisera les contacts à l'aide d'un compte de style com.example.android.samplesync. Account type et autorité sont uniques pour votre application.

Toutes vos chaînes contentAuthority doivent toutes correspondre, et correspondre à ce que vous synchronisez - Ceci 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 de manière connue. types de données (comme des contacts, des événements d'agenda ou ce que vous avez.) La chaîne ci-dessus ("com.android.contacts") se trouve être la chaîne ContentAuthority pour les données de type de contact (surprise, surprise.)

accountType doit également correspondre à l'un de ces types de compte connus déjà saisis ou à l'un de ceux que vous créez.

Dernier utilisateurVisible vrai signifie affiché à l'utilisateur.


Il existe deux méthodes de base que vous pouvez utiliser pour créer un SyncAdapter:

  1. Remplir des 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, tout cela fonctionne à travers une relation entre trois composants:

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

Un appareil Android peut avoir de nombreux ContentProviders et de nombreux SyncAdapters différents. Etant donné qu'un ContentResolver peut ne pas faire partie du même fichier .apk qu'un SyncAdapter, ContentResolver est un service système qui trouve le bon ContentProvider pour stocker un type de données donné. Pour ce faire, il utilise la chaîne ContentAuthority, qui identifie de manière unique un ContentProvider spécifique. De plus, chaque fournisseur de contenu doit être déclaré dans le AndroidManifest.xml ce qui garantit que ContentResolver le trouvera. 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 plate-forme pour connaître la chaîne ContentAuthority utilisée et utiliser la même chaîne. Si vous créez votre propre ContentProvider, vous devez simplement 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é. Ecrivez-les dans l'ordre inverse. Ceci est illustré dans leur exemple ... com.android.contacts .





android-syncadapter