Gestire l'interazione utente

La funzionalità Riepilogo semplifica la gestione dell'interazione utente tramite le classi Action. Le classi Action di Glance definiscono le azioni che un utente può eseguire e puoi specificare l'operazione eseguita in risposta all'azione. Puoi applicare un Action a qualsiasi componente con il metodo GlanceModifier.clickable.

I widget delle app si trovano in un processo remoto, quindi le azioni sono definite al momento della creazione e l'esecuzione avviene nel processo remoto. Per la modalità nativa RemoteViews, questa operazione viene eseguita tramite PendingIntents.

In questa pagina sono descritte le seguenti azioni:

Avvia un'attività

Per avviare un'attività al momento dell'interazione dell'utente, fornisci la funzione actionStartActivity a un Button o a un altro componibile tramite il modificatore GlanceModifier.clickable(..).

Specifica uno dei seguenti valori in actionStartActivity:

Glance converte l'azione in un valore PendingIntent con il target e i parametri forniti. Nell'esempio seguente, NavigationActivity viene avviato quando un utente fa clic sul pulsante:

@Composable
fun MyContent() {
    // ..
    Button(
        text = "Go Home",
        onClick = actionStartActivity<MainActivity>()
    )
}

Avviare un servizio

Analogamente all'avvio di un'attività, avvia un servizio all'interazione dell'utente utilizzando uno dei metodi di actionStartService.

Specifica uno dei seguenti valori in actionStartService:

@Composable
fun MyButton() {
    // ..
    Button(
        text = "Sync",
        onClick = actionStartService<SyncService>(
            isForegroundService = true // define how the service is launched
        )
    )
}

Inviare un evento di trasmissione

Invia un evento di trasmissione su interazione utente utilizzando uno dei metodi actionSendBroadcast:

Specifica uno dei seguenti valori in actionSendBroadcast:

@Composable
fun MyButton() {
    // ..
    Button(
        text = "Send",
        onClick = actionSendBroadcast<MyReceiver>()
    )
}

Esegui azioni personalizzate

Anziché avviare un target specifico, Glance può utilizzare un'azione lambda o actionRunCallback per eseguire un'azione, ad esempio aggiornare l'interfaccia utente o lo stato al momento dell'interazione dell'utente.

Esegui azioni lambda

Puoi utilizzare le funzioni lambda come callback per le interazioni dell'interfaccia utente.

Ad esempio, passa la funzione lambda al modificatore GlanceModifier.clickable:

Text(
    text = "Submit",
    modifier = GlanceModifier.clickable {
        submitData()
    }
)

In alternativa, passalo al parametro onClick per i componibili che lo supportano:

Button(
    text = "Submit",
    onClick = {
        submitData()
    }
)

Esegui ActionCallback

In alternativa, utilizza i metodi actionRunCallback per eseguire un'azione sull'interazione dell'utente. A questo scopo, fornisci un'implementazione personalizzata di 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
    }
}

Al clic dell'utente, viene richiamato il metodo suspend onAction dell'elemento ActionCallback fornito, eseguendo la logica definita (ovvero richiedendo i dati di aggiornamento).

Per aggiornare il widget dopo l'esecuzione dell'azione, crea una nuova istanza e chiama update(..). Per ulteriori dettagli, consulta la sezione Gestire lo stato di 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)
    }
}

Fornire i parametri alle azioni

Per fornire ulteriori informazioni a un'azione, utilizza l'API ActionParameters per creare una coppia chiave-valore digitata. Ad esempio, per definire la destinazione su cui è stato fatto 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() }
    }
}

Al di sotto, i parametri sono inclusi nell'intent utilizzato per avviare l'attività, consentendo all'attività target di recuperarla.

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        val destination = intent.extras?.getString(KEY_DESTINATION) ?: return
        // ...
    }
}

I parametri vengono forniti anche a ActionCallback. Utilizza l'elemento Parameters.Key definito per recuperare il valore:

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