Виджет режимы для андроид

Виджеты на Android. Редкая фича, в которой придется разобраться

Привет, Хабр! Меня зовут Александр Хакимов, я android-разработчик в компании FINCH.

У вас бывало такое, что ваш дизайн был под iOS, а вам приходится адаптировать его под android? Если да, то часто ли ваши дизайнеры используют виджеты? К сожалению, виджет — редкий кейс для многих разработчиков, потому что с ним редко кто работает,

В статье я подробно расскажу как создать виджет, на что стоит обратить внимание и поделюсь своим кейсом.

Создание виджета

Для создания виджета нужно знать:

  1. Особенности компонентов виджета.
  2. Особенности отображения виджета в сетке экрана.
  3. Особенности обновления виджета.

Разберем каждый пункт отдельно.

Особенности компонентов виджета

С этим пунктом знаком любой разработчик, который хоть раз работал с RemoteViews. Если вы из таких, смело переходите к следующему пункту.

RemoteViews предназначен для описания и управления иерархиями Views, которые принадлежат процессу другого приложения. С помощью управления иерархиями можно изменять свойства или вызывать методы, принадлежащие View, которое выступает частью другого приложения. В RemoteViews входит ограниченный набор компонентов стандартной библиотеки компонентов android.widget.

View внутри виджетов работают в отдельном процессе (как правило, это домашний экран), поэтому для изменения UI виджета используется расширение BroadcastReceiver — AppWidgetProvider, работающий в нашем приложении.

Особенности отображения виджета в «сетке» экрана

Each widget must define a minWidth and minHeight, indicating the minimum amount of space it should consume by default. When users add a widget to their Home screen, it will generally occupy more than the minimum width and height you specify. Android Home screens offer users a grid of available spaces into which they can place widgets and icons. This grid can vary by a device; for example, many handsets offer a 4×4 grid, and tablets can offer a larger, 8×7 grid.

Переводя на русский: каждый виджет должен задать свои минимальную ширину и высоту, чтобы обозначить минимальное пространство, которое будет им занято по умолчанию.


Пример настроек виджета при создании в Android Studio

Виджет, который добавили на на Home screen, обычно займет больше места чем минимальные ширина и высота экрана, которые вы задали. Android Home screens предоставляет пользователям сетку доступного пространств, в которых могут быть расположены виджеты и иконки. Эта сетка может отличаться в зависимости от устройства; например, многие телефоны предлагают сетку 4х4, а планшеты могут предложить большие сетки 8х7.

Из этого становится понятно, что сетка устройства может быть какой угодно, а размер ячеек может отличаться, в зависимости от размера сетки. Соответственно, контент виджета должен быть спроектирован с учетом этих особенностей.

Минимальные ширину и высоту виджета для заданного количества столбцов и строк можно вычислить по формуле:

minSideSizeDp = 70 × n − 30, где n —количество строк или столбцов

На текущий момент максимальный минимум сетки, которую вы можете задать это 4х4. Это гарантирует, что ваш виджет будет отображаться на всех девайсах.

Особенности обновления виджета

Так как AppWidgetProvider по своей сути является расширением BroadcastReceiver-а, с ним можно делать все то же самое, что и с обычным BroadcastReceiver. AppWidgetProvider просто парсит соответствующие поля из Intent, полученного в onReceive и вызывает методы перехвата с полученными extras.

Сложность возникла с частотой обновления контента — все дело в разнице внутренней работы виджетов на iOS и Android. Дело в том, что данные на iOS-виджетах обновляются тогда, когда виджет становится виден пользователю. В Android, такого события не существует. Мы не можем узнать, когда пользователь видит виджет.

Для виджетов на Android рекомендуемым способом обновления является обновление по таймеру. Настройки таймера задаются параметром виджета updatePeriodMillis. К сожалению, эта настройка не позволяет обновлять виджет чаще чем раз в 30 минут. Ниже я расскажу об этом подробнее.

Кейс создания виджета

Дальше речь пойдет о кейсе который был у нас в FINCH в крупном лотерейном приложении с приложением «Столото» для участия в государственных лотереях.

Задача приложения – упростить и сделать прозрачным для пользователя выбор лотереи и покупку билета. Поэтому требуемая функциональность виджета довольно проста: показывать пользователю рекомендуемые игры для покупки и по тапу переходить к соответствующей. Список игр определяется на сервере и регулярно обновляется.

В нашем кейсе дизайн виджета предусматривал два состояния:

  • Для авторизованного пользователя
  • Для неавторизованного пользователя

Авторизованному пользователю нужно показывать данные его профиля: состояние внутреннего кошелька, количество билетов ожидающих розыгрыша и сумму неполученных выигрышей. Для каждого из этих элементов предусмотрен, отличный от других, переход на экран внутри приложения.

Читайте также:  Видеорегистратор навигатором для андроид

Как вы могли заметить, еще одной особенностью для авторизованного пользователя является кнопка «обновить», но об этом позже.

Для реализации отображения двух состояний, с учетом дизайна, я использовал RemoteAdapter в виде реализации RemoteViewsService, чтобы генерировать карточки контента.

А теперь немного кода и того, как все работает внутри. Если у вас уже был опыт работы с виджетом, то вы знаете, что любое обновление данных виджета начинается с метода onUpdate:

Пишем апдейт для каждого инстанса нашего виджета.

Пишем реализацию нашего сервиса. В нем нам важно указать, какую реализацию интерфейса RemoteViewsService.RemoteViewsFactory использовать, чтобы генерировать контент.

Фактически это тонкий wrapper над Adapter. Благодаря ему, мы можем связывать наши данные с remote collection view. RemoteViewsFactory предоставляет методы генерации RemoteViews для каждого элемента в наборе данных. У конструктора нет никаких требований — все что я делаю, это передаю в нем контекст.

Далее будет пару слов об основных методах:

  1. onCreate – создание адаптера.
  2. getLoadingView – метод предлагает возвращать View, которое система будет показывать вместо пунктов списка, пока они создаются. Если ничего здесь не создавать, то система использует некое дефолтное View.
  3. getViewAt – метод предлагает создать пункты списка. Здесь идет стандартное использование RemoteViews.
  4. onDataSetChanged вызывается, когда поступил запрос на обновление данных в списке. Т.е. в этом методе мы подготавливаем данные для списка. Метод заточен под выполнение тяжелого, долгого кода.
  5. onDestroy вызывается при удалении последнего списка, который использовал адаптер (один адаптер может использоваться несколькими списками).
  6. RemoteViewsFactory живет пока все инстансы списка живы, поэтому мы можем хранить в нем текущие данные, например, список текущих айтемов.

Определяем список данных, который будем показывать:

При создании адаптера начинаем загружать данные. Здесь спокойно можно выполнять любые тяжелые задачи, в том числе спокойно ходить в сеть блокируя поток.

При вызове команды на обновление данных, так же вызываем updateDataSync()

Внутри updateDataSync тоже все просто. Очищаем текущий список item-ов. Загружаем данные профиля и игры.

Здесь уже поинтереснее

Так как нам важно показывать профиль только авторизованному пользователю, то и информацию профиля нам нужно загружать только в этом случае:

Модель WidgetProfile собирается из разных источников, поэтому логика их получения и её дефолтные значения устроены таким образом, что отрицательное значение кошелька говорит о некорректных данных или проблемах с их получением.

Для бизнес логики отсутствие данных кошелька является критичным, поэтому, в случае некорректного кошелька, модель профиля не будет создана и добавлена в список item-ов.

Метод updateGamesSync() использует getWidgetGamesInteractor и добавляет в список widgetItems набор актуальных для виджета игр.

Прежде чем перейти к генерации карточек, рассмотрим подробнее модель WidgetItem. Она реализована через kotlin sealed class, что делает модель более гибкой, а работу с ней более удобной.

Создаем RemoteViews и определяем их отклик через FillInIntent

Метод setOnClickFillInIntent назначает указанной viewId intent, который будет объединен с родительским PendingIntent для определения поведения при клике на view с этим viewId. Таким образом, мы сможем реагировать на клики пользователей в нашем WidgetProvider.

Ручное обновление виджета

Для нашего виджета было установлено время обновления в полчаса. Можно обновлять его чаще, например, через танцы с WorkManager, но зачем грузить вашу сеть и аккумулятор? Такое поведение на первых этапах разработки казалось адекватным.

Все изменилось когда «бизнес» обратил внимание, что когда пользователь смотрит на виджет, на нем отображаются неактуальные данные: «Вот на моем iPhone, я открываю виджет и там САМЫЕ свежие данные моего профиля».

Ситуация банальна: iOS генерирует новые карточки при КАЖДОМ показе виджетов, ведь для этого у них отведен специальный экран, а Android не имеет подобных событий для виджета в принципе. Пришлось учесть, что некоторые лотереи проводятся раз в 15 минут, поэтому виджет должен давать актуальную информацию – ты хочешь поучаствовать в каком-то тираже, а он уже прошел.

Чтобы выйти из этой неприятной ситуации и как то решить проблему с обновлением данных, мной было предложено и реализовано проверенное временем решение — кнопка «обновить».

Добавляем эту кнопку в макет layout-a со списком и инициализируем её поведение при вызове updateWidget

Первые наработки показали грустную картину: от нажатия на кнопку «обновить» до фактического обновления, могло пройти несколько секунд. Хотя виджет и генерируется нашим приложением, он фактически находится во власти системы и общается с нашим приложением через broadcast-ы.

Т.е. при нажатии на кнопку «обновить» нашего виджета запускается цепочка:

  1. Получить Intent в onReceive провайдера action’ .
  2. AppWidgetManager.ACTION_APPWIDGET_UPDATE.
  3. Вызов onUpdate для всех указанных в intent-e widgetIds.
  4. Зайти в сеть за новыми данными.
  5. Обновить локальные данные и отобразить новые карточки списка.

В результате, обновление виджета выглядело не очень красиво, так как нажав на кнопку, мы пару секунд смотрели на тот же виджет. Было непонятно обновились ли данные. Как решить проблему визуального отклика?

Во-первых, я добавил флаг isWidgetLoading с глобальным доступом через интерактор. Роль этого параметра довольно проста — не показывать кнопку «обновить», пока идет загрузка данных виджета.

Читайте также:  Джойстик для android box

Во вторых, процесс загрузки данных в фабрике я разделил на три этапа:

START — начало загрузки. На этом этапе состояние всех вьюшек адаптера и глобального флага загрузки меняется на «загружается».

MIDDLE — этап основной загрузки данных. После их загрузки глобальный флаг загрузки переводится в состояние «загружено», а в адаптере отображаются загруженные данные.

END — конец загрузки. Адаптеру на этом шаге не требуется изменять данные адаптера. Этот шаг нужен чтобы корректно обработать этап обновления вьюшек в WidgetProvider.

Давайте посмотрим подробнее как теперь выглядит обновление кнопки в провайдере:

А теперь посмотрим на то, что происходит в адаптере:

  1. В конце этапов START и MIDDLE я вызываю метод updateWidgets для того, чтобы обновить состояние view управляемых провайдером.
  2. После выполнения шага START для пользователя визуально отображается «загрузка» в ячейках виджета, и начнется этап MIDDLE.
  3. Перед тем как вызвать обновление данных адаптера на шаге MIDDLE, провайдер скроет кнопку «обновить».
  4. После выполнения шага MIDDLE, для пользователя будет отображаются новые данные и начнется этап END.
  5. Перед тем как вызвать обновление данных адаптера, на шаге END, провайдер скроет кнопку «обновить». С точки зрения фабрики все данные будут актуальными, поэтому на шаге END меняем значение loadingStep на START.

С помощью подобной реализации я достиг компромисс между требованием «бизнеса» видеть на виджете актуальные данные и необходимостью «дергать» обновление слишком часто.

Надеюсь, что статья была для вас полезной. Если у вас был опыт создания виджетов для Android, то расскажите об этом в комментариях.

Источник

Лучшие виджеты часов для Андроид: ТОП-10 приложений

Наверное, виджет часы для Андроид — одна из главных «составляющих» главного экрана и экрана блокировки телефона; тем не менее, пользователи обычно обращают на неё мало внимания, считая установленной по умолчанию и не поддающейся модификации. На самом деле это не так: помимо официального приложения Google, встроенного в Android, существует множество аналогичных программ, часто более удобных, функциональных, предлагающих значительно более красивый интерфейс. Кроме времени, вы сможете, взглянув на экран Андроид, узнать текущий часовой пояс, дату, возможно — даже ознакомиться с прогнозом погоды или увидеть актуальную температуру воздуха.

В отличие от стандартного приложения, такие апплеты предлагают существенно больше настроек; на то, чтобы разобраться с ними, уйдёт больше времени, однако в результате вы получите именно такие «часы», какие хотели бы видеть на своём гаджете Android. Все перечисленные в нашей статье альтернативные программы можно загрузить из официального магазина Play Market, также предустановленного в вашем телефоне или планшете. Собственно, выбор можно назвать даже слишком обширным: ознакомьтесь с нашим небольшим рейтингом, чтобы скачать действительно лучший виджет часов для Андроид: удобный, легко настраиваемый, не потребляющий чрезмерно много заряда аккумулятора — и, разумеется, симпатично оформленный. C помощью виджета можно добавить часы на экран блокировки Андроид или установить часы на главном экране.

Все перечисленные ниже приложения можно скачать бесплатно, однако в некоторых содержатся платные опции; рекомендуем сначала оценить базовую версию и лишь затем отдавать деньги за полную. Поскольку апплеты распространяются в официальном магазине «Гугла», они не содержат вирусов и не причинят вашему телефону Android никакого вреда.

Приложение #1: Виджет цифровых часов от Maize

Хорошо проработанная программа, показывающая на главном экране смартфона или планшета время в цифровом формате. Стилизована под iPhone, имеет несколько базовых пресетов оформления.

Функционал приложения включает:

  • Множество гибких настроек, при помощи которых вы сможете настроить «часы» под себя.
  • Мгновенное применение внесённых вами изменений: после настройки не понадобится перезапускать смартфон и даже выходить из программы.
  • Несколько красивых разноцветных фоновых рисунков.
  • RGB-палитра для настройки оттенка времени и даты, включающая порядка 16 миллионов тонов.
  • Отображение установленных будильников.
  • Установив программу, вы сможете подстраивать виджет часы для Андроид на русском под размер экрана: зажмите картинку на несколько мгновений, а затем передвигайте границы.
  • Полную совместимость как с телефонами, так и с планшетами Android.
  • Стильный «материальный» интерфейс, разработанный несколько лет назад, но пока не утрачивающий популярности.
  • Много вариантов отображения даты и времени.
  • Выбор ярлыка для быстрой настройки виджета.
  • Поддержку старых поколений операционных систем Андроид, вплоть до версии 4.2.

Приложение #2: DIGI Clock

Скачав программу, вы получаете комплект из пяти красивых виджетов, на которых отображаются время и дата. В число настроек, предлагаемых разработчиком, входят:

  • Мгновенный предпросмотр вносимых в виджеты изменений.
  • Красивая и чёткая прорисовка контуров.
  • Поддержка множества языков мира, включая и русский.
  • Переключение между 12- (AM/PM) и 24-часовыми форматами вывода времени.
  • Отображение информации об установленных в системе Android будильниках.
  • Выбор цвета, формата и расположения на экране даты и времени.
  • Привлекательные эффекты тени для каждого виджета.
  • Рассматриваемое нами приложение часы для Андроид позволяет устанавливать прозрачность фона: от полностью прозрачного до полностью непрозрачного (0…100%).
  • При размере виджета 4×1 вы увидите на экране не только часы и минуты, но и секунды.
  • Возможность установить в качестве фона свою картинку.
  • Переход к списку параметров долгим нажатием на виджет.
  • Выбор из более чем 40 предустановленных шрифтов или добавление собственных.
  • Совместимость с планшетами.
  • Совместимость со старыми поколениями ОС Android, начиная с версии 4.2, а также некоторыми модификациями, включая Jelly Bean, Honeycomb и, в зависимости от версии, ICS.
Читайте также:  Разблокировка экрана блокировки android

Приложение #3: Digital Clock Widget Xperia

Очень простые в настройке часы, выполненные в стиле одноимённой линейки Sony.

В список доступных функций входят:

  • Несколько вариантов оформления и размеров (от 2×1 до 4×2) виджетов.
  • Выбор между 18 встроенными шрифтами, чёткими и красивыми.
  • Регулировка цвета и размера шрифтов.
  • Несколько вариантов размещения на главном экране времени и даты.
  • Переход к настройкам апплета долгим нажатием на поле виджета.
  • Этот возможно лучший виджет часов и погоды для Андроид позволяет выводить на экран как сведения о текущей температуре, так и краткий прогноз на несколько дней.
  • Настройка картинки и прозрачности фона.
  • Добавление «часов» отдельно на экран блокировки — доступно только для ОС Android начиная с версии 4.2, в некоторых модификациях даже на этих условиях не может быть применено.

Приложение #4: Retro Clock Widget

Отлично зарекомендовавшая себя программа, давно известная пользователям телефонов и планшетов под управлением Андроид. Как и все прочие аналогичные, выводит на главный экран дату и время — в виде стильного перекидного календаря. Перейти к настройкам будильника и некоторым другим опциям можно, просто тапнув по виджету.

Для более тонких настроек (например, прозрачности фона или вида ярлыка) необходимо загрузить дополнительное мини-приложение: Retro Clock Settings.

Чтобы установить «часы» на главный экран:

  1. Несколько секунд нажимайте на любую свободную точку тачскрина.
  2. В открывшемся меню выберите пункт «Виджеты».
  3. Выберите для размещения на дисплее понравившийся вариант отображения времени.

Как и ранее перечисленные программы, скачать приложение часы на Андроид можно совершенно бесплатно.

Приложение #5: Nice Simple Clock Widget

Неплохой апплет, предлагающий большой выбор интересных опций:

  • Фирменное минималистическое оформление.
  • Настройку формата отображения времени и даты.
  • Настройку шрифтов, цветов, положения отдельных элементов.
  • Выбор нескольких «часов» для разных часовых поясов.
  • Несколько вариантов размера виджета.
  • Размещение на одном экране сразу нескольких вариантов «часов», настраиваемых раздельно.
  • Запуск некоторых утилит, в частности, «Будильника», нажатием на виджет.
  • Настройку прозрачности и цвета фона, а также закруглённости углов.
  • Мгновенный просмотр вносимых изменений без необходимости выходить из приложения или перезапускать телефон Android.
  • Оптимизацию потребления заряда батареи смартфона или планшета.

Приложение #6: Simple World Clock Widget

Красивый, простой в управлении апплет, предлагающий материальный дизайн и возможность вывода на главный экран времени и даты в любом понравившемся вам формате.

Функционал приложения включает:

  • Настройку начертания, размера, цвета шрифта.
  • В платной версии виджет часов для Андроид позволяет пользователю выбирать сторонние шрифты.
  • Запуск программ одним касанием по полю «часов».
  • Настройку рисунка и прозрачности фона.
  • Выбор текущего или любого другого часового пояса.

Добавляется виджет на дисплей обычным способом: выберите его в общем списке и перетащите на подходящее место экрана. В некоторых модификациях операционной системы Android порядок действий может несущественно отличаться.

Приложение #7: Виджет аналоговых часов

Удобная программа с необходимым минимумом функций и настроек. Может быть использована в качестве альтернативного будильника. Чтобы изменить текущие настройки, просто тапните по виджету.

Приложение #8: Digital Clock Live Wallpaper-7

Помимо собственно отображения часов, приложение показывает симпатичные «живые» обои; на экран выводится информация не только о времени и дате, но и о текущем заряде аккумулятора. Есть опция голосового оповещения о времени, интерфейс полностью русифицирован.

Вы можете скачать виджет часов на Андроид по ссылке совершенно бесплатно. В набор функций входят:

  • Выбор начертания, размера, цвета шрифта (всего доступно десять шрифтов, включая выполненный в LCD- и ретро-стиле)
  • Настройка прозрачности и оттенка фонового изображения.
  • Включение или отключение эффекта свечения, а также 3D-визуализации
  • Чтобы включить озвучку текущего времени, дважды тапните по виджету; возможна настройка регулярных оповещений.

Приложение #9: «Прозрачные часы и погода»

Программа позволяет настраивать прозрачность фоновой картинки, отображает, помимо даты и времени, прогноз погоды или сведения о текущей температуре воздуха. Кроме того, здесь можно включить отображение событий календаря, свободного пространства во встроенной и внешней памяти, точного времени восхода и заката. В настройках вы сможете активировать вызов некоторых утилит, включая будильник, одним нажатием на «часы».

Приложение #10: Огромные цифровые часы

Главная особенность апплета — по-настоящему огромные часы, которые несложно разглядеть в любых условиях. Как всегда, скачать виджет часы на Андроид вы можете полностью бесплатно.

  • Отображение больших, стильно оформленных часов.
  • Показ даты, месяца и года.
  • Возможность настроить стиль, размер, цвет шрифта.
  • Вывод данных в строке состояния.
  • Автоматическое переориентирование из альбомного в портретный режим и обратно.
  • Выбор варианта показа времени: 12- или 24-часового.
  • Отображение прогноза погоды.
  • Тонкая настройка размера виджета.
  • Вывод информации об оставшемся заряде аккумулятора.
  • Подстройка яркости экрана в ночном режиме.
  • Стильные «перелистывающиеся» часы.
  • Закрытие апплета при достижении критически низкого заряда батареи.
  • Автоматическое перемещение «часов» по экрану блокировки с целью предотвращения выгорания дисплея.

Источник

Оцените статью