Создание виджета на смартфонах Huawei возможно тремя способами: добавление системного элемента, настройка через сторонние конструкторы или разработка собственного модуля через HMS Core. Выбор метода зависит от задачи — быстро вывести погоду на рабочий стол или выпустить приложение в AppGallery. В этой статье разберем каждый подход с техническими нюансами EMUI и HarmonyOS.
Пользователи часто путают «создание» с «добавлением», поэтому сразу проясним терминологию. Системные виджеты уже заложены в прошивку и требуют только размещения. Конструкторы вроде KWGT дают визуальный редактор без кода. Настоящая разработка под HarmonyOS или Android-оболочку EMUI подразумевает работу с AbilitySlice, WidgetProvider и манифестом config.json.
Способы создания виджетов: сравнительный обзор
Прежде чем приступать к инструкциям, определитесь с целью. Для бытовых задач достаточно встроенного функционала или бесплатных приложений из AppGallery. Если нужно реализовать уникальную логику — например, отображение данных с датчиков умного дома или интеграцию с корпоративным API — придется писать код на ArkTS / Java / JS.
В таблице ниже собраны ключевые различия подходов по сложности, возможностям и требованиям к навыкам.
| Метод | Сложность | Гибкость дизайна | Доступ к API системы | Требуемые инструменты |
|---|---|---|---|---|
| Системные виджеты | Низкая (1 мин) | Фиксированные шаблоны | Базовый (часы, погода, календарь) | Только лаунчер |
| Конструкторы (KWGT, MLW) | Средняя (15-30 мин) | Полная свобода (слои, формулы, шрифты) | Расширенный (Tasker, JSON, сенсоры) | Приложение из AppGallery / APK |
| Разработка (HMS Core / ArkUI) | Высокая (часы/дни) | Неограниченная (Canvas, декларативный UI) | Полный (HMS ML, Account, Push, Health) | DevEco Studio, AppGallery Connect |
⚠️ Внимание: На устройствах с HarmonyOS NEXT (без AOSP) классические Android-виджеты на базеAppWidgetProviderне работают. Необходимо использовать нативный фреймворк ArkUI и формат.hap.
Добавление и настройка системных виджетов
Это базовый сценарий для 90% владельцев устройств. Процедура идентична на EMUI 12-14 и HarmonyOS 2-4, хотя визуально меню может отличаться. Зажмите палец на пустом месте главного экрана до появления меню редактирования.
В открывшемся интерфейсе выберите пункт «Виджеты». Список формируется динамически: туда попадают модули от предустановленных приложений (Календарь, Погода, Музыка, Здоровье) и модули от сторонних программ, которые вы установили и которые объявили поддержку виджетов в манифесте. Перетащите нужный элемент на экран.
Многие системные блоки поддерживают ресайз. После размещения зажмите виджет до вибрации — появятся маркеры границ. Тяните их, чтобы изменить размер от 1x1 до 4x4 ячеек сетки. Некоторые виджеты (например, «Погода») меняют компоновку контента в зависимости от размера.
☑️ Чек-лист
- 🔧 Проверьте, что приложение-донор не находится в списке «Защищенных приложений» в настройках батареи, иначе виджет перестанет обновляться
- 📱 На HarmonyOS виджеты можно складывать в стопки (Smart Widget Stack) — свайп вверх/вниз переключает карточки в одной ячейке
- 🔄 Если виджет серый или показывает «Нет данных» — откройте родительское приложение, дайте разрешения на геолокацию и фоновую работу
Создание уникального виджета через KWGT и MLW
Приложение KWGT Kustom Widget Maker — де-факто стандарт для кастомизации без программирования. Оно доступно в AppGallery, но актуальную версию Pro часто проще взять с официального сайта разработчика или через APKPure, так как магазин Huawei иногда отстает по обновлениям. После установки добавьте виджет KWGT на рабочий стол (размер 4x2 или больше для комфорта редактирования).
Нажмите на размещенный виджет — откроется редактор. Интерфейс построен на дереве слоев: «Корневой контейнер» → «Группа» → «Текст / Изображение / Прогресс-бар / Фигура». Для динамических данных используйте формулы в поле «Текст» или «Значение». Например, $df(HH:mm)$ выведет время, $wi(temp)$ — температуру (требуется плагин KWGT Weather или Tasker).
Мощнейшая фича — «Компоненты» (Komponents). Это готовые модули (часы, плеер, батарея), которые импортируются одним кликом из сообщества или файла .kwgt. Скачайте понравившийся пресет на форуме XDA или Reddit, положите в папку /KWGT/komponents/ и выберите в меню «Загрузить компонент».
⚠️ Внимание: KWGT требует разрешения «Отображать поверх других приложений» и доступ к уведомлениям для работы музыкальных контроллеров. Без отключения агрессивного управления питанием (Настройки → Батарея → Запуск приложений → KWGT → Управление вручную → Всё включено) виджет будет «засыпать» и показывать старые данные.
Разработка нативного виджета под HarmonyOS / EMUI
Для профессиональной разработки используется DevEco Studio (на базе IntelliJ IDEA). Создайте проект типа «Empty Ability» или «Widget Extension» в зависимости от целевой ОС. На HarmonyOS API 9+ (HarmonyOS 3.0+) виджеты реализуются через FormExtensionAbility и декларативный UI на ArkTS (eTS).
Ключевой файл — form_config.json в модуле entry. Он описывает метаданные формы: размеры (2x2, 2x4, 4x4), цвет фона, имя класса провайдера (FormProvider) и частоту обновления (updateDuration в миллисекундах, минимум 1800000 = 30 мин для экономии заряда).
Логика обновления пишется в классе, наследуемом от FormExtensionAbility. Метод onAddForm(want) вызывается при добавлении на рабочий стол, onUpdateForm(ids) — по таймеру или пушу. Внутри формируется FormBindingData — словарь ключ-значение, который биндится к верстке в .ets файлах.
// Пример onUpdateForm в FormProvider.ets
import formBindingData from '@ohos.app.form.formBindingData';
export default class FormProvider extends FormExtensionAbility {
onUpdateForm(formIds: number[]) {
let data = {
"current_time": new Date().toLocaleTimeString(),
"battery_level": getBatteryLevelSync()
};
formIds.forEach(id => {
formBindingData.updateFormData(id, data);
});
}
}
Нюансы публикации в AppGallery Connect
При модерации виджетов проверяют: 1) Соответствие гайдлайнам дизайна HarmonyOS (скругления 12vp, отступы 16vp). 2) Отсутствие крашей при добавлении/удалении. 3) Корректную работу в «Умном виджете» (Smart Widget Stack). 4) Экономичность: нет wake-lock, нет частых сетевых запросов. Пакет должен быть подписан release-сертификатом, debug-сборки не проходят пре-модерацию.
Отладка ведется на реальном устройстве или в эмуляторе DevEco (поддерживает x86 и ARM). Установите hdc (Huawei Device Connector) для логов: hdc shell hilog | grep FormProvider. Частая ошибка новичков — попытка обновить форму чаще, чем раз в 30 минут через таймер. Для частых обновлений используйте Push Kit или Background Tasks с триггерами.
⚠️ Внимание: На EMUI 12+ (Android 11+) действует строгая политикаAppWidgetProviderInfo.resizeModeиminResizeWidth/Height. Если не задать минимальные размеры вxml/appwidget-provider, лаунчер не позволит растянуть виджет, а на некоторых прошивках он вообще не появится в списке доступных.
Работа с разрешениями и автозапуском
Главная причина «мертвых» виджетов на Huawei — агрессивное управление памятью PowerGenie. Даже если код идеален, система убьет процесс через 10-15 минут после сворачивания приложения. Решение — провести пользователя по настройкам при первом запуске.
Используйте интент Intent("com.huawei.powergenie.MANUAL_MANAGEMENT") или открывайте экран настроек напрямую: Settings.ACTION_APPLICATION_DETAILS_SETTINGS с packageName. В DevEco Studio для HarmonyOS есть API promptAction.showDialog с кнопкой перехода в «Управление запуском».
Для виджетов, требующих геолокацию (погода, трекеры), обязательно запрашивайте ACCESS_FINE_LOCATION в рантайме. На HarmonyOS используется requestPermissionsFromUser с массивом ['ohos.permission.LOCATION']. Без гранта виджет покажет заглушку или ошибку парсинга JSON.
Используйте библиотеку «AutoStartHelper» (GitHub) или готовый фрагмент кода для открытия меню автозапуска на EMUI/HarmonyOS. Это экономит часы поддержки пользователей, которые жалуются: «виджет не обновляется».
Главный вывод: без настройки «Ручного управления» в батарее и разрешения на фоновую активность любой виджет стороннего разработчика на Huawei станет бесполезным через 15 минут.
- ⚡ Добавьте в манифест
android:usesCleartextTraffic="true"если виджет тянет HTTP (не HTTPS) контент — иначе сеть блокируется - 🔔 Для мгновенных обновлений (мессенджеры, трекеры доставки) интегрируйте Push Kit — это единственный способ разбудить виджет без таймера
- 🎨 Тестируйте на «Умном виджете» (Smart Widget Stack) — ваш модуль должен корректно рендериться в компактном и расширенном виде
Типичные ошибки и их устранение
Самая частая ошибка новичка — виджет не появляется в списке после установки APK/HAP. Причина: отсутствие <action android:name="android.appwidget.action.APPWIDGET_UPDATE" /> в intent-filter провайдера (Android) или некорректный formEnabled: true в module.json5 (HarmonyOS). Пересоберите проект с Build > Clean Project.
Вторая проблема — «черный экран» или краш при добавлении. Проверьте logcat / hilog на ClassNotFoundException или ResourceNotFound. Часто виноваты обфусцированные имена классов в proguard-rules.pro — добавьте правило -keep class extends AppWidgetProvider или -keep class extends FormExtensionAbility.
Третий кейс — виджет есть, но не обновляется. Проверьте updatePeriodMillis (Android) или updateDuration (HarmonyOS). Значение 0 означает «только по пушу/ручному вызову». Если стоит 1800000 (30 мин), но обновлений нет — процесс убит системой, см. раздел про автозапуск выше.
Особенности версий EMUI и HarmonyOS
На EMUI 10-11 (Android 10-11) работают классические AppWidgetProvider и RemoteViews. Ограничение: нет поддержки сложных макетов (ConstraintLayout в RemoteViews появился только в API 31). На EMUI 12-14 (Android 12-14) доступен Glance (Jetpack) для Kotlin-разработчиков — декларативный UI, компилируемый в RemoteViews.
HarmonyOS 2.0 - 3.1 (Dual Frame) поддерживают оба подхода: JS FA (Feature Ability) виджеты и Java/JS виджеты. Но HarmonyOS 4.0+ / NEXT полностью перешли на ArkTS и ArkUI. Старый JS/JAVA код виджетов на NEXT не запустится — нужна миграция на @Entry компоненты и FormExtensionAbility.
Для кроссплатформенных фреймворков: Flutter не делает нативные виджеты напрямую (только через platform channels + нативный код). React Native — аналогично. Uni-app и Taro имеют плагины для генерации .wgt / .hap форм, но качество поддержки Huawei API варьируется.
Быстрая проверка совместимости запуска
Введите в наборе ##2846579## (Project Menu) → 1. Background Settings → 2. App Startup Management. Там виден реальный статус вашего пакета: «Allowed», «Restricted» или «Disabled». Полезно для отладки без гугления меню настроек.
FAQ: Частые вопросы по виджетам на Huawei
Почему виджет KWGT показывает «Loading...» или пустой экран?
Открыте приложение KWGT, дайте все разрешения (файлы, уведомления, поверх окон). В настройках батреи поставьте «Ручное управление» → Включите «Автозапуск», «Фоновая активность», «Запуск через прокси». Перезагрузите телефон.
Можно ли сделать виджет, который меняет системные настройки (Wi-Fi, Bluetooth)?
На Android 10+ (EMUI 10+) прямые переключения системных тумблеров через виджеты запрещены политикой безопасности. Используйте интенты Settings.ACTION_WIFI_SETTINGS — виджет откроет нужный экран настроек. На HarmonyOS NEXT доступен settingsAccess только для системных приложений с привилегированной подписью.
Как обновить виджет мгновенно по нажатию кнопки внутри него?
В PendingIntent (Android) или wantAgent (HarmonyOS) передайте экшен обновления. В провайдере перехватите этот экшен в onReceive / onFormEvent и вызовите updateAppWidget / updateFormData с новыми данными. Не забывайте про FLAG_IMMUTABLE на Android 12+.
Нужен ли аккаунт разработчика Huawei для тестирования виджетов на своем телефоне?
Для локальной отладки по USB/HDCC — нет, достаточно включить «Режим разработчика» и «Отладку по USB» в настройках телефона. Аккаунт в AppGallery Connect и сертификат .cer / .p12 нужны только для сборки Release-версии и публикации в магазине.
Как сделать виджет прозрачным или с размытием фона (frosted glass)?
В KWGT: слой «Фигура» → Тип «Прямоугольник» → Эффект «Размытие» (Blur) → Радиус 20-30. В нативной разработке (ArkTS): контейнер Column / Row → .backgroundBlurStyle(BlurStyle.BACKGROUND_THICK) + .backgroundColor('rgba(255,255,255,0.3)'). На Android RemoteViews — только сплошной цвет или битмап, размытие не поддерживается.