Glance simplifie la gestion des interactions utilisateur via les classes Action
. Les classes Action
de Glance définissent les actions qu'un utilisateur peut effectuer et vous pouvez spécifier l'opération effectuée en réponse à l'action. Vous pouvez appliquer un Action
à n'importe quel composant à l'aide de la méthode GlanceModifier.clickable
.
Les widgets d'application sont exécutés sur un processus à distance. Par conséquent, les actions sont définies au moment de la création et l'exécution a lieu dans le processus à distance. Dans le RemoteViews
natif, cette opération s'effectue via PendingIntents
.
Les actions suivantes sont décrites sur cette page:
Lancer une activité
Pour lancer une activité en cas d'interaction de l'utilisateur, fournissez la fonction actionStartActivity
à un Button
ou à un autre composable via le modificateur GlanceModifier.clickable
(..).
Indiquez l'un des éléments suivants dans actionStartActivity
:
- La classe d'activité cible
- Le
ComponentName
- Un intent
Glance traduit l'action en PendingIntent
avec la cible et les paramètres fournis. Dans l'exemple suivant, le NavigationActivity
est lancé lorsqu'un utilisateur clique sur le bouton:
@Composable fun MyContent() { // .. Button( text = "Go Home", onClick = actionStartActivity<MainActivity>() ) }
Lancer un service
Comme pour le lancement d'une activité, lancez un service lors d'une interaction de l'utilisateur à l'aide de l'une des méthodes actionStartService
.
Indiquez l'un des éléments suivants dans actionStartService
:
- La classe d'activité cible
- Le
ComponentName
- Un intent
@Composable fun MyButton() { // .. Button( text = "Sync", onClick = actionStartService<SyncService>( isForegroundService = true // define how the service is launched ) ) }
Envoyer un événement de diffusion
Envoyez un événement de diffusion lors d'une interaction de l'utilisateur à l'aide de l'une des méthodes actionSendBroadcast
:
Indiquez l'un des éléments suivants dans actionSendBroadcast
:
- Action sur les chaînes
- Le
ComponentName
- Un intent
- Classe
BroadcastReceiver
@Composable fun MyButton() { // .. Button( text = "Send", onClick = actionSendBroadcast<MyReceiver>() ) }
Effectuer des actions personnalisées
Au lieu de lancer une cible spécifique, Glance peut utiliser une action lambda ou un actionRunCallback
pour effectuer une action, comme mettre à jour l'UI ou l'état lors d'une interaction de l'utilisateur.
Exécuter des actions lambda
Vous pouvez utiliser des fonctions lambda comme rappels des interactions avec l'interface utilisateur.
Par exemple, transmettez la fonction lambda au modificateur GlanceModifier.clickable
:
Text( text = "Submit", modifier = GlanceModifier.clickable { submitData() } )
Vous pouvez également le transmettre au paramètre onClick
sur les composables compatibles:
Button( text = "Submit", onClick = { submitData() } )
Exécuter ActionCallback
Vous pouvez également utiliser les méthodes actionRunCallback
pour effectuer une action en cas d'interaction utilisateur. Pour ce faire, fournissez une implémentation personnalisée de 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 } }
Lors du clic de l'utilisateur, la méthode suspend onAction
du ActionCallback
fourni est appelée, ce qui exécute la logique définie (c'est-à-dire, la demande d'actualisation des données).
Pour mettre à jour le widget une fois l'action effectuée, créez une instance et appelez update
(..). Pour en savoir plus, consultez la section Gérer l'état de 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) } }
Fournir des paramètres aux actions
Pour fournir des informations supplémentaires sur une action, utilisez l'API ActionParameters
afin de créer une paire clé-valeur typée. Par exemple, pour définir la destination du clic:
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() } } }
En dessous, les paramètres sont inclus dans l'intent utilisé pour lancer l'activité, ce qui permet à l'activité cible de la récupérer.
override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) val destination = intent.extras?.getString(KEY_DESTINATION) ?: return // ... } }
Les paramètres sont également fournis au ActionCallback
. Récupérez la valeur à l'aide du Parameters.Key
défini:
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 // ... } }