Glance упрощает обработку взаимодействия с пользователем с помощью классов Action . Классы Action в Glance определяют действия, которые может совершить пользователь, и вы можете указать операцию, выполняемую в ответ на это действие. Вы можете применить Action к любому компоненту с помощью метода GlanceModifier.clickable .
Виджеты приложения работают в удалённом процессе, поэтому действия определяются во время создания, а выполнение происходит в удалённом процессе. В нативных RemoteViews это делается с помощью PendingIntents .
На этой странице описаны следующие действия:
Запустить действие
Чтобы запустить активность при взаимодействии с пользователем, передайте функцию actionStartActivity Button или другому составному элементу, используя модификатор GlanceModifier.clickable .
В методе actionStartActivity укажите один из следующих вариантов:
- Целевой класс деятельности
-
ComponentName - Намерение
Glance преобразует действие в PendingIntent с указанным целевым объектом и параметрами. В следующем примере NavigationActivity запускается при нажатии пользователем кнопки:
@Composable fun MyContent() { // .. Button( text = "Go Home", onClick = actionStartActivity<MyActivity>() ) }
Запуск сервиса
Аналогично запуску активности, запуск службы при взаимодействии с пользователем осуществляется с помощью одного из методов actionStartService .
В actionStartService укажите один из следующих параметров:
- Целевой класс деятельности
-
ComponentName - Намерение
@Composable fun MyButton() { // .. Button( text = "Sync", onClick = actionStartService<SyncService>( isForegroundService = true // define how the service is launched ) ) }
Отправить событие трансляции
Отправьте широковещательное событие при взаимодействии с пользователем, используя один из методов actionSendBroadcast :
В методе actionSendBroadcast укажите один из следующих параметров:
- Действие струны
-
ComponentName - Намерение
- Класс
BroadcastReceiver
@Composable fun MyButton() { // .. Button( text = "Send", onClick = actionSendBroadcast<MyReceiver>() ) }
Выполняйте пользовательские действия
Вместо запуска конкретного целевого объекта Glance может использовать лямбда-действие или actionRunCallback для выполнения действия, например, обновления пользовательского интерфейса или состояния при взаимодействии с пользователем.
Выполнить действия лямбда
Вы можете использовать лямбда-функции в качестве обратных вызовов для взаимодействия с пользовательским интерфейсом.
Например, передайте лямбда-функцию модификатору GlanceModifier.clickable :
Text( text = "Submit", modifier = GlanceModifier.clickable { submitData() } )
Или передайте его параметру onClick в компонуемых объектах, которые его поддерживают:
Button( text = "Submit", onClick = { submitData() } )
Выполнить ActionCallback
В качестве альтернативы, используйте методы actionRunCallback для выполнения действия при взаимодействии с пользователем. Для этого предоставьте собственную реализацию ActionCallback :
@Composable private fun MyContent() { // .. Image( provider = ImageProvider(R.drawable.ic_hourglass_animated), modifier = GlanceModifier.clickable( onClick = actionRunCallback<RefreshAction>() ), contentDescription = "Refresh" ) } class RefreshAction : ActionCallback { override suspend fun onAction( context: Context, glanceId: GlanceId, parameters: ActionParameters ) { // TODO implement } }
При щелчке пользователя вызывается метод suspend onAction предоставленного объекта ActionCallback , выполняющий определенную логику (т.е., запрос на обновление данных).
Чтобы обновить виджет после выполнения действия, создайте новый экземпляр и вызовите update ()`. Дополнительные сведения см. в разделе «Управление состоянием GlanceAppWidget» .
class RefreshAction : ActionCallback { override suspend fun onAction( context: Context, glanceId: GlanceId, parameters: ActionParameters ) { // do some work but offset long-term tasks (e.g a Worker) MyAppWidget().update(context, glanceId) } }
Укажите параметры для действий
Для предоставления дополнительной информации к действию используйте API ActionParameters для создания типизированной пары ключ-значение. Например, чтобы определить место назначения, по которому был совершен клик:
private val destinationKey = ActionParameters.Key<String>( NavigationActivity.KEY_DESTINATION ) class MyAppWidget : GlanceAppWidget() { // .. @Composable private fun MyContent() { // .. Button( text = "Home", onClick = actionStartActivity<NavigationActivity>( actionParametersOf(destinationKey to "home") ) ) Button( text = "Work", onClick = actionStartActivity<NavigationActivity>( actionParametersOf(destinationKey to "work") ) ) } override suspend fun provideGlance(context: Context, id: GlanceId) { provideContent { MyContent() } } }
Внизу параметры включены в намерение, используемое для запуска активности, что позволяет целевой активности получить их.
override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) val destination = intent.extras?.getString(KEY_DESTINATION) ?: return // ... } }
Параметры также передаются в ActionCallback . Используйте определенный Parameters.Key для получения значения:
class RefreshAction : ActionCallback { private val destinationKey = ActionParameters.Key<String>( NavigationActivity.KEY_DESTINATION ) override suspend fun onAction( context: Context, glanceId: GlanceId, parameters: ActionParameters ) { val destination: String = parameters[destinationKey] ?: return // ... } }