O Resumo simplifica o processamento da interação do usuário usando as classes Action. As classes
Action do Resumo 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 um Action a qualquer
componente com o método GlanceModifier.clickable.
Os widgets de apps ficam em um processo remoto, então 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 seguintes ações são descritas nesta página:
Iniciar uma atividade
Para iniciar uma atividade na 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 opções em actionStartActivity:
- A classe de atividade de destino
- A
ComponentName - Uma intent
O Resumo traduz a ação em uma 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
Assim como ao iniciar uma atividade, inicie um serviço na interação do usuário usando um
dos métodos actionStartService.
Forneça uma das seguintes opções em actionStartService:
- A classe de atividade de destino
- A
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 opções em actionSendBroadcast:
- Ação de string
- A
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 Resumo 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
É possível usar funções lambda como callbacks para as interações da interface.
Por exemplo, transmita a função lambda para o modificador GlanceModifier.clickable:
Text( text = "Submit", modifier = GlanceModifier.clickable { submitData() } )
Ou transmita-o para o parâmetro onClick em elementos combináveis que oferecem suporte a ele:
Button( text = "Submit", onClick = { submitData() } )
Executar ActionCallback
Como alternativa, use os métodos actionRunCallback para realizar uma ação 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 } }
Quando o usuário clica, o método suspend onAction do ActionCallback fornecido é chamado, executando a lógica definida (ou seja, solicitando a atualização de dados).
Para atualizar o widget depois que a ação for realizada, crie uma nova instância e
chame update(..). Para mais detalhes, 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() } } }
Por baixo, os parâmetros são incluídos na intent usada para iniciar a atividade, permitindo que a atividade de destino os 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 para o 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 // ... } }