2010-10-22 14 views
51

Intento entender la lógica de sincronización de Android. Lo que no entiendo es el archivo syncadapter.xml contenido en el proyecto de ejemplo de Android SDK SampleSyncAdapter. Si descargó los ejemplos de SDK debe estar en la carpeta siguiente:¿Cómo uso Android SyncAdapter?

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

leí, la autoridad de un proveedor de contenidos debe ser una cadena o una referencia a un recurso. ¿Cuál es exactamente la autoridad de contenido y dónde está com.android.contacts? Aquí está el contenido del archivo (sin información ni comentarios sobre la licencia, nivel de 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" 
/> 
+1

Lea los ** artículos ** y vea los ** proyectos de ejemplo ** mencionados en [esta publicación] (http://stackoverflow.com/questions/1859241/own-sync-adapter-for-android/ 7795266). Uno de los ejemplos se refiere a la aplicación last.fm y también mencionó la configuración 'android: contentAuthority'. – JJD

Respuesta

4

Cuando el APK se carga, las directivas en el manifiesto decirle al sistema operativo para revisar todos los meta-datos. En este caso, son metadatos de contenido para contactos de Android. El nombre que se utiliza para encontrar el proveedor es com.android.contacts (definido por Android), y el propietario tiene la "autoridad" para proporcionar acceso al contenido a su base de datos (es decir, ContentProvider).

N.B. Puede ser un proveedor de contenido de sus propios datos que se puede sincronizar con sus servicios web que no son contactos. Los metadatos son un mecanismo para registrarse en el SO para que pueda encontrarlo durante un mensaje de difusión.

Este metadato definido se asociará con su SyncAdapter en virtud del "tipo de sincronización" que proporcione. El nombre del tipo es android: accountType y podría ser 'com.mycompany.myapp'. Esa clave se usa durante una transmisión a todos los adaptadores de sincronización y su BroadcastReceiver codificado manejará el mensaje con su tipo.

Ese es el comienzo de las relaciones y el desglose de la terminología.

+0

cómo sabe el sistema Android que se debe realizar una sincronización. ¿Dónde se solicita la sincronización? – siamii

+4

Hay algunos valores predeterminados que puede habilitar y puede definir sus propias intenciones de "sincronizar ahora" (Intenciones). Para sincronizar, ahora puede hacer "ContentResolver.requestSync (account, authority, extras);" (consulte la pregunta AS http://stackoverflow.com/questions/4465765/how-to-code-a-sync-now-operation-on-android). El modelo del adaptador de sincronización admite una sincronización periódica, {AlarmManager.INTERVAL_DAY | INTERVAL_HALF_DAY | INTERVAL_FIFTEEN_MINUTES | etc.}. Además, el modelo se volverá a sincronizar si hubo errores durante la sincronización activa. – mobibob

70

Hay dos métodos básicos que puede utilizar al realizar una SyncAdapter:

  1. datos de relleno en un ContentProvider existente.
  2. Crea tu propio ContentProvider para almacenar un nuevo tipo de datos.

Lo primero es lo que está sucediendo en esta aplicación de ejemplo. Tienen un sitio web que tiene una lista de contactos, y quieren almacenarlos junto con los otros contactos en el dispositivo. En cualquier caso, la forma en que todo esto funciona es a través de una relación entre tres componentes:

  1. Un ContentProvider, que almacena los datos.
  2. Un SyncAdapter, que se comunica con un servidor remoto para obtener datos para poner en ContentProvider.
  3. Android ContentResolver, que descubre cómo sincronizar SyncAdapters y ContentProviders.

Un dispositivo Android puede tener muchos ContentProviders diferentes y muchos SyncAdapters diferentes. Dado que un ContentResolver puede no formar parte del mismo .apk como SyncAdapter, ContentResolver es un servicio del sistema que encuentra el ContentProvider correcto para almacenar un tipo determinado de datos. Lo hace utilizando la cadena ContentAuthority, que identifica de manera única a un ContentProvider específico. Además, cada ContentProvider debe declararse en AndroidManifest.xml, lo que garantiza que se puede encontrar en ContentResolver.Dentro de esta declaración puede especificar si el ContentProvider puede ser utilizado por otras aplicaciones, consulte: android:exported.

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

En este caso, el uso de un ContentProvider existente, tendrá que buscar en la documentación de la plataforma para ver qué cadena ContentAuthority que utilizan, y el uso de la misma cadena. Si está creando su propio ContentProvider, solo necesita asegurarse de que ContentAuthority que crea sea único. La mejor manera de hacerlo es usar partes de su nombre de dominio (estilo de clase Java) en la Autoridad. Escríbelas en orden inverso. Esto se ilustra en su ejemplo ... com.android.contacts.

1

Es una manera de crear relación entre un tipo de cuenta, adaptador de sincronización y una Autoridad contenido

Mirando hacia atrás de nuevo en AndroidManifest, esa extraña etiqueta meta-datos en el servicio de sincronización es la pieza clave que establece la unión entre un ContentAuthority y una cuenta. Se hace referencia a otro archivo XML externo (llámese lo que quiera, algo relevante para su aplicación.)

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

Narra Android que el adaptador de sincronización hemos definido (La clase invocada en el elemento de nombre de la etiqueta que incluye la etiqueta que incluye este archivo sincronizará los contactos mediante una cuenta de estilo com.example.android.samplesync. El tipo y la autorización de la cuenta son únicos para su aplicación.

Todo tu contenido Las cadenas de autoridad tienen que coincidir y coincidir con lo que estás sincronizando. Esto debería ser una cadena y Defina, si está creando su propia base de datos, o debería usar algunas cadenas de dispositivos existentes si está sincronizando tipos de datos conocidos (como contactos o eventos de calendario o lo que sea). Lo anterior ("com.android.contacts")) pasa a ser la cadena ContentAuthority para los datos de tipo de contacto (sorpresa, sorpresa)

accountType también tiene que coincidir con uno de esos tipos de cuenta conocidos que ya se han ingresado, o tiene que coincidir con uno que está creando.

Último usuarioVisible cierto significa que se le muestra al usuario.