Glance упрощает обработку взаимодействия с пользователем через классы Action
. Классы Action
Glance определяют действия, которые может выполнять пользователь, и вы можете указать операцию, выполняемую в ответ на это действие. Вы можете применить Action
к любому компоненту с помощью метода GlanceModifier.clickable
.
Виджеты приложений находятся в удаленном процессе, поэтому действия определяются во время создания, а выполнение происходит в удаленном процессе. В родных RemoteViews
это делается через PendingIntents
.
На этой странице описаны следующие действия:
Запустить мероприятие
Чтобы запустить действие при взаимодействии с пользователем, предоставьте функцию actionStartActivity
для Button
или другого компонуемого объекта с помощью модификатора GlanceModifier.clickable
(..).
Укажите одно из следующих значений в actionStartActivity
:
- Целевой класс активности
-
ComponentName
- Намерение
Glance преобразует Action в 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
// ...
}
}