Синхронизация в Android приложениях. Часть первая
Синхронизация в Android приложениях. Часть первая
На дворе 2014 год, доля Android JellyBean перевалила за 60%, появились новые тренды в дизайне. В общем, случилось много всего интересного. Но синхронизация данных с сервером осталось неотъемлемой частью большинства приложений. Существует много способов реализации ее в приложении. Android предоставляет нам SyncAdapter Framework, который позволяет автоматизировать и координировать этот процесс и предоставляет множество плюшек в довесок.
Account
Для начала нам потребуется собственный аккаунт на устройстве. Сначала, я думаю, стоит ответить на вопрос, зачем? Действительно, зачем?
- Поддержка фоновых механизмов вроде SyncAdapter
- Стандартизация способа авторизации
- Поддержка различных токенов (прав доступа)
- Шаринг аккаунта с разграничением привилегий (возможность использовать один аккаунт для различных приложений, как это делает Google)
AccountManager — управляет аккаунтами устройства. Приложения запрашивают авторизационные токены именно у него.
AbstractAccountAuthenticator — компонент для работы с определенным типом аккаунта. Вся механика по работе с аккаунтом (авторизация, разграничение прав) осуществляется здесь. Может быть общим для различных приложений. AccountManager работает именно с ним.
AccountAuthenticatorActivity — базовый класс активити для авторизации/создания аккаунта. Вызывается AccountManager’ом в случае необходимости идентифицировать аккаунт (токен отсутствует или протух).
Как это все работает, можно посмотреть на диаграмме из документации
Когда нам понадобился токен, мы работаем с методом AccountManager’а — getAuthToken. Стоит заметить, что это асинхронный метод и его можно безопасно вызывать из UI потока. Существует также синхронная версия этого метода — blockingGetAuthToken. К диаграмме еще вернемся.
Создание Authenticator’а
Для создания собственного Authenticator’а, нам необходимо расширить AbstractAccountAuthenticator и реализовать несколько его методов (7 если быть точным). Но для нас, на данный момент, представляют интерес всего два.
Метод, как видно из названия, вызывается при попытке добавить новый аккаунт. Все, что мы должны в нем сделать — это вернуть Intent, который должен запустить наше Activity. Чтобы иметь возможность добавить аккаунт из приложения, нам потребуются соответствующие разрешения.
Что же происходит в момент вызова этого метода: пытаемся получить текущий токен методом peekAuthToken, если токен существует, можем добавить проверку на валидность (напомню, что это асинхронный метод, так что можем ломиться на сервер) и возвращем результат. Если токена нет и/или сервер нам не отдал его, мы возвращаем тот же интент что и в методе addAccount. В этом случае пользователя выбьет на экран авторизации.
Создание Activity авторизации
Наше активити должно наследоваться от AccountAuthenticatorActivity (строго говоря, не должно а может: в AccountAuthenticatorActivity 20 строчек вспомогательного кода, который можно написать руками в любом другом активити). У нас будет самое простое активити с полями логин/пароль и кнопкой войти. В целом, в AccountManager’е можно сохранять произвольную информацию о профиле пользователя. Отвечать за получение токена будет AuthTokenLoader, но можно использовать любой понравившийся механизм. Задача-то простая — получить от сервера токен.
Данный метод вызывается, когда токен от сервера получен (а это говорит о валидности аккаунта) и, соответственно, можно добавить аккаунт на устройство. setAccountAuthenticatorResult — метод для передачи результата обратно в AccountManager.
Сервис для интергации в систему
Все, что он делает, это возвращает IBinder нашего Authenticator’a. Причем метод getIBinder уже реализован в AbstractAccountAuthenticator. Осталось только прописать наш сервис в манифесте приложения.
Осталась совсем маленькая деталь: вы могли заметить такую строчку
Это метафайл, который описывает наш Authenticator. Его необходимо создать в папке res/xml. В нем мы указываем иконку нашего аккаунта, его название и тип. В самом простом случае, он выглядит так:
Вот, в целом, все. После этих хитрых манипуляций мы получили возможность создавать свой аккаунт на устройстве. При всей кажущейся сложности, этот процесс на самом деле сводится к реализации 2-х методов, создания xml метафайла и описания сервиса в манифесте. Остальные методы Authenticator’а необходимы для шаринга нашего аккаунта во внешний мир с разделением привилегий, о чем мы поговорим в следующих статьях.
Многие пользователи устройств, работающих на ОС Android, отключают автоматическую опцию, оставляя уведомления о наличии пакетов данных, которыми можно заменить старые.
Для отключения необходимо:
- зайти в «Настройки» смартфона и выбрать раздел «Обновление компонентов» (отличается в зависимости от марки телефона и версии ОС);
- произвести требующиеся настройки.
Деактивация автоматической процедуры для системных компонентов крайне не рекомендуется, поскольку в таком случае производитель не сможет гарантировать корректную работу ОС.
Не работает WhatsApp Web на Android — что делать?
Веб-версия не будет загружаться, если отсутствует подключение смартфона к интернету. Подключите телефон к Wi-Fi, когда нет сети мобильного оператора. Если устройство подключено к беспроводной локальной сети, но доступа к веб-версии нет, убедитесь, что управляемая сеть (например, офисная или университетская) не ограничивает соединение.
Вторая возможная причина — модификации приложения. Обновите версию WhatsApp в магазине App Store или Google Play.