2013-04-14 6 views
14

Ho un'app collegata a un servizio Web che utilizza AccountManager e Sincronizza per consentire agli utenti di accedere al proprio account tramite l'app e sincronizzare i propri dati (si tratta di dati personalizzati, non di contatti o qualsiasi altra cosa utilizzata dagli account Google). AFAIK, sto facendo tutto come dovrei. Quando l'utente accede attraverso la nostra API, risparmio il loro account per AccountManager Android:Perché Android attiva una sincronizzazione dell'account Google ogni volta che aggiungo/rimuovi un account di un tipo personalizzato?

AccountManager am = AccountManager.get(context); 
m.addAccountExplicitly(new Account(username, ACCOUNT_TYPE), account_id, user_data); 

ho definito ACCOUNT_TYPE di essere solo il nome del pacchetto dell'app, che dovrebbe essere sufficiente per distinguerlo da qualsiasi altro account genere.

Non appena si aggiunge l'account, ho impostato per la sincronizzazione automatica: SYNC_FREQUENCY_SECONDS

ContentResolver.setSyncAutomatically(account, AUTHORITY, true); 
ContentResolver.addPeriodicSync(account, AUTHORITY, new Bundle(), SYNC_FREQUENCY_SECONDS); 

ho definito 86400 (vale a dire, 1 giorno).

Analogamente, se l'utente si disconnette, recupero il proprio account da AccountManager e richiama removeAccount() per rimuoverlo. Bello e semplice

La sincronizzazione viene eseguita tramite il mio codice, perché sono tutti i dati personalizzati che vengono sincronizzati e che tutto funziona correttamente. Tuttavia, quello che mi sta facendo impazzire è che ogni volta che uso questo codice per aggiungere o rimuovere un account (del mio tipo), si attiva immediatamente una sincronizzazione di tutti gli account Google sul dispositivo. Ciò significa che, prima di sincronizzare i miei dati, deve prima sincronizzare tutte le e-mail, i dati del calendario, i contatti, Google Play Magazines, i dati e le immagini di Google+, ecc. Ecc. Ciò può richiedere diversi minuti, durante i quali la mia app attende pazientemente il suo turno per sincronizzare i dati. È estremamente frustrante e sarà difficile per i miei utenti capire perché ci vuole così tanto tempo per sincronizzare i loro dati una volta effettuato l'accesso (per non parlare del fatto che, quando si sincronizzano molti dati, il telefono ha la tendenza a rallentare giù quasi al punto di non rispondere).

Sto facendo qualcosa di sbagliato qui? C'è qualcosa nel mio codice che inavvertitamente dice ad Android: "Ehi, vai e sincronizza tutti i tuoi dati di Google ora!"? O è qualcosa inerente al framework Account/Sync di Google che devo solo sopportare?

+1

Disattiva Autosync (se attivato) aggiungi/rimuovi il tuo account personalizzato e quindi riattivalo facendo il trucco? –

+0

Idea interessante. Darò una prova. –

risposta

2

Penso (anche se non ne sono sicuro al 100%) che si tratti di una funzione di risparmio energetico; è più efficiente in termini di batteria per inviare una trasmissione lunga piuttosto che diverse trasmissioni più brevi perché la radio rimane accesa per un certo periodo di tempo dopo la fine di una trasmissione, e quindi l'invio di una singola trasmissione lunga evita di rimanere in standby (essenzialmente spreco potere) più di una volta. Quindi immagino che l'infrastruttura di sincronizzazione tenti di sincronizzare quanto più possibile la sincronizzazione.

Se la preoccupazione è la latenza della prima sincronizzazione, forse è possibile richiedere manualmente una sincronizzazione per la prima sincronizzazione con un tempo più breve oltre alla sincronizzazione automatica periodica?