Неопытные пользователи операционных систем андроид каждый день узнают о все новых и новых возможностях своих гаджетов. Такого количества настроек и свободы действий, какие предоставляет андроид, не может себе представить даже самая демократично настроенная к пользователю система. Одна из возможностей каждого телефона Android — установка виджетов. Практически каждый сталкивался с этим понятием, но не знает, что оно означает. В этой статье будет подробно разобрано, что такое виджеты для андроид-устройств, для чего они нужны и как их установить.
Что такое виджеты на андроиде
Виджет (Widget) — это маленькая программка или визуальная ее часть, располагающаяся на рабочем столе смартфона и предназначенная для отображения тех или иных данных, а также для других целей. Она может управлять аппаратным или программным оборудованием телефона или приводить в исполнение другую пользовательскую или предустановленную программу.
В качестве примера микропрограммы на рабочем столе можно установить показ времени и погоды
К примеру, есть виджеты, которые позволяют отображать работу некоторых датчиков телефона и показывать их измерения (загруженность процессора, доступный и занятый объем оперативной памяти, заряд аккумуляторной батареи и ее состояние и т. д.). Подобные утилиты также могут работать с тем или иным сервисом для получения каких-либо данных: погода в выбранном городе, курс определенных валют, новости с сайта, на который оформлена RSS-подписка.
Обратите внимание! Виджеты, работающие с программами или онлайн-сервисами, которые постоянно обновляют ту или иную информацию, берут ее из открытых онлайн-источников и просто отображают ее на рабочем столе. Часто они перестают функционировать, если у пользователя нет доступа к Глобальной сети.
Эти приложения могут обладать различным размером. Минимальный — размер одного стандартного ярлыка (1x1). Максимальный — полноэкранный режим, который, очевидно, занимает все пространство свободного окна рабочего стола.
Проще говоря, виджет — это обычная программа, целью которой является отображение каких-либо данных с онлайн-ресурсов или датчиков телефона, а также взаимодействие с важными аппаратными и программными настройками. Приложение «живет» на рабочем столе там, где нет ярлыков. Чаще всего оно находится на начальном окне в виде часов или на любой свободной области главного меню с ярлыками всех приложений.
Самый распространенный виджет — аналоговые или цифровые часы на первой странице основного меню
Кейс создания виджета
Дальше речь пойдет о кейсе который был у нас в FINCH в крупном лотерейном приложении с приложением «Столото» для участия в государственных лотереях.
Задача приложения – упростить и сделать прозрачным для пользователя выбор лотереи и покупку билета. Поэтому требуемая функциональность виджета довольно проста: показывать пользователю рекомендуемые игры для покупки и по тапу переходить к соответствующей. Список игр определяется на сервере и регулярно обновляется.
В нашем кейсе дизайн виджета предусматривал два состояния:
- Для авторизованного пользователя
- Для неавторизованного пользователя
Авторизованному пользователю нужно показывать данные его профиля: состояние внутреннего кошелька, количество билетов ожидающих розыгрыша и сумму неполученных выигрышей. Для каждого из этих элементов предусмотрен, отличный от других, переход на экран внутри приложения.
Как вы могли заметить, еще одной особенностью для авторизованного пользователя является кнопка «обновить», но об этом позже.
Для реализации отображения двух состояний, с учетом дизайна, я использовал RemoteAdapter в виде реализации RemoteViewsService, чтобы генерировать карточки контента.
А теперь немного кода и того, как все работает внутри. Если у вас уже был опыт работы с виджетом, то вы знаете, что любое обновление данных виджета начинается с метода onUpdate:
override fun onUpdate( context: Context, appWidgetManager: AppWidgetManager, appWidgetIds: IntArray ) { injector.openScope(this, *arrayOf(this)) // update each of the widgets with the remote adapter appWidgetIds .forEach { updateWidget(context, appWidgetManager, it) } } Пишем апдейт для каждого инстанса нашего виджета. private fun updateWidget( context: Context, appWidgetManager: AppWidgetManager, appWidgetId: Int ) { //Создаем remoteViews для текущего widgetId val remoteViews = RemoteViews( context.packageName, R.layout.app_widget_layout … // делаем что то не интересное для этой статьи … // Обновляем адаптер для remoteViews updateRemoteAdapter(context, remoteViews, appWidgetId) //Обновляем виджет созданным remoteViews appWidgetManager.updateAppWidget(appWidgetId, remoteViews) //Обновляем collection view этого виджета appWidgetManager.notifyAppWidgetViewDataChanged( appWidgetId, R.id.lvWidgetItems ) } Обновляем адаптер. private fun updateRemoteAdapter(context: Context, remoteViews: RemoteViews, appWidgetId: Int) { //Назначаем свою реализацию RemoteViewsService на роль RemoteAdapter для нашего списка val adapterIntent = Intent(context, StolotoAppWidgetRemoteViewsService::class.java).apply { putExtra(AppWidgetManager.EXTRA_APPWIDGET_ID, appWidgetId) } remoteViews.setRemoteAdapter(R.id.lvWidgetItems, adapterIntent) //Формируем actionIntent для pendingIntent чтобы обрабатывать клики элементы виджета val actionIntent = Intent(context, StolotoAppWidgetProvider::class.java).apply { action = WIDGET_CLICK_ACTION putExtra(AppWidgetManager.EXTRA_APPWIDGET_ID, appWidgetId) } val pendingIntent = PendingIntent.getBroadcast( context, 0, actionIntent, PendingIntent.FLAG_UPDATE_CURRENT ) //Назначаем pendingIntent шаблоном для клика по нашим айтемам remoteViews.setPendingIntentTemplate(R.id.lvWidgetItems, pendingIntent) } Пишем реализацию нашего сервиса. В нем нам важно указать, какую реализацию интерфейса RemoteViewsService.RemoteViewsFactory использовать, чтобы генерировать контент. class StolotoAppWidgetRemoteViewsService : RemoteViewsService() { override fun onGetViewFactory(intent: Intent): RemoteViewsFactory = StolotoAppWidgetRemoteViewsFactory( this.applicationContext, intent ) } Фактически это тонкий wrapper над Adapter. Благодаря ему, мы можем связывать наши данные с remote collection view. RemoteViewsFactory предоставляет методы генерации RemoteViews для каждого элемента в наборе данных. У конструктора нет никаких требований — все что я делаю, это передаю в нем контекст.
Далее будет пару слов об основных методах:
- onCreate – создание адаптера.
- getLoadingView – метод предлагает возвращать View, которое система будет показывать вместо пунктов списка, пока они создаются. Если ничего здесь не создавать, то система использует некое дефолтное View.
- getViewAt – метод предлагает создать пункты списка. Здесь идет стандартное использование RemoteViews.
- onDataSetChanged вызывается, когда поступил запрос на обновление данных в списке. Т.е. в этом методе мы подготавливаем данные для списка. Метод заточен под выполнение тяжелого, долгого кода.
- onDestroy вызывается при удалении последнего списка, который использовал адаптер (один адаптер может использоваться несколькими списками).
- RemoteViewsFactory живет пока все инстансы списка живы, поэтому мы можем хранить в нем текущие данные, например, список текущих айтемов.
Определяем список данных, который будем показывать: private val widgetItems = ArrayList() При создании адаптера начинаем загружать данные. Здесь спокойно можно выполнять любые тяжелые задачи, в том числе спокойно ходить в сеть блокируя поток. override fun onCreate() { updateDataSync() } При вызове команды на обновление данных, так же вызываем updateDataSync() override fun onDataSetChanged() { updateDataSync() } Внутри updateDataSync тоже все просто. Очищаем текущий список item-ов. Загружаем данные профиля и игры. private fun updateDataSync() { widgetItems.clear() updateProfileSync() updateGamesSync() } Здесь уже поинтереснее private fun updateProfileSync() { Так как нам важно показывать профиль только авторизованному пользователю, то и информацию профиля нам нужно загружать только в этом случае: val isUserFullAuth = isUserFullAuthInteractor .execute() .blockingGet() if (isUserFullAuth) { val profile = getWidgetProfileInteractor .execute() .onErrorReturn { WidgetProfile() //Возвращаем пустую модель профиля в случае ошибок или отсутствия корректных данных профиля } .blockingGet() Модель WidgetProfile собирается из разных источников, поэтому логика их получения и её дефолтные значения устроены таким образом, что отрицательное значение кошелька говорит о некорректных данных или проблемах с их получением.
Для бизнес логики отсутствие данных кошелька является критичным, поэтому, в случае некорректного кошелька, модель профиля не будет создана и добавлена в список item-ов.
if (profile.walletAmount >= 0L) { widgetItems.add( WidgetItem.Profile( wallet = profile.walletAmount.toMoneyFormat(), waitingTickets = if (profile.waitingTicketsCount >= 0) profile.waitingTicketsCount.toString() else «», unpaidPrizeAmount = if (profile.unpaidPrizeAmount >= 0) profile.unpaidPrizeAmoount.toMoneyFormat() else «» ) ) } } } Метод updateGamesSync() использует getWidgetGamesInteractor и добавляет в список widgetItems набор актуальных для виджета игр.
Прежде чем перейти к генерации карточек, рассмотрим подробнее модель WidgetItem. Она реализована через kotlin sealed class, что делает модель более гибкой, а работу с ней более удобной.
sealed class WidgetItem { data class Profile( val wallet: String, val waitingTickets: String, val unpaidPrizeAmount: String ) : WidgetItem() data class Game( val id: String, val iconId: Int, val prizeValue: String, val date: String ) : WidgetItem() } Создаем RemoteViews и определяем их отклик через FillInIntent override fun getViewAt(position: Int): RemoteViews { return when (val item = widgetItems[position]) { is WidgetItem.Profile -> { RemoteViews( context.packageName, R.layout.item_widget_user_profile ).apply { setTextViewText(R.id.tvWidgetWalletMoney, item.wallet) setTextViewText(R.id.tvWidgetUnpaidCount, item.unpaidPrizeAmount) setTextViewText(R.id.tvWidgetWaitingCount, item.waitingTickets) setOnClickFillInIntent( R.id.llWidgetProfileWallet, Intent().putExtra( StolotoAppWidgetProvider.KEY_PROFILE_OPTIONS, StolotoAppWidgetProvider.VALUE_USER_WALLET ) ) setOnClickFillInIntent( R.id.llWidgetProfileUnpaid, Intent().putExtra( StolotoAppWidgetProvider.KEY_PROFILE_OPTIONS, StolotoAppWidgetProvider.VALUE_UNPAID_PRIZE ) ) setOnClickFillInIntent( R.id.llWidgetProfileWaiting, Intent().putExtra( StolotoAppWidgetProvider.KEY_PROFILE_OPTIONS, StolotoAppWidgetProvider.VALUE_WAITING_TICKETS ) ) } is WidgetItem.Game -> { RemoteViews( context.packageName, R.layout.item_widget_game ).apply { setImageViewResource(R.id.ivWidgetGame, item.iconId) setTextViewText(R.id.tvWidgetGamePrize, item.prizeValue) setTextViewText(R.id.tvWidgetGameDate, item.date) setOnClickFillInIntent( R.id.llWidgetGame, Intent().putExtra( StolotoAppWidgetProvider.KEY_GAME_CLICK, item.id ) ) } } } } Метод setOnClickFillInIntent назначает указанной viewId intent, который будет объединен с родительским PendingIntent для определения поведения при клике на view с этим viewId. Таким образом, мы сможем реагировать на клики пользователей в нашем WidgetProvider.
Для чего используются виджеты на андроиде
Как удалить виджеты на андроиде — подробная инструкция
Как уже было сказано, виджеты наиболее часто используют для отображения какой-либо информации. Это могут быть системные данные о загруженности процессора или доступном объеме оперативной или внутренней памяти (есть также программы, позволяющие быстро почистить ОЗУ в один клик). Кроме этого, часто прибегают к виджетам с курсами валют, погодой, курсом акций того или иного предприятия.
Важно! Это очень полезные программы, которые дает возможность быстро получить нужную информацию или выполнить какое-либо действие — включить и выключить мобильный Интернет или Wi-Fi, активировать Bluetooth и проделать все то же самое с модулем GPS и другим оборудованием.
Приложение, которое отображает текущий и актуальный курсы валют различных государств
Windows 10
Юзерам десятки придётся прибегнуть к помощи дополнительных сторонних приложений. Наиболее популярным сегодня является программа Windows Desktop Gadgets, которую можно скачать с сайта https://gadgetsrevived.com/download-sidebar/. После чего у вас появится такая же вкладка, как и у пользователей семёрки. То есть, инструкция далее будет такая же. Ещё одно приложение, но уже с большим функционалом под названием 8GadgetPack. Доступен он для загрузки на официальном сайте разработчика https://8gadgetpack.net/. По сравнению с предыдущей программой, эта не до конца переведена на русский. Но если это не является для вас проблемой, то этот вариант для скачивания будет лучше.
Основные типы виджетов на андроиде
Что такое кэш в телефоне андроид — подробная информация
Классификаций этих микропрограмм множество. Далее будет описаны лишь основные.
В первую очередь виджеты делятся по внешнему виду и месту расположения:
- топперы. Они расположены вверху экрана и обычно выглядят как полоса с полем для вывода информации и кнопкой. Очевидно, что они выполняют поиск и отображение какой-либо информации, будь то заметка, курс акций, уведомление о письме и т. д.;
- флор. Могут быть аналогичными топперам, но располагаются внизу дисплея. Это их главное отличие. Больше они ничем не различаются;
- всплывающие окна. Больше относятся к веб-виджетам, но могут применяться и на андроиде, когда нужно напомнить человеку о важной встрече или делах.
Внешний вид окна виджетов в смартфонах с новой операционной системой
Еще одна известная классификация — место встраивания. Виджет может быть расположен на сайте для удобной авторизации через социальные сети. Такие программы позволяют делиться понравившимся материалом, приглашать на сервис друзей или рефералов и т. д.
Виджеты на андроид-устройствах относятся к категории десктопных, то есть запускаемых только на определенной операционной системе: мобильной или компьютерной. Чтобы создать такой виджет, нужна специальная программа, работающая в роли движка. Обычно подобные микроприложения заточены для выполнения одной функции. К примеру, контроль времени, запуск таймера или секундомера с оповещением, создание и закрепление памятных записок на рабочем столе, показ прогноза погоды или обновление курса доллара.
Обратите внимание! Использование таких небольших по объему занимаемого места на экране и в памяти программ позволяет существенно облегчить жизнь и всегда оставаться на связи и в курсе всех последних событий и прогнозов.
Расположение раздела виджетов на андроиде не самой новой версии
Как устанавливать и удалять виджеты на андроид
Как добавить и удалить виджет на рабочий стол телефона андроид? Его недостаточно просто скачать и установить по аналогии с обычной программой. Он должен быть размещен на рабочем столе.
Что такое Андроид ТВ — подробная информация об устройстве
Начиная с релиза андроида версии 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 4x4 grid, and tablets can offer a larger, 8x7 grid.
Переводя на русский: каждый виджет должен задать свои минимальную ширину и высоту, чтобы обозначить минимальное пространство, которое будет им занято по умолчанию.
Пример настроек виджета при создании в Android Studio
Виджет, который добавили на на Home screen, обычно займет больше места чем минимальные ширина и высота экрана, которые вы задали. Android Home screens предоставляет пользователям сетку доступного пространств, в которых могут быть расположены виджеты и иконки. Эта сетка может отличаться в зависимости от устройства; например, многие телефоны предлагают сетку 4х4, а планшеты могут предложить большие сетки 8х7.
Из этого становится понятно, что сетка устройства может быть какой угодно, а размер ячеек может отличаться, в зависимости от размера сетки. Соответственно, контент виджета должен быть спроектирован с учетом этих особенностей.
Минимальные ширину и высоту виджета для заданного количества столбцов и строк можно вычислить по формуле:
minSideSizeDp = 70 x n - 30, где n —количество строк или столбцов
На текущий момент максимальный минимум сетки, которую вы можете задать это 4х4. Это гарантирует, что ваш виджет будет отображаться на всех девайсах.
Особенности обновления виджета
Так как AppWidgetProvider по своей сути является расширением BroadcastReceiver-а, с ним можно делать все то же самое, что и с обычным BroadcastReceiver. AppWidgetProvider просто парсит соответствующие поля из Intent, полученного в onReceive и вызывает методы перехвата с полученными extras.
Сложность возникла с частотой обновления контента — все дело в разнице внутренней работы виджетов на iOS и Android. Дело в том, что данные на iOS-виджетах обновляются тогда, когда виджет становится виден пользователю. В Android, такого события не существует. Мы не можем узнать, когда пользователь видит виджет.
Для виджетов на Android рекомендуемым способом обновления является обновление по таймеру. Настройки таймера задаются параметром виджета updatePeriodMillis. К сожалению, эта настройка не позволяет обновлять виджет чаще чем раз в 30 минут. Ниже я расскажу об этом подробнее.
Где можно скачать виджеты для устройств на андроиде, можно ли найти в Плей Маркет
Скачать эти полезные программы можно практически на любом ресурсе, который посвящен приложениям и играм на андроид. Для этого есть специальные разделы. Ниже представлен список веб-сайтов, которые занимаются распространением подобных программ:
- TrashBox (https://trashbox.ru/apps/android/widget/);
- Top-androids (https://top-androids.ru/widgets/);
- FreeSoft (https://freesoft.ru/android/widgets);
- Programmy-dlya-android (https://programmy-dlya-android.ru/vidzhety/).
Важно! Скачивать любые игры и программы с неофициальных ресурсов (сайт разработчика или официальный цифровой магазин Play Market) не рекомендуется. Есть шанс получить вирус или майнер в свою операционную систему, что чревато серьезными последствиями для корректной работы гаджета и конфиденциальности личных данных, которые хранятся на нем.
Просто так установить стороннюю программу из неофициального источника не удастся. Этому помешает система защиты от нежелательного софта. Чтобы ее отключить, необходимо:
- Включить или разблокировать свое устройство.
- Перейти в его главное меню и нажать на иконку приложения «Настройки».
- Выбрать пункт «Безопасность».
- Среди всех прочих настроек выбрать параметр «Неизвестные источники» и активировать его.
Обратите внимание! Параметр может называться «Разрешить установку программ из неизвестных источников». Его также необходимо переключить в состояние «Активно».
Скачивать виджеты можно и из официального магазина Плей Маркет. Для этого нужно вбить в поиске название интересующей программы. Обычно они называются по функциям, которые выполняют. Далее просто производятся скачивание и установка, а затем и размещение интерфейса микроприложения на рабочем столе обычным образом.
Если есть разрешение на скачку программ и игр только из Плей Маркета, то его можно отменить
Таким образом, было разобрано, что такое виджеты Android, каких видов они бывают и как их правильно установить. Сегодня на просторах Сети есть множество по-настоящему хороших и полезных микропрограмм, которые могут заметно повысить удобство пользования телефоном и просто упростить жизнь за счет быстрого доступа к той или иной информации. Они доступны к скачивают как из официального магазина, так и из других интернет-источников. Для установки вторых потребуется специальное разрешение в настройках гаджета.
Как вы используете приложение для блокировки экрана?
Каждый раз, когда вы включаете устройство или выводите экран из спящего режима, вам будет предложено разблокировать устройство, обычно с помощью PIN-кода, графического ключа или пароля. … Установить или изменить блокировку экрана
- Откройте приложение «Настройки» вашего телефона.
- Коснитесь Безопасность. …
- Чтобы выбрать тип блокировки экрана, коснитесь «Блокировка экрана». …
- Коснитесь параметра блокировки экрана, который хотите использовать.