O Glance simplifica o gerenciamento da interação do usuário usando as classes Action
As classes Action
do Glance definem as ações que um usuário pode realizar, e você pode especificar a
operação realizada em resposta à ação. É possível aplicar uma Action
a qualquer
componente usando o método GlanceModifier.clickable
.
Os widgets de apps residem em um processo remoto. Portanto, as ações são definidas no momento da
criação, e a execução acontece no processo remoto. No RemoteViews
nativo,
isso é feito usando PendingIntents
.
As ações a seguir estão descritas nesta página:
Iniciar uma atividade
Para iniciar uma atividade após a interação do usuário, forneça a função
actionStartActivity
a um Button
ou outro elemento combinável usando o
modificador GlanceModifier.clickable
(..).
Forneça uma das seguintes informações em actionStartActivity
:
- A classe de atividade de destino
- O
ComponentName
- Uma intent
O Glance converte a ação em um PendingIntent
com o destino e os
parâmetros fornecidos. No exemplo a seguir, o NavigationActivity
é iniciado quando um
usuário clica no botão:
@Composable fun MyContent() { // .. Button( text = "Go Home", onClick = actionStartActivity<MyActivity>() ) }
Iniciar um serviço
De forma semelhante ao lançamento de uma atividade, iniciar um serviço na interação do usuário usando um
dos métodos actionStartService
.
Forneça uma das seguintes informações em actionStartService
:
- A classe de atividade de destino
- O
ComponentName
- Uma intent
@Composable fun MyButton() { // .. Button( text = "Sync", onClick = actionStartService<SyncService>( isForegroundService = true // define how the service is launched ) ) }
Enviar um evento de transmissão
Envie um evento de transmissão na interação do usuário usando um dos
métodos actionSendBroadcast
:
Forneça uma das seguintes informações em actionSendBroadcast
:
- Ação de string
- O
ComponentName
- Uma intent
- Classe
BroadcastReceiver
@Composable fun MyButton() { // .. Button( text = "Send", onClick = actionSendBroadcast<MyReceiver>() ) }
Realizar ações personalizadas
Em vez de iniciar um destino específico, o Glance pode usar uma ação lambda ou um
actionRunCallback
para realizar uma ação, como atualizar a interface ou o estado na
interação do usuário.
Executar ações lambda
Você pode usar funções lambda como callbacks para as interações da interface.
Por exemplo, transmita a função lambda ao modificador
GlanceModifier.clickable
:
Text( text = "Submit", modifier = GlanceModifier.clickable { submitData() } )
Ou transmita-o para o parâmetro onClick
em elementos combináveis que têm suporte a ele:
Button( text = "Submit", onClick = { submitData() } )
Executar ActionCallback
Se preferir, use os métodos actionRunCallback
para realizar uma ação com base na interação do usuário. Para fazer isso, forneça uma implementação personalizada do
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 } }
No clique do usuário, o método suspend onAction
do
ActionCallback
fornecido é chamado, executando a lógica definida (ou seja, solicitando
dados de atualização).
Para atualizar o widget depois que a ação for realizada, crie uma nova instância e
chame update
(..). Para saber mais, consulte a seção Gerenciar o estado do
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) } }
Fornecer parâmetros para ações
Para fornecer mais informações a uma ação, use a API ActionParameters
para criar um par de chave-valor tipado. Por exemplo, para definir o destino clicado:
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() } } }
Abaixo, os parâmetros são incluídos na intent usada para iniciar a atividade, permitindo que a atividade de destino a recupere.
override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) val destination = intent.extras?.getString(KEY_DESTINATION) ?: return // ... } }
Os parâmetros também são fornecidos ao ActionCallback
. Use o Parameters.Key
definido para recuperar o valor:
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 // ... } }