2012-09-20 9 views
9

Desidero riutilizzare SyncAdapter per più autorità. Il metodo onPerformSync(Account account, Bundle extras, String authority, ContentProviderClient provider, SyncResult syncResult) passa l'autorizzazione come parametro. Ma come posso registrarlo in questo modo?Come utilizzare una classe SyncAdapter per più autorità?

ho iniziato con seguente nel AndroidManifest.xml:

<service 
    android:name=".sync.SyncService" > 
    <intent-filter> 
     <action android:name="android.content.SyncAdapter" /> 
    </intent-filter> 

    <meta-data 
     android:name="android.content.SyncAdapter" 
     android:resource="@xml/syncadapter1" /> 
</service> 

ho cercato diversi modi per registrare @xml/syncadapter2 senza successo. qualche idea per ottenerlo senza le classi SyncAdapter derivate per ogni autorità?

risposta

9

Questa domanda è stata posta mesi fa, ma mi piacerebbe rispondere comunque ...

onPerformSync() viene chiamato in caso di nuove SyncThread è filata fino ad eseguire l'operazione di sincronizzazione. Ogni SyncAdapter rilascia un SyncThread associato all'autorità definita in sync-adapter.xml e non è possibile definire più autorità in questo file xml.

L'AbstractThreadedSyncAdapter (la super classe SyncAdapter) non è stata semplicemente scritta per gestire più autorità. Contiene una classe finale ISyncAdapterImpl implementata come Singleton, quindi ogni volta che viene chiamato startSync(), si verificherà una sincronizzazione utilizzando la stessa autorità.

In alternativa, stavi inizialmente cercando di aggiungere @xml/syncadapter2 come metadati aggiuntivi all'interno di SyncService? Ciò equivale a registrare più SyncAdapters in un singolo SyncService. È tecnicamente fattibile (dato che è possibile definire più di un tag di meta-dati all'interno di un tag di servizio) tuttavia il sistema operativo stesso è il colpevole che chiama il servizio quando esegue una sincronizzazione e non è possibile controllare facilmente l'intento che passa. Se potessi controllarlo, potresti inserire una chiave nel bundle dell'intento che determinerebbe quale dei tuoi syncAdapters registrati legare. E anche quello sembra difficile.

Detto questo, sarebbe meno difficile implementare diversi SyncAdapters per ogni autorità (anche con il proprio servizio) e operazioni simili astratte in una classe di utilità che viene chiamata in onPerformSync(). Questa strategia è comunque più sostenibile a lungo termine, perché se uno dei ContentProvider dovesse essere rimosso, sarà più facile rimuovere il suo SyncAdapter e SyncService corrispondenti.

1

Non sono sicuro che sia una risposta corretta.

  1. onBind non ha nulla a che fare con un'autorità con cui è associato un adattatore di sincronizzazione. Dovrebbe solo restituire un'interfaccia che il chiamante utilizzerà per comunicare con il servizio.
  2. L'implementazione del servizio (che fornisce un'interfaccia) è responsabile della comprensione di ciò che è un'autorità da sincronizzare. Questo viene fatto nella chiamata onPerformSync.
  3. L'implementazione che deriva dallo AbstractThreadedSyncAdapter deve essere thread-safe perché potrebbe essere chiamata per ogni sincronizzazione.

Quindi, non si tratta di "impossibile" ma della corretta implementazione del servizio. Implementare più adattatori di sincronizzazione in un servizio equivale a registrare più adattatori semplicemente passando dall'implementazione all'autorità.

+0

Ho aggiunto questo alla risposta di kianatennyson. Per qualche motivo non posso aggiungere un commento alla sua risposta. – LeonidVlad

+0

Grazie per il contributo, non puoi fare commenti sui post di altre persone finché non hai una reputazione sufficiente (50) –

Problemi correlati