Особенности синхронизации в Android-приложении
Особенности синхронизации в Android-приложении
При разработке многих Android-приложений требуется организовать процесс синхронизации данных с данными на сервере. Есть два основных способа как данную синхронизацию можно реализовать.
Первый способ — классический (наиболее популярный и наиболее простой) — с помощью AlarmManager и Service. Например, как описано в этой статье.
Второй способ — «правильный» (но пока что, видимо, редко кем используемый) — с помощью SyncAdapter.
Разрабатывая своё приложение, изначально я попытался реализовать «правильный» (т.е. второй способ).
О том, как его реализовать — чуть ниже. Расскажу сначала о том, с какими сложностями и особенностями я столкнулся при его реализации.
Особенности реализации синхронизации с помощью SyncAdapter
Прежде всего — данный метод достаточно плохо описан в документации. Хотя на сайте разработчиков Android и есть пример реализации, более хорошим примером (с пояснениями) будет статья по этой ссылке.
Для работы данного способа синхронизации необходимо создание отдельного типа эккаунта специально для Вашего предложения (если существующие эккаунты, например, эккаунты Google не подходят), а это — тема для отдельной статьи (пример можно посмотреть, например, тут).
Данный эккаунт будет доступен в разделе Settings / Accounts & Sync. Создание (и удаление) эккаунта будет возможным не только из Вашего приложения, но и из этого раздела. В нем можно создать несколько эккаунтов для Вашего приложения (нужно ли это Вашему приложению?). Для каждого эккаунта нужно имя (для OAuth-эккаунтов приходится использовать выдуманные имена).
При этом неправильно написанный код эккаунта перезагружает как устройство, так и эмулятор — тестировать сложно. При этом, если Вы создали лишь код, отвечающий за эккаунт, и хотите его протестировать, то не выйдет — без полностью написанного кода SyncAdapter‘a устройство будет перезагружаться при входе в Accounts & Sync.
Как быть если Вашему процессу синхронизации не нужен эккаунт? Придется создавать dummy-эккаунт.
Если Ваше приложение будет синхронизировать данные с существующими базами — контактами телефона, событиями календаря или, например, фотографиями, то тут все проще (и большинство примеров в сети именно про такой тип синхронизации). Если же синхронизация будет производиться со своими данными, то необходимо, чтоб был создан свой ContentProvider.
Как быть, если Ваше приложение не хочет делиться своей базой с другими приложениями? Придется создавать dummy-ContentProvider, например, такой.
Если все сделано, и даже свой SyncAdapter написан (см. ниже как), то теперь синхронизация будет автоматически запускаться когда изменились данные в локальной базе.
Если синхронизацию нужно запустить вручную, то для этого есть функция requestSync(), ниже будет написано об ограничениях функции. Если нужно запускать синхронизацию автоматически, то для этого есть другая функция — addPeriodicSync(). Хотя работает она лишь на Android 2.2 или выше. Но работает данная функция отлично — например, если в момент синхронизации нет интернет-соединения, то синхронизация произойдет автоматически в тот момент, когда оно появится.
Как реализовать синхронизацию с помощью SyncAdapter‘а
Что же требуется сделать для реализации синхронизации с помощью SyncAdapter? (перевод ответа c StackOverflow)
1. Уведомить Android, что приложение поддерживает синхронизацию
Для этого в AndroidManifest.xml необходимо указать сервис синхронизации:
где name — имя, соответствующее имени класса для синхронизации (об этом — чуть ниже); exported — делает сервис доступным другим компонентам (в т.ч. и ContentResolver, который используется для взаимодействия с сервисом синхронизации); intent-filter позволяет перехватывать событие, требующее синхронизацию (возникает, например, когда синхронизация запрошена функцией RequestSync() Вашего ContentResolver‘a).
2. Создать сервис (службу) для нахождения SyncAdapter‘a
Ваш класс должен расширять Service, в нем должна быть переменная экземпляра AbstractThreadedSyncAdapter. Он должен реализовывать public IBinder onBind(Intent) и должен возвращать SyncAdapterBinder.
Достаточно многое должно быть реализовано в этом классе, т.к. данный сервис предоставляет стандартный интерфейс для SyncAdapter Android’a.
3. Создать класс SyncAdapter для непосредственного осуществления синхронизации
mySyncAdapter — место, где содержится сама логика синхронизации. Когда приходит время синхронизации, вызывается onPerformSync().
4. Осуществить связывание (binding) между типом эккаунта и Content Authority
В пункте 1, в файле AndroidManifest.xml, в поле name мы указали значение, которую и образует связь между ContentAuthority и эккаунтом. AndroidManifest.xml ссылается на другой xml-файл. В нашем примере это sync_myapp.xml:
Данный файл сообщает Android’у, что созданный нами SyncAdapter будет синхронизировать контакты.
Все значения строк в contentAuthority должны совпадать со значениями того, с чем будет происходить синхронизация. Если синхронизация будет происходить с Вашей собственной базой, то с Вашим значением. Если с какими-либо существующими базами (например, с контактами или событиями календаря), то со стандартными значениями. Например, указанное выше значение «com.android.contacts» идентифицирует стандартные контакты.
Значение accountType также должно совпадать либо с Вашим значением, либо со стандартным значением. Если Вы создаете свой собственный тип эккаунта, то Вам потребуется создать и подкласс AccountAuthenticator, чтобы осуществлять авторизацию на Вашем сервере (см. уже указанную выше статью). Указанное в нашем примере значение «com.google» идентифицирует, что мы используем Google-эккаунт.
5. Включение синхронизации для созданной пары Account—ContentAuthority
Наконец, можно включить процесс синхронизации. Это можно сделать либо в разделе Settings / Accounts & Sync, либо программно в Вашем приложении:
Для осуществления синхронизации она должна быть разрешена не только для Вашего приложения — необходимо глобальное разрешение на синхронизацию (в разделе Settings / Accounts & Sync должна быть проставлена соответствующая галка).
Если одно из этих условий не выполнено, то вызов RequestSync() ни к чему немедленно не приведет, запрошенная синхронизация однако будет выполнена позднее — как только синхронизация будет включена. Хотя, существует способ это обойти.
Дополнительно, можно включить периодические автоматические синхронизации.
Выводы
И так, чем же хороша (+) и плоха (-) синхронизация с помощью SyncAdapter по сравнению с ASyncTask?
(+) следование стандартам (Ваше приложение в списке всех синхронизирующихся приложений)
(+) поддержка нескольких эккаунтов
(+) простота реализации автоматических синхронизаций (когда остальное все уже написано)
(+) автоматическая синхронизация при появлении интернет-соединения
(+) удобство в синхронизации со стандартными базами (контакты, календарь и т.п.)
(-) необходимость создания эккаунта
(-) отсутствие полноценной документации
(-) сложность реализации и тестирования
(-) необходимость в Android 2.2 и выше для автоматических периодических синхронизаций
(-) необходимость создания своего ContentProvider’a
Итого, я выбрал ASyncTask для синхронизации в своем приложении (хотя код для SyncAdapter был уже почти полностью написан) — прежде всего, не хотелось ограничиваться версией 2.2 Android.
Вы спрашивали: Как отключить телефон от телевизора?
Как отключить синхронизацию телефона с телевизором?
Заходим в настройки смартфона или планшета, находим раздел «Аккаунты».
- Далее выбираем текущий Google-аккаунт, с которым вы работаете (на устройстве может быть несколько таких аккаунтов).
- В разделе синхронизация вам необходимо снять галочки рядом с теми разделами, которые не должны синхронизироваться.
Как запретить трансляцию Youtube с телефона на телевизор?
Видится пара вариантов запретить трансляцию Youtube с телефона на телевизор: Вариант 1. Запускаем Youtube на телевизоре->Настройки (шестеренка)-> Подключение телевизора к телефону->Удалить устройства->здесь удалить привязанный телефон.
Как отвязать Ютуб от телевизора?
Откройте страницу https://myaccount.google.com/permissions на любом устройстве.
- Найдите раздел «Приложения Google» и выберите YouTube on TV.
- Нажмите Закрыть доступ.
Как в youtube убрать кнопку воспроизвести на телевизоре?
Для того что бы убрать данную кнопку можно использовать специальное расширение для Google Chrome. Данное расширение может быть легко отключено простым нажатием по иконке. После чего перезагрузка страницы вернёт удалённую кнопку.
Как сделать синхронизацию телефона с телевизором?
Запускаем Wi-Fi Direct на смартфоне, который стоит искать в настройках беспроводных сетей Проделываем туже операцию, только уже на телевизоре. Функция Wi-Fi Direct, обычно, легко находиться во вкладке Сеть, меню телевизора В списке обнаруженных устройств находим телефон, и отсылаем запрос на синхронизацию
Как убрать синхронизацию между телефонами?
Как отключить автосинхронизацию
- Откройте приложение «Настройки» на телефоне.
- Нажмите Аккаунты.
- Если у вас несколько аккаунтов, выберите нужный.
- Нажмите Синхронизация аккаунта.
- Отключите автоматическую синхронизацию для отдельных приложений.
Как очистить очередь в YouTube?
Вы можете управлять приложением YouTube на телевизоре со своего телефона или планшета.
…
Как удалить видео из очереди
- Откройте очередь просмотра.
- Нажмите на значок меню рядом с видео, которое хотите удалить.
- Выберите Удалить из очереди просмотра на телеэкране.
Как открыть плейлист на ютубе на телевизоре?
Видео с YouTube можно смотреть на многих телевизорах Smart TV и игровых консолях. В приложении вам будут доступны все основные функции, например вход в аккаунт, поиск и подписки.
…
Инструкция
- Нажмите на значок «Ещё» на странице просмотра.
- Нажмите «Сохранить» .
- Выберите нужный плейлист.
Как зайти на YouTube в телевизоре?
Как выполнить вход в браузере
Выберите Войти в браузере. На компьютере или мобильном устройстве откройте сайт youtube.com/activate. Введите код, показанный на экране телевизора. Войдите в свой аккаунт.
Как выйти из ютуба на всех устройствах?
Откройте страницу https://myaccount.google.com/permissions на любом устройстве.
- Выберите из списка устройств телевизор Android TV.
- Нажмите «Отмена доступа».
Как выйти из ютуба на андроид?
Как выйти из аккаунта
- Нажмите на фото профиля .
- Коснитесь названия аккаунта вверху экрана.
- Нажмите Управление аккаунтами.
- Выберите аккаунт, который хотите удалить.
- Нажмите Удалить аккаунт.
Как убрать значок трансляции?
Поделюсь, вдруг кому понадобится.
- Выдвигаем панель уведомлений, зажимаем значок настроек секунд 5 и отпускаем. Включается опция «SYSTEM UI TUNER», которой будет в настройках.
- Идем по адресу Настройки>Система>System UI tuner>Строка состояния
- Убираем галочку с «Трансляция»
Как выключить Google Cast?
- Откройте приложение «Настройки» на своем устройстве Android.
- Выберите Google Устройства и обмен данными Параметры трансляции установите переключательУправление воспроизведением для устройств Google Cast в положение «Выключено».
Как ограничить доступ к телевизору?
Ограничить доступ телевизора к интернету можно в настройках роутера. Обычно для этого необходимо зайти в веб-интерфейс вашего устройства и открыть меню «Свойства доступа» (Access Properties) — «Профили» (Access Profile). В профиле вашего ТВ выберите вариант «Без доступа к интернету» (No Internet Access).
Как отключить синхронизацию между телефоном и планшетом?
Как отключить синхронизацию между телефоном и компьютером?
Чтобы остановить синхронизацию, можно выйти из аккаунта.
- На компьютере выберите значок «Автозагрузка и синхронизация» .
- Нажмите на значок с тремя точками Настройки.
- Снова нажмите Настройки.
- Выберите Отключить аккаунт.
- Нажмите Отключить.
Как убрать синхронизацию телефона с гугл?
Как ее отключить? Заходим в настройки смартфона или планшета, находим раздел «Аккаунты». Далее выбираем текущий Google-аккаунт, с которым вы работаете (на устройстве может быть несколько таких аккаунтов). В разделе синхронизация вам необходимо снять галочки рядом с теми разделами, которые не должны синхронизироваться.
Как отключить синхронизацию между iPhone и iPad?
На устройстве iPhone, iPad или iPod touch
- Выберите «Настройки» > [ваше имя].
- Нажмите iCloud.
- Чтобы включить или отключить функцию iCloud, нажмите переключатель рядом с ней.
Как удалить синхронизированные данные из аккаунта Google?
Чтобы остановить синхронизацию и очистить синхронизированные данные или сбросить пароль синхронизации, выполните следующие действия:
- Откройте Панель Google. Убедитесь, что вы вошли в свой аккаунт Google.
- Нажмите Сбросить синхронизацию, чтобы остановить синхронизацию и удалить все синхронизированные данные.
- Нажмите ОК.
Как отключить синхронизацию с айфоном?
Для этого достаточно просто выключить синхронизацию между устройствами.
- Переходим в «Настройки» — «Телефон» — «Вызовы на других устройствах» (отключаем пункт «Разрешить вызовы»).
- Открываем раздел «Apple ID» — «iCloud» и отключаем iCloud Drive.
Как отключить синхронизацию между браузерами?
Как отключить синхронизацию
- Откройте Chrome на компьютере.
- В правом верхнем углу экрана нажмите на изображение профиля Синхронизация.
- Нажмите Отключить.
Как отключить синхронизацию Яндекс?
- Нажмите в браузере значок (если значка нет, нажмите кнопку меню на корпусе смартфона).
- Нажмите Настройки.
- Нажмите строку Синхронизация.
- Нажмите кнопку Отключить синхронизацию.
Как отвязать телефон от аккаунта гугла?
Контакты, сохраненные в аккаунте Google, синхронизируются с Google Контактами и всеми устройствами Android.
…
Как удалить контакт
- На телефоне или планшете Android откройте приложение «Контакты» .
- Коснитесь контакта, который нужно удалить.
- В правом верхнем углу экрана нажмите на значок «Ещё» Удалить.
- Снова нажмите Удалить.
Для чего нужна синхронизация в телефоне?
Синхронизация нужна, чтобы хранить важные данные и файлы, и иметь к ним удаленный доступ. На синхронизированном гаджете можно без потерь восстановить необходимые настройки и материалы в режим реального времени. Синхронизация нужна для нескольких опций в устройстве: Резервное копирование.
Как отвязать контакты от гугл аккаунта?
Только в Настройки -> Аккаунты -> Google -> Ваш аккаунт -> Синхронизация -> Контакты -> выключить.
Как убрать синхронизацию фото айфона с айпадом?
На iPhone, iPad или iPod touch перейдите в меню «Настройки» > [ваше имя] > iCloud > «Фото» и отключите функцию «Фото iCloud»*.
Как отключить синхронизацию Safari между iPhone и Mac?
Отключение синхронизации в Safari
- 1) Откройте Настройки и выберите свой Apple ID вверху страницы.
- 2) Выберите iCloud.
- 3) В секции Использующие iCloud программы отключите переключатель рядом с Safari.
- 4) Появится окно, на котором вам нужно решить, что делать с ранее синхронизованными объектами.
Как отключить синхронизацию приложений между устройствами Apple?
На устройстве iPhone, iPad или iPod touch выберите «Настройки» > [ваше имя] > «iTunes Store и App Store». В разделе «Автоматические загрузки» включите или выключите параметр «Приложения».
Звонки с одного iPhone отображаются на другом — как убрать синхронизацию?
Приветствую! Когда у Вас в семье есть несколько iPhone, то вы очень богатый человек многие предпочитают использовать одну учетную запись Apple ID на все эти устройства. Ну а что? На первый взгляд все действительно очень удобно! Например, скачали на одном гаджете игру (программу), а она моментально стала доступна на другом устройстве. Плюс, не требуется запоминать данные сразу нескольких учеток. Казалось бы, наступило счастье. Живи да радуйся!
Однако, не зря компания Apple рекомендует создавать для каждого из iPhone свою, уникальную учетную запись Apple ID. Ведь проблем, при одновременном использовании учетки (разными людьми на разных iPhone), тоже хватает. Например, резервные копии iCloud. Да и в случае кражи Apple ID «под удар» попадают сразу все гаджеты, на которых активирован этот идентификатор.
Есть еще одна проблема, которая связана с использованием одного Apple ID на нескольких iPhone — это синхронизация журнала звонков и вызовов. Об этом сегодня и поговорим.
Краткое описание ситуации. При совершении звонка с одного iPhone, данные моментально появляются на другом. Такая же ситуация с пропущенными и входящими вызовами. Звонили вам, вы трубку не взяли, а уведомление об этом сразу же отображается на всех других iPhone с вашей учетной записью. Получается, история звонков и журнал вызовов будут общими для всех айфонов, на которых введен ваш Apple ID.
Удобно? Конечно. Но подобная синхронизация журнала вызовов хороша только тогда, когда все эти iPhone принадлежат Вам. В противном случае возможны вопросы — все мы люди любопытные и подозрительные:) Но да ладно, сейчас не об этом, а о том, как от этого избавиться.
Использовать разные Apple ID
Самое правильное и верное решение. Создаем для каждого гаджета свою, уникальную учетную запись и проблема отпадет сама по себе. Да, для этого потребуется потратить некоторое время, и не всегда это удобно по разным соображениям, но в последствии от этого будут одни плюсы.
Помимо того, что прекратится синхронизация вызовов в телефоне (что уже хорошо!), можно будет использовать учетную запись iCloud для каждого iPhone по отдельности (а это лишнее место для резервного копирования), да и в будущем обезопасить себя от разных сюрпризов (такие как синхронизация смс, вкладок браузера Safari и прочих).
Зарегистрировать новый Apple ID — дело 10 минут, но это снимает все вопросы. Однако, если этот метод вам по каким-то причинам не подходит, то есть другие способы убрать дублирование вызовов, например через настройки…
Отключаем синхронизацию журнала звонков через настройки
Добиться того, чтобы список исходящих и входящих номеров перестал повторяться на разных айфонах, можно и через настройки устройства. Другое дело, что настроек много и универсального решения нет. Пробуйте и экспериментируйте — какой-то из методов точно сработает. Вот они все:
- Для начала, на том гаджете, с которого вы хотите убрать появление истории своих звонков, необходимо зайти в «Настройки — FaceTime — Вызовы с iPhone». Естественно отключаем, ведь если дублируются звонки на разных устройствах, то и их список будет повторяться.
- Не выходим из настроек и открываем «Телефон — Вызовы на других устройствах». Отключаем пункт «Разрешить вызовы».
- Выключаем iCloud Drive. Сделать это можно в «Настройках — iCloud — iCloud Drive». Именно эта строчка отвечает за разрешение программам хранить документы и данные в «облаке». А журнал звонков, по своей сути, это такая же обычная программа и все записи о вызовах как раз синхронизируются через iCloud Drive.
Единственный момент, запомните — даже если в каждом из рассматриваемых пунктов ползунок уже был отключен, рекомендуется еще раз включить его и выключить. Потому что программные сбои и «глюки» тоже возможны, об этом чуть ниже…
Дополнительные варианты или что можно сделать еще
Переходим к различным «багам» в системе iOS. Как заверяет техническая поддержка компании Apple, не исключен тот случай, что прошивка «встанет криво».
Вот так вот взяла и встала. Как всё просто, правда, Apple?
Именно поэтому, даже если вы выполнили все пункты, которые указаны выше, список звонков на разных iPhone может продолжать дублироваться.
Что делать в этом случае? Придется полностью переустановить программное обеспечение, чтобы iOS «встала как надо». Сделать это можно либо через обычное восстановление, либо (если что-то пойдет не так) — всегда есть режим DFU. Впрочем, это уже самая крайняя мера (ничего сложного — но занимает много времени) и я искренне надеюсь, что до этого дело не дойдёт. Да будет так!