Gestisci e aggiorna GlanceAppWidget

Le sezioni seguenti descrivono come aggiornare GlanceAppWidget e gestirne lo stato.

Gestisci lo stato di GlanceAppWidget

La classe GlanceAppWidget fornita viene istanziata ogni volta che il widget viene creato o richiede un aggiornamento, pertanto deve essere stateless e passiva.

Il concetto di stato può essere suddiviso come segue:

  • Stato dell'applicazione: lo stato o i contenuti dell'app richiesti dal widget. Ad esempio, un elenco di destinazioni memorizzate (ovvero un database) definite dall'utente.
  • Stato di Glance: lo stato specifico che è pertinente solo per il widget dell'app e non modifica o influisce necessariamente sullo stato dell'app. Ad esempio, è stata selezionata una casella di controllo nel widget o è stato incrementato un contatore.

Utilizza lo stato dell'applicazione

I widget delle app devono essere passivi. Ogni applicazione è responsabile della gestione del livello dati e della gestione degli stati, come inattivo, in caricamento ed errore, riflessi nell'interfaccia utente del widget.

Ad esempio, il codice seguente recupera le destinazioni dalla memoria cache dal livello del repository, fornisce l'elenco memorizzato delle destinazioni e visualizza una UI diversa a seconda dello stato:

class DestinationAppWidget : GlanceAppWidget() {

    // ...

    @Composable
    fun MyContent() {
        val repository = remember { DestinationsRepository.getInstance() }
        // Retrieve the cache data everytime the content is refreshed
        val destinations by repository.destinations.collectAsState(State.Loading)

        when (destinations) {
            is State.Loading -> {
                // show loading content
            }

            is State.Error -> {
                // show widget error content
            }

            is State.Completed -> {
                // show the list of destinations
            }
        }
    }
}

Ogni volta che lo stato o i dati cambiano, è responsabilità dell'app inviare una notifica e aggiornare il widget. Per saperne di più, consulta Aggiorna GlanceAppWidget.

Aggiorna GlanceAppWidget

Puoi richiedere di aggiornare i contenuti del widget utilizzando GlanceAppWidget. Come spiegato nella sezione Gestisci lo stato di GlanceAppWidget, i widget dell'app sono ospitati in un processo diverso. Glance traduce i contenuti in RemoteViews effettivi e li invia all'host. Per aggiornare i contenuti, Glance deve ricreare i RemoteViews e inviarli di nuovo.

Per inviare l'aggiornamento, chiama il metodo update dell'istanza GlanceAppWidget, fornendo context e glanceId:

MyAppWidget().update(context, glanceId)

Per ottenere glanceId, esegui una query su GlanceAppWidgetManager:

val manager = GlanceAppWidgetManager(context)
val widget = GlanceSizeModeWidget()
val glanceIds = manager.getGlanceIds(widget.javaClass)
glanceIds.forEach { glanceId ->
    widget.update(context, glanceId)
}

In alternativa, utilizza una delle estensioni GlanceAppWidget update:

// Updates all placed instances of MyAppWidget
MyAppWidget().updateAll(context)

// Iterate over all placed instances of MyAppWidget and update if the state of
// the instance matches the given predicate
MyAppWidget().updateIf<State>(context) { state ->
    state == State.Completed
}

Questi metodi possono essere chiamati da qualsiasi parte dell'applicazione. Poiché si tratta di funzioni suspend, ti consigliamo di avviarle al di fuori dell'ambito del thread principale. Nell'esempio seguente, vengono avviati in un CoroutineWorker:

class DataSyncWorker(
    val context: Context,
    val params: WorkerParameters,
) : CoroutineWorker(context, params) {

    override suspend fun doWork(): Result {
        // Fetch data or do some work and then update all instance of your widget
        MyAppWidget().updateAll(context)
        return Result.success()
    }
}

Per maggiori dettagli sulle coroutine, consulta Coroutine Kotlin su Android.

Quando aggiornare i widget

Aggiorna i widget immediatamente o periodicamente.

Il widget può aggiornarsi immediatamente quando l'app è attiva. Ad esempio:

  • Quando un utente interagisce con un widget, attivando un'azione, una chiamata lambda o un intent per avviare un'attività.
  • Quando l'utente interagisce con l'app in primo piano o mentre l'app è già in fase di aggiornamento in risposta a un messaggio o a una trasmissione di Firebase Cloud Messaging (FCM).

In questi casi, chiama il metodo update come descritto in questa guida.

Il widget può aggiornarsi periodicamente quando l'app non è attiva. Ad esempio:

  • Utilizza updatePeriodMillis per aggiornare il widget fino a una volta ogni 30 minuti.
  • Utilizza WorkManager per pianificare aggiornamenti più frequenti, ad esempio ogni 15 minuti.
  • Aggiornare il widget in risposta a una trasmissione.

Risorse