Zależy to w dużej mierze od rodzaju potrzebnej synchronizacji.
Okresowy
Jeśli twoja aplikacja jest aplikacją wiadomości, która publikuje posty o określonej godzinie każdego dnia (powiedzmy o 7.45 każdego dnia), wtedy uruchamiasz okresowe zadanie w usłudze działającej w tle, powiedzmy o 8 rano.
np . : Kroplownik. Powiadamiają mnie raz dziennie (około 18:30). Myślę, że używają okresowego zadania.
Zdarzenie wywołane
Jeśli transfer danych jest wyzwalany przez działanie użytkownika, użyj usługi w tle lub AsyncTask do transferu danych.
np . : DropBox / Evernote. Synchronizują się podczas interakcji z aplikacją.
Chwilowy
Jeśli Twoja aplikacja obsługuje wiadomości błyskawiczne / wiadomości e-mail / nieregularne ważne aktualizacje, potrzebujesz powiadomień wypychanych, ponieważ chcesz natychmiast powiadomić użytkownika. W tym przypadku użyj GCM lub Parse. np .: czat WhatsApp / Google. Ponieważ wyraźnie wspomniałeś, że nie chcesz używać GCM, powiem, dlaczego powinieneś używać standardowego dostawcy powiadomień wypychanych zamiast pisać własne:
Powiadomienia push działają natychmiastowo - opóźnienie jest bardzo małe (rzędu sekund, rzadko minut). Jeśli miałbyś zaimplementować do tego własne rozwiązanie / bibliotekę - w naiwnym modelu sprawdzałbyś serwer co sekundę lub co 5 sekund lub minutę, aby sprawdzić status. Jest to bardzo nieefektywne, ponieważ zużywa procesor (a tym samym baterię), przepustowość telefonu komórkowego i obciążenie serwera. Jednak w GCM / Parse zawsze utrzymują otwarty port z serwerem (patrz tutaj ). Jest to standardowy i najbardziej wydajny sposób. Ponadto, jeśli 10 aplikacji korzysta z GCM, nie potrzebujesz 10 otwartych połączeń, potrzebujesz tylko jednego na urządzenie. I naprawdę nie chcesz opracowywać własnego rozwiązania, chyba że masz ważny powód / fundusze / czas, aby to zrobić.
Uwaga na temat adaptera synchronizacji : Adapter synchronizacji działa dobrze we wszystkich powyższych trzech przypadkach. Zaznacz opcję Uruchom adapter synchronizacji, a zobaczysz, że zależy to od GCM lub własnego mechanizmu (wyzwalacza zdarzenia lub niestandardowego rozwiązania), dostępności sieci (wyzwalacza zdarzenia) lub zdarzenia okresowego. Podsumowując, jest to dobra wygodna klasa do synchronizacji danych bez konieczności długiej listy inicjalizacji za każdym razem lub implementacji wszystkich powyższych przypadków w jednym miejscu.
Jest jeden aspekt tego, o
SyncAdapter
którym nie wspominają inne odpowiedzi.SyncAdapter
Wzór wymaga, że masz specyficzne ContentProvider organ, który synchronizacji do i typ konta specyficzne (patrz Authenticator ), który będzie zsynchronizowany. Tak więc, chyba że masz już te komponenty w swojej architekturze (np. Ponieważ dajesz innym aplikacjom dostęp do swoich danych lub potrzebujesz obsługi kont)SyncAdapter
, spowoduje to znaczny narzut związany z implementacją.źródło
Jeśli chodzi o synchronizację danych, które wymagają łączności, można również skalować. Uważam, że zalecanym sposobem rozwiązania tego problemu jest użycie adaptera synchronizacji.
Wydaje się, że tak właśnie jest, jeśli zapoznasz się z przewodnikiem dotyczącym tranzytowania Androida: Tworzenie adaptera synchronizacji
źródło
Adaptery synchronizacji powinny być używane, chyba że potrzebujesz danych w czasie rzeczywistym, ponieważ: Automatyzuje transfer danych na podstawie różnych kryteriów, takich jak zmiany danych, upływający czas, pora dnia itp. Centralizuje wszystkie transfery danych, dzięki czemu transfer danych odbywa się w połączeniu z przesyłanie danych z innych aplikacji, co zmniejsza zużycie baterii.
Do natychmiastowych zadań możemy użyć,
Zadanie AsyncTask dla zadania trwającego krótko może trwać 3-4 sekundy.
Usługa IntentService do długotrwałych zadań.
źródło
Ponieważ mówimy o projektowaniu, powinniśmy wspomnieć o zarządzaniu SyncAdapters, obiekcie SyncResult i tym, co dzieje się później.
Właściwie korzystam z SyncAdapter, aby nakazać mojej bibliotece wykonywanie połączeń internetowych IntentService na mój serwer. Zarządzanie tą operacją „synchronizacji” jest trudne.
Jednym z moich podejść jest całkowite zrezygnowanie z obiektu SyncResult i po prostu skorzystanie z usługi do zarejestrowania wyników każdego pojedynczego „Synchronizacji”
źródło