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

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 укажите один из следующих параметров:

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