Glance упрощает обработку взаимодействия с пользователем с помощью классов Action. Классы Action Glance определяют действия, которые может выполнять пользователь, и вы можете указать операцию, выполняемую в ответ на действие. Вы можете применить Action к любому компоненту с помощью метода GlanceModifier.clickable.
Виджеты приложений работают в удаленном процессе, поэтому действия определяются во время создания, а выполнение происходит в удаленном процессе. В нативном RemoteViews это делается с помощью PendingIntents.
На этой странице описаны следующие действия:
Как запустить занятие
Чтобы запустить действие при взаимодействии с пользователем, передайте функцию actionStartActivity в Button или другую composable-функцию с помощью модификатора 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 для выполнения действия, например обновления пользовательского интерфейса или состояния при взаимодействии с пользователем.
Выполнение действий Lambda
Вы можете использовать лямбда-функции в качестве обратных вызовов для взаимодействий с интерфейсом.
Например, передайте лямбда-функцию в модификатор GlanceModifier.clickable:
Text( text = "Submit", modifier = GlanceModifier.clickable { submitData() } )
или передать его в параметр onClick в поддерживаемых composable-функциях:
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() } } }
Параметры включаются в интент, используемый для запуска Activity, что позволяет целевому Activity получить их.
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 // ... } }