que - ¿Cómo uso Android SyncAdapter?
sync adapter retrofit (3)
Intento entender la lógica de sincronización de Android. Lo que no entiendo es el archivo syncadapter.xml
incluye en el proyecto de ejemplo SDK de Android SampleSyncAdapter
. Si descargó las muestras del SDK, debería estar en la siguiente carpeta:
SDK/android-sdk-PLATFORM/samples/android-VERSION/SampleSyncAdapter/res/xml/syncadapter.xml
Leí que la autoridad de un proveedor de contenido debería ser una cadena o una referencia a un recurso. ¿Qué es exactamente la autoridad de contenido y dónde se encuentra 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"
/>
Cuando su APK se carga, las directivas en el manifiesto le dicen al sistema operativo que revise todos los metadatos. En este caso, son metadatos de contenido para contactos de Android. El nombre que se usa 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).
NB : podría 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 usted proporciona. 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 un cierto desglose de la terminología.
Es una forma de crear una relación entre un Tipo de cuenta, un Adaptador de sincronización y una Autoridad de contenido
Mirando hacia atrás en AndroidManifest, esa extraña etiqueta de metadatos en el servicio Sync es la pieza clave que establece la vinculación entre ContentAuthority y una cuenta. Hace referencia externamente a otro archivo xml (llámalo como quieras, algo relevante para tu 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" />
Le dice a Android que el adaptador de sincronización que hemos definido (la clase que fue llamada en el elemento de nombre de la etiqueta que incluye la etiqueta que incluye este archivo) sincronizará contactos usando una cuenta de estilo com.example.android.samplesync. tipo y autoridad es único para su aplicación.
Todo su contenido Las cadenas de autoridad tienen que coincidir y coincidir con lo que está sincronizando: esta debe ser una cadena que defina, si está creando su propia base de datos, o debería usar algunas cadenas de dispositivos existentes si está sincronizando las conocidas. tipos de datos (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 contactos (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 userVisible verdadero significa mostrado al usuario.
Hay dos métodos básicos que puede utilizar al hacer un SyncAdapter:
- Llene los datos en un ContentProvider existente.
- 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:
- Un ContentProvider, que almacena los datos.
- Un SyncAdapter, que se comunica con un servidor remoto para obtener datos para poner en ContentProvider.
- 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 ser parte de la misma .apk que un SyncAdapter, ContentResolver es un servicio del sistema que encuentra el ContentProvider correcto para almacenar un determinado tipo 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
que garantiza que ContentResolver lo puede encontrar. Dentro de esta declaración puede especificar si el ContentProvider puede ser utilizado por otras aplicaciones, ver: android:exported
.
<provider
android:name=".CustomProvider"
android:authorities="com.example.app.provider"
android:exported="false"
android:multiprocess="true" >
</provider>
En este caso, utilizando un ContentProvider existente, deberá consultar la documentación de la plataforma para ver qué cadena de ContentAuthority utilizan y utilizar 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
.