Spec-Zone.ru › Kotlin 2

Системный трей и уведомления

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

Примеры в этом руководстве — работающие приложения для настольных компьютеров. Чтобы попробовать один из них:

  1. Создайте проект Compose Multiplatform с помощью плагина Kotlin Multiplatform для IDE или онлайн-мастера.

  2. Откройте файл точки входа приложения для настольных компьютеров. Например, desktopApp/src/main/kotlin/com/example/my_desktop_app/main.kt.

  3. Замените его содержимое приведённым примером.

Системный трей

Используйте компонуемую функцию Tray(), чтобы добавить значок приложения в системный трей. Tray() доступна в области видимости функции application(), поэтому её можно вызвать рядом с окнами приложения или отдельно.

У компонуемой функции Tray() есть следующие параметры:

  • icon — Painter, которая рисует значок в трее.

  • menu — содержимое меню трея. В Windows меню открывается щелчком правой кнопкой мыши, а в macOS — щелчком левой кнопкой мыши. Если не добавить ни одного пункта, меню не появится.

  • state — TrayState, используемая для отправки уведомлений.

  • tooltip — подсказка, отображаемая при наведении указателя на значок.

  • onAction — действие, выполняемое при нажатии на значок: двойной щелчок в Windows и щелчок правой кнопкой мыши в macOS.

В следующем примере создаётся значок приложения в трее с тремя пунктами меню:

  • Увеличить значение изменяет состояние, отображаемое в окне.

  • Отправить уведомление отправляет системное уведомление.

  • Выйти закрывает приложение.

import androidx.compose.foundation.layout.Box import androidx.compose.foundation.layout.fillMaxSize import androidx.compose.material.Text import androidx.compose.runtime.getValue import androidx.compose.runtime.mutableStateOf import androidx.compose.runtime.remember import androidx.compose.runtime.setValue import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.ui.geometry.Offset import androidx.compose.ui.geometry.Size import androidx.compose.ui.graphics.Color import androidx.compose.ui.graphics.drawscope.DrawScope import androidx.compose.ui.graphics.painter.Painter import androidx.compose.ui.window.Tray import androidx.compose.ui.window.Window import androidx.compose.ui.window.application import androidx.compose.ui.window.rememberNotification import androidx.compose.ui.window.rememberTrayState fun main() = application { var count by remember { mutableStateOf(0) } var isOpen by remember { mutableStateOf(true) } if (isOpen) { val trayState = rememberTrayState() val notification = rememberNotification("Notification", "Message from MyApp!") Tray( state = trayState, icon = TrayIcon, menu = { Item( "Increment value", onClick = { count++ } ) Item( "Send notification", onClick = { trayState.sendNotification(notification) } ) Item( "Exit", onClick = { isOpen = false } ) } ) Window( onCloseRequest = { isOpen = false }, icon = MyAppIcon ) { // Window content: Box( modifier = Modifier.fillMaxSize(), contentAlignment = Alignment.Center ) { Text(text = "Value: $count") } } } } object MyAppIcon : Painter() { override val intrinsicSize = Size(256f, 256f) override fun DrawScope.onDraw() { drawOval(Color.Green, Offset(size.width / 4, 0f), Size(size.width / 2f, size.height)) drawOval(Color.Blue, Offset(0f, size.height / 4), Size(size.width, size.height / 2f)) drawOval(Color.Red, Offset(size.width / 4, size.height / 4), Size(size.width / 2f, size.height / 2f)) } } object TrayIcon : Painter() { override val intrinsicSize = Size(256f, 256f) override fun DrawScope.onDraw() { drawOval(Color(0xFFFFA500)) } }
Tray menu and notification

Не во всех средах рабочего стола есть системный трей. Если платформа его не поддерживает, Tray() выводит ошибку в стандартный поток ошибок, а не выбрасывает исключение. Прежде чем показывать в приложении параметры, связанные с треем, проверьте свойство isTraySupported.

Трей без окна

Приложению не обязательно иметь окно, чтобы отображать значок в трее. Если вызвать только функцию Tray(), приложение будет работать исключительно в системном трее:

import androidx.compose.ui.geometry.Size import androidx.compose.ui.graphics.Color import androidx.compose.ui.graphics.drawscope.DrawScope import androidx.compose.ui.graphics.painter.Painter import androidx.compose.ui.window.Tray import androidx.compose.ui.window.application fun main() = application { Tray( icon = TrayIcon, menu = { Item( "Exit", onClick = ::exitApplication ) } ) } object TrayIcon : Painter() { override val intrinsicSize = Size(256f, 256f) override fun DrawScope.onDraw() { drawOval(Color(0xFFFFA500)) } }

Поскольку закрывать окно не нужно, функцию exitApplication() следует вызвать из пункта меню.

Уведомления

Чтобы отправить системное уведомление, создайте его с помощью rememberNotification() и передайте в TrayState.sendNotification(), как это сделано в примере с системным треем. Уведомления отправляются через TrayState, переданное компонуемой функции Tray(). Если состояние не связано с треем, уведомление теряется.

Уведомление состоит из заголовка, сообщения и типа, который определяет значок и звук уведомления. Доступны следующие типы: None (по умолчанию), Info, Warning и Error.

Конкретные ресурсы значка и звука зависят от платформы.

Чтобы проверить уведомления в macOS, приложение необходимо упаковать. В противном случае уведомления не будут отображаться.

Что дальше

  • Узнайте, как добавить строку меню в окно.

  • Изучите руководства по другим компонентам для настольных компьютеров.

18 августа 2026 г.
Контекстные менюСтрока меню

© 2010–2026 JetBrains s.r.o. and Kotlin Programming Language contributors
Licensed under the Apache License, Version 2.0.
https://kotlinlang.org/docs/multiplatform/compose-desktop-tray.html

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API