Это сильно зависит от того, какой тип синхронизации вам нужен.
периодический
Если ваше приложение является новостным приложением, которое публикует сообщения в определенное время каждый день (скажем, в 7:45 каждый день), то вы выполняете периодическое задание в фоновом режиме, скажем, в 8:00.
например : Drippler. Они уведомляют меня один раз каждый день (около 18:30). Я считаю, что они используют периодическое задание.
Событие вызвано
Если ваша передача данных инициируется действием пользователя, используйте фоновую службу или AsyncTask для передачи данных.
например : DropBox / Evernote. Они синхронизируются, когда я взаимодействую с приложением.
моментальный
Если ваше приложение запускает мгновенные сообщения / почту / непериодические важные обновления, вам нужны push-уведомления, потому что вы хотите немедленно предупредить пользователя. Используйте GCM или Parse для этого случая. Например: WhatsApp / Google чат. Поскольку вы прямо упомянули, что не хотите использовать GCM, я расскажу, почему вы должны использовать стандартный поставщик push-уведомлений вместо того, чтобы писать свой собственный:
Push-уведомления работают мгновенно - задержка очень мала (порядка секунд, редко минут). Если бы вы реализовали свое собственное решение / библиотеку для этого - в наивной модели вы бы пинговали сервер каждую секунду, или 5 секунд, или минуту, чтобы проверить состояние. Это очень неэффективно, так как потребляет процессор (и, следовательно, батарею), пропускную способность мобильного телефона и нагрузку на ваш сервер. Однако в GCM / Parse они всегда оставляют порт открытым для сервера (см. Здесь ). Это стандартный и самый эффективный способ. Кроме того, если 10 приложений используют GCM, вам не нужно 10 открытых подключений, вам нужно только одно для каждого устройства. И вы действительно не хотите разрабатывать свое собственное решение, если у вас нет уважительной причины / средств / времени для этого.
Примечание по адаптеру синхронизации : адаптер синхронизации хорошо работает во всех трех вышеупомянутых случаях. Установите флажок Запуск адаптера синхронизации, и вы увидите, что это зависит либо от GCM, либо от вашего собственного механизма (триггер события или пользовательское решение), либо от доступности сети (триггер события), либо от периодического события. В общем, это хороший удобный класс для синхронизации данных без необходимости каждый раз выполнять длинный список инициализаций или реализовывать все вышеописанные случаи в одном месте.
Есть один аспект
SyncAdapter
, который не был упомянут другими ответами.SyncAdapter
Модель требует , чтобы у вас есть конкретный ContentProvider орган , который вы синхронизировать и тип конкретной учетной записи (см Authenticator ) , который собирается быть синхронизирован. Поэтому, если у вас уже нет этих компонентов в вашей архитектуре (например, потому что вы предоставляете другим приложениям доступ к вашим данным или вам требуется поддержка учетных записей), этоSyncAdapter
приведет к значительным накладным расходам на реализацию.источник
Когда дело доходит до синхронизации данных, которая включает в себя подключение, вы хотели бы иметь возможность масштабировать также. Я считаю, что рекомендуемый способ это сделать с помощью адаптера синхронизации.
Это также выглядит так, если вы посмотрите руководство по настройке Android: создание адаптера синхронизации
источник
Адаптеры синхронизации следует использовать, если вам не нужны данные в реальном времени, потому что он автоматизирует передачу данных на основе различных критериев, таких как изменения данных, истекшее время, время суток и т. Д. Он централизует все передачи данных, поэтому передача ваших данных осуществляется в сочетании с передача данных из других приложений, что снижает использование батареи.
Для мгновенных задач мы можем использовать,
AsyncTask для задачи, которая является короткой, может составлять 3-4 секунды.
IntentService для длительных задач.
источник
Поскольку мы говорим о дизайне, мы должны упомянуть управление SyncAdapters, объект SyncResult и то, что происходит после.
Я на самом деле использую SyncAdapter, чтобы сообщить своей библиотеке, что веб-вызовы IntentService должны выполняться на моем сервере. Управлять этой операцией синхронизации сложно.
Один из подходов, который я сейчас использую, состоит в том, чтобы полностью отказаться от объекта SyncResult и просто использовать сервис для регистрации результатов каждой отдельной «Синхронизации».
источник