2013-04-14 7 views
14

Ich habe eine App, die mit einem Webdienst verknüpft ist, der AccountManager und Sync verwendet, damit sich Benutzer über die App bei ihrem Konto anmelden und ihre Daten synchronisieren können (dies sind benutzerdefinierte Daten, keine Kontakte oder irgendetwas anderes, das von Google-Konten verwendet wird). AFAIK, ich mache alles so, wie ich sollte. Wenn der Benutzer in über unsere API anmeldet, speichere ich ihr Konto im Android Accountmanager:Warum löst Android bei jedem Hinzufügen/Entfernen eines Kontos eines benutzerdefinierten Typs eine Google-Konto-Synchronisierung aus?

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

I ACCOUNT_TYPE definiert habe nur Namen des App das Paket sein, was ausreichend sein sollte, es von einem anderen Konto zu unterscheiden Art.

Sobald das Konto hinzugefügt wird, habe ich es für automatische Synchronisierung:

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

Ich habe definiert SYNC_FREQUENCY_SECONDS als 86.400 (d, 1 Tag).

In ähnlicher Weise, wenn der Benutzer abmeldet, ich nur ihre Konto aus AccountManager abrufen und removeAccount() aufrufen, um es zu entfernen. Schön und einfach.

Die Synchronisierung wird über meinen eigenen Code ausgeführt, da alle benutzerdefinierten Daten synchronisiert werden und alles einwandfrei funktioniert. Was mich jedoch wahnsinnig macht ist, dass jedes Mal, wenn ich diesen Code zum Hinzufügen oder Entfernen eines Kontos (meines eigenen Typs) verwende, sofort eine Synchronisierung aller Google-Konten auf dem Gerät ausgelöst wird. Das heißt, bevor meine Daten synchronisiert werden, müssen zunächst alle E-Mails, Kalenderdaten, Kontakte, Google Play Magazine, Google+ Daten und Bilder, etc., etc., synchronisiert werden. Dies kann einige Minuten dauern, währenddessen meine App wartet nur geduldig darauf, Daten zu synchronisieren. Es ist extrem frustrierend, und es wird für meine Benutzer schwer zu verstehen sein, warum es so lange dauert, ihre Daten zu synchronisieren, sobald sie sich eingeloggt haben (ganz zu schweigen von der Tatsache, dass das Telefon beim Synchronisieren der Daten langsamer wird fast bis zum Punkt der Unempfänglichkeit).

Mache ich hier etwas falsch? Gibt es etwas in meinem Code, das Android unbeabsichtigt sagt: "Hey, geh und synchronisiere jetzt alle deine Google-Daten!"? Oder ist es etwas, das dem Accounts/Sync-Framework von Google innewohnt, das ich einfach ertragen muss?

+1

Würde AutoSync deaktivieren (wenn aktiviert) hinzufügen/entfernen Sie Ihr benutzerdefiniertes Konto und dann wieder aktivieren es den Trick? –

+0

Interessante Idee. Ich werde es versuchen. –

Antwort

2

Ich denke (obwohl ich nicht 100% sicher bin), dass dies eine energiesparende Funktion ist; Es ist batteriesparender, eine lange Übertragung statt mehrere kürzere Übertragungen zu senden, da das Funkgerät nach dem Ende einer Übertragung für einige Zeit in einem Bereitschaftsleistungszustand bleibt und so das Senden einer einzigen langen Übertragung vermeidet, im Standby zu bleiben (im Wesentlichen verschwendet) Macht) mehr als einmal. Ich vermute also, dass die Synchronisierungsinfrastruktur versucht, so viel Synchronisation wie möglich zusammenzufassen.

Wenn es sich um die Latenz der erstmaligen Synchronisierung handelt, könnten Sie neben der periodischen automatischen Synchronisierung möglicherweise manuell eine Synchronisierung für die erstmalige Synchronisierung mit einer kürzeren Zeit anfordern?