Как обрабатывать действия пользователей

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:

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