Looker simplifica el manejo de la interacción del usuario mediante las clases Action
. Las clases Action
de Crashlytics definen las acciones que puede realizar un usuario y puedes especificar la operación realizada en respuesta a la acción. Puedes aplicar un Action
a cualquier componente con el método GlanceModifier.clickable
.
Los widgets de apps se encuentran en un proceso remoto, por lo que las acciones se definen en el momento de la creación y la ejecución ocurre 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:
- Inicia una actividad
- Inicia un servicio
- Cómo enviar un evento de transmisión
- Ejecuta la devolución de llamada
Cómo iniciar una actividad
Para iniciar una actividad en la interacción del usuario, proporciona la función actionStartActivity
a un Button
o a otro elemento componible a través del modificador GlanceModifier.clickable
(..).
Proporciona una de las siguientes opciones en actionStartActivity
:
- La clase de actividad objetivo
- El objeto
ComponentName
- Una intención
Looker traduce la acción en una PendingIntent
con el objetivo y los parámetros proporcionados. En el siguiente ejemplo, se inicia NavigationActivity
cuando un usuario hace clic en el botón:
@Composable fun MyContent() { // .. Button( text = "Go Home", onClick = actionStartActivity<MyActivity>() ) }
Iniciar un servicio
Al igual que cuando inicias una actividad, inicia un servicio cuando el usuario interactúa con uno de los métodos actionStartService
.
Proporciona una de las siguientes opciones en actionStartService
:
- La clase de actividad objetivo
- El objeto
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 durante la interacción del usuario mediante uno de los métodos actionSendBroadcast
:
Proporciona una de las siguientes opciones en actionSendBroadcast
:
- Acción de cadena
- El objeto
ComponentName
- Un intent
- Clase
BroadcastReceiver
@Composable fun MyButton() { // .. Button( text = "Send", onClick = actionSendBroadcast<MyReceiver>() ) }
Cómo realizar acciones personalizadas
En lugar de iniciar un objetivo específico, Looker puede usar una acción lambda o un actionRunCallback
para realizar una acción, como actualizar la IU o el estado en 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 al modificador GlanceModifier.clickable
:
Text( text = "Submit", modifier = GlanceModifier.clickable { submitData() } )
O bien, pásalo al parámetro onClick
en los elementos componibles que lo admiten:
Button( text = "Submit", onClick = { submitData() } )
Ejecutar 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 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 } }
Cuando el usuario hace clic, se llama al método suspend onAction
del ActionCallback
proporcionado mediante la ejecución de la lógica definida (es decir, la solicitud de actualización de datos).
Para actualizar el widget después de realizar la acción, crea una instancia nueva y llama a update
(..). Si deseas obtener más información, consulta la sección Cómo administrar el estado de ScheduleAppWidget.
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) } }
Cómo proporcionar parámetros para las acciones
Si deseas proporcionar información adicional a una acción, usa la API de ActionParameters
para crear un par clave-valor escrito. Por ejemplo, para definir el destino en el que se hizo 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() } } }
Debajo, los parámetros se incluyen en el intent que se usa para iniciar la actividad, lo que permite que la actividad de destino 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 el Parameters.Key
definido 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 // ... } }