Cómo controlar la interacción del usuario

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

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:

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:

@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:

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