Альфа-бібліотека Remote Compose дозволяє створювати інтерактивні ігрові віджети на Android
Public- 20 Oct, 2026

Розробники Android тепер можуть створювати високоінтерактивні ігрові віджети за допомогою нової альфа-бібліотеки Remote Compose. Хоча Jetpack Glance залишається стандартом для більшості реалізацій віджетів завдяки зворотної сумісності та інструментам, він спирається на застарілу систему RemoteViews. Ця система має серйозні обмеження: неможливість використовувати математичні вирази для безперервних анімацій та строгий системний контроль над розміром і частотою оновлень. Remote Compose заповнює ці прогалини, надаючи гнучку основу для створення анімацій та складних взаємодій, які раніше були неможливі або вимагали непідтримуваних хаків в екосистемі RemoteViews.
Архітектура Remote Compose розділяє визначення інтерфейсу та його виконання. Ваша застосунок виконує декларативний код, анотований @RemoteComposable, щоб серіалізувати макети та вирази анімацій у компактний двійковий формат, відомий як Remote Document. Цей документ надсилається в хост-процес, наприклад, у лаунчер головного екрана. Всередині хоста плеєр Remote Compose локально обробляє всі взаємодії, зміну розміру, зміни станів та анімації. Цей підхід аналогічний роботі веб-браузера, який рендерить HTML-документ. Оскільки плеєр керує оновленнями незалежно у власному процесі, основній застосунку не потрібно залишатися активним. Цей механізм різко скорочує кількість циклів міжпроцесного спілкування (IPC), що призводить до менших затримок та зниження споживання батареї порівняно з традиційними віджетами RemoteViews, де застосунку доводиться надсилати оновлення інтерфейсу.
Для впровадження цієї технології розробникам необхідно додати до проєкту певні залежності, зокрема remote-core, remote-creation та remote-creation-compose з групи androidx.compose.remote, поточна версія - 1.0.0-alpha21. Клас віджета має успадковуватися від RemoteComposeWidget, який розширює AppWidgetProvider. Розробники визначають інтерфейс за допомогою Remote Composables, таких як RemoteBox, RemoteColumn, RemoteRow та RemoteText. Метод onUpdate компілює макет у серіалізований Remote Document і надсилає його в лаунчер через updateRemoteView. Хоча Remote Compose використовує вантаж RemoteViews як транспортний механізм, розробники не взаємодіють із цим транспортним шаром безпосередньо. Система реєструє віджет через стандартну конфігурацію приймача в AndroidManifest.xml із фільтром намірів APPWIDGET_UPDATE.
Керування станом у Remote Compose пропонує два різні підходи: локальний стан хоста та збереження на боці застосунку. Локальний стан хоста перебуває всередині Remote Document на пристрої хоста, що робить його придатним для тимчасових даних сесії, таких як рахунок у грі, який може скидатися при випуску нового документа або перезапуску лаунчера. Збереження на боці застосунку потрібне для стану, який має переживати оновлення документів і перезапуски лаунчера, наприклад, інвентар користувача або прогрес. Оскільки Android не повідомляє застосунку про фоновий перезапуск лаунчера, а натомість відтворює останній кешований документ, критично важливі дані мають зберігатися в сховищі застосунку. Наприклад, віджет віртуального улюбленця може ділити валюту монет із застосунком-магазином, тоді як гра в жанрі сайд-скролер зберігає свій рахунок повністю всередині Remote Document.
Головна сила Remote Compose полягає в графах виразів із динамічними посиланнями. Ці графи - математичні формули, представлені у вигляді пов'язаних вузлів, де деякі вузли містять змінні, названі динамічними посиланнями. Гравець хоста безпосередньо оновлює ці посилання, що дозволяє інтерфейсу віджета оновлюватися на кожному кадрі пристрою без пробудження процесу застосунку. Розробники створюють ці графи опосередковано через код. Наприклад, лічильник натискань можна реалізувати за допомогою MutableRemoteInt і функцій valueChange. Коли користувач натискає на віджет, хост локально оновлює динамічне посилання. Цей механізм забезпечує ефективну роботу навіть складних покадрових анімацій на пристрої хоста, зберігаючи процес застосунку в призупиненому стані та економлячи системні ресурси.