Vistazo simplifica el manejo de la interacción del usuario a través de las clases Action. Vistazo
Las clases Action definen las acciones que un usuario puede realizar y puedes especificar
una operación realizada en respuesta a la acción. Puedes aplicar un Action a cualquier
con el método GlanceModifier.clickable.
Los widgets de apps se alojan en un proceso remoto, por lo que las acciones se definen en el momento de la creación
y la ejecución tiene lugar en el proceso remoto. En el RemoteViews nativo,
esto se hace a través de PendingIntents.
En esta página, se describen las siguientes acciones:
- Cómo iniciar una actividad
- Iniciar un servicio
- Cómo enviar una transmisión de evento
- Cómo ejecutar la devolución de llamada
Cómo iniciar una actividad
Para iniciar una actividad relacionada con la interacción del usuario, proporciona la
función actionStartActivity a un elemento Button o a otro elemento componible mediante el
Modificador GlanceModifier.clickable(..).
Proporciona una de las siguientes opciones en actionStartActivity:
- La clase de actividad objetivo
- La
ComponentName - Un intent
Glance traduce la acción en un elemento PendingIntent con el objetivo proporcionado y
parámetros. En el siguiente ejemplo, se inicia NavigationActivity cuando un elemento
el usuario hace clic en el botón:
@Composable fun MyContent() { // .. Button( text = "Go Home", onClick = actionStartActivity<MyActivity>() ) }
Iniciar un servicio
Al igual que cuando se inicia una actividad, se inicia un servicio con la interacción del usuario mediante uno
de los métodos actionStartService.
Proporciona una de las siguientes opciones en actionStartService:
- La clase de actividad objetivo
- La
ComponentName - Un intent
@Composable fun MyButton() { // .. Button( text = "Sync", onClick = actionStartService<SyncService>( isForegroundService = true // define how the service is launched ) ) }
Enviar un evento de transmisión
Envía un evento de transmisión sobre la interacción del usuario mediante uno de los
Métodos actionSendBroadcast:
Proporciona una de las siguientes opciones en actionSendBroadcast:
- Acción de la cadena
- La
ComponentName - Un intent
- Clase
BroadcastReceiver
@Composable fun MyButton() { // .. Button( text = "Send", onClick = actionSendBroadcast<MyReceiver>() ) }
Cómo realizar acciones personalizadas
En lugar de lanzar un objetivo específico, Glance puede usar una acción lambda o una
actionRunCallback para realizar una acción, como actualizar la IU o el estado de
la interacción del usuario.
Cómo ejecutar acciones lambda
Puedes usar funciones lambda como devoluciones de llamada a las interacciones de la IU.
Por ejemplo, pasa la función lambda a GlanceModifier.clickable.
modificador:
Text( text = "Submit", modifier = GlanceModifier.clickable { submitData() } )
También puedes pasarlo al parámetro onClick en los elementos componibles que lo admiten:
Button( text = "Submit", onClick = { submitData() } )
Ejecuta ActionCallback
Como alternativa, usa los métodos actionRunCallback para realizar una acción en
la interacción del usuario. Para ello, proporciona una implementación personalizada del
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 } }
Cuando el usuario haga clic, el método suspend onAction de la
Se llama a ActionCallback y se ejecuta la lógica definida (es decir, solicitando
actualizar los datos).
Para actualizar el widget después de que se realice la acción, crea una nueva instancia y
llama a update(..). Para conocer más detalles, consulta el artículo Cómo administrar el estado de GlanceAppWidget
sección.
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) } }
Proporciona parámetros para las acciones
Para proporcionar información adicional a una acción, utiliza la ActionParameters.
para crear un par clave-valor escrito. Por ejemplo, para definir el clic
destino:
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() } } }
Debajo, los parámetros se incluyen en el intent que se usa para iniciar el actividad, lo que permite que la actividad objetivo la recupere.
override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) val destination = intent.extras?.getString(KEY_DESTINATION) ?: return // ... } }
Los parámetros también se proporcionan a ActionCallback. Usa los atributos
Parameters.Key para recuperar el 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 // ... } }