2010-10-22 9 views
51

Cerco di capire la logica di sincronizzazione Android. Quello che non capisco è il file syncadapter.xml contenuto nel progetto di esempio SDK Android SampleSyncAdapter. Se avete scaricato l'esempi SDK dovrebbe essere nella seguente cartella:Come si utilizza Android SyncAdapter?

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

ho letto, l'autorità di un fornitore di contenuti deve essere una stringa o un riferimento a una risorsa. Qual è esattamente l'autorità di contenuto e dove è com.android.contacts? Ecco il contenuto del file (senza informazioni sulla licenza e commenti, livello 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

Leggere gli ** articoli ** e consultare i ** progetti di esempio ** menzionati in [questo post] (http://stackoverflow.com/questions/1859241/own-sync-adapter-for-android/ 7.795.266). Uno degli esempi riguarda l'app last.fm e menziona anche le impostazioni 'android: contentAuthority'. – JJD

risposta

4

Quando il tuo APK viene caricato, le direttive in manifesto dire il sistema operativo di rivedere tutti i meta-dati. In questo caso, sono i metadati dei contenuti per i contatti Android. Il nome utilizzato per trovare il provider è com.android.contacts (definito da Android) - e il proprietario ha l'autorizzazione per fornire l'accesso al contenuto al suo database (ad esempio ContentProvider).

N.B. Potresti essere un fornitore di contenuti dei tuoi dati che possono essere sincronizzati con i tuoi servizi web che non sono contatti. I meta-dati sono un meccanismo per registrarsi con il sistema operativo in modo da poterlo trovare durante un messaggio broadcast.

Questi meta-dati definiti verranno associati al tuo SyncAdapter in virtù del "tipo di sincronizzazione" che fornisci. Il nome del tipo è Android: accountType e potrebbe essere "com.mycompany.myapp". Quella chiave viene utilizzata durante una trasmissione a tutti gli adattatori di sincronizzazione e il BroadcastReceiver codificato gestirà il messaggio con il tuo tipo.

Questo è l'inizio delle relazioni e qualche interruzione della terminologia.

+0

come fa il sistema Android a sapere che è necessario eseguire una sincronizzazione. Dove viene richiesta la sincronizzazione? – siamii

+4

Ci sono alcuni valori predefiniti che è possibile attivare e si può definire il proprio "Sincronizza ora" intenzioni (Intenti). Per sincronizzare ora puoi "ContentResolver.requestSync (account, autorità, extra);" (controlla la domanda SO http://stackoverflow.com/questions/4465765/how-to-code-a-sync-now-operation-on-android). Il modello dell'adattatore di sincronizzazione supporta una sincronizzazione periodica, {AlarmManager.INTERVAL_DAY | INTERVAL_HALF_DAY | INTERVAL_FIFTEEN_MINUTES | eccetera.}. Inoltre, il modello verrà risincronizzato in caso di errori durante la sincronizzazione attiva. – mobibob

70

Ci sono due metodi di base che è possibile utilizzare quando si effettua una SyncAdapter:

  1. dati Raccogliere in un ContentProvider esistente.
  2. Crea il tuo ContentProvider per memorizzare un nuovo tipo di dati.

Il primo è ciò che sta accadendo in questa app di esempio. Hanno un sito Web con un elenco di contatti e desiderano archiviarli insieme agli altri contatti sul dispositivo. In entrambi i casi, il modo in cui tutto funziona è attraverso una relazione tra tre componenti:

  1. Un ContentProvider, che memorizza i dati.
  2. Un SyncAdapter, che comunica con un server remoto per ottenere dati da inserire in ContentProvider.
  3. Android ContentResolver, che illustra come associare SyncAdapters e ContentProviders.

Un dispositivo Android può avere molti ContentProvider diversi e molti SyncAdapter diversi. Poiché ContentResolver non può far parte dello stesso .apk come SyncAdapter, ContentResolver è un servizio di sistema che trova il ContentProvider giusto per archiviare un determinato tipo di dati. Lo fa utilizzando la stringa ContentAuthority, che identifica in modo univoco uno specifico ContentProvider. Inoltre, ogni ContentProvider deve essere dichiarato in AndroidManifest.xml che garantisce che possa essere trovato da ContentResolver.All'interno di questa dichiarazione è possibile specificare se ContentProvider può essere utilizzato da altre applicazioni, vedere: android:exported.

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

In questo caso, utilizzando un ContentProvider esistente, è necessario consultare la documentazione della piattaforma per vedere cosa stringa ContentAuthority che usano, e utilizzare la stessa stringa. Se stai creando il tuo ContentProvider, devi solo assicurarti che l'Autorità ContentAuthority creata sia unica. Il modo migliore per farlo è utilizzare parti del tuo nome di dominio (stile di classe java) nell'Autorità. Scrivili nell'ordine inverso. Questo è illustrato nel loro esempio ... com.android.contacts.

1

è un modo per creare relazione tra un account di tipo, adattatore Sync e un Content Autorità

Guardando indietro di nuovo a AndroidManifest, quello strano tag meta-dati in servizio di sincronizzazione è il pezzo chiave che stabilisce il legame tra ContentAuthority e un account. Si fa riferimento a un altro file XML esterno (lo chiamano quello che vuoi, qualcosa di rilevante per la vostra applicazione.)

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

Racconta Android che l'adattatore di sincronizzazione abbiamo definito (la classe che è stato chiamato fuori nell'elemento nome del tag che include il tag che include questo file, sarà sincronizzare i contatti utilizzando un account di stile com.example.android.samplesync. tipo di conto e l'autorità è unico per la vostra applicazione.

Tutti i tuoi contenutiLe stringhe di autorizzazione devono corrispondere tutte e corrispondere a ciò che stai sincronizzando - Questa dovrebbe essere una stringa y ou definire, se si sta creando il proprio database, oppure è necessario utilizzare alcune stringhe di dispositivi esistenti se stai sincronizzando i tipi di dati noti (come contatti o eventi del calendario o quello che hai.) È possibile che ("com.android.contacts") sembra essere la stringa ContentAuthority per i dati del tipo di contatti (sorpresa, sorpresa)

accountType deve anche corrispondere a uno di quei tipi di account conosciuti che sono già stati immessi, oppure deve corrispondere a uno di quelli che stai creando.

Ultimi vero mezzo userVisible mostrati all'utente.

Problemi correlati