Обрабатывать взаимодействие с пользователем

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 :

@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
       
// ...
   
}
}