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