Gerenciar e atualizar o GlanceAppWidget

As seções a seguir descrevem como atualizar GlanceAppWidget e gerenciar o estado dele.

Gerenciar o estado do GlanceAppWidget

A classe GlanceAppWidget fornecida é instanciada sempre que o widget é criado ou requer uma atualização. Portanto, ela precisa ser sem estado e passiva.

O conceito de estado pode ser dividido da seguinte forma:

  • Estado do aplicativo: o estado ou conteúdo do app exigido pelo widget. Por exemplo, uma lista de destinos armazenados (ou seja, um banco de dados) definida pelo usuário.
  • Estado de visualização rápida: o estado específico que é relevante apenas para o widget do app e não modifica nem afeta necessariamente o estado do app. Por exemplo, uma caixa de seleção foi marcada no widget ou um contador foi incrementado.

Usar o estado do aplicativo

Os widgets de apps precisam ser passivos. Cada aplicativo é responsável por gerenciar a camada de dados e processar os estados, como inativo, carregando e erro, que refletem na interface do widget.

Por exemplo, o código a seguir recupera os destinos do cache na memória da camada do repositório, fornece a lista armazenada de destinos e mostra uma interface diferente dependendo do estado:

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

Sempre que o estado ou os dados mudam, é responsabilidade do app notificar e atualizar o widget. Consulte Update GlanceAppWidget para mais informações.

Atualize o GlanceAppWidget.

Você pode pedir a atualização do conteúdo do widget usando GlanceAppWidget. Conforme explicado na seção Gerenciar o estado GlanceAppWidget, os widgets de apps são hospedados em um processo diferente. O Glance traduz o conteúdo em RemoteViews reais e os envia ao host. Para atualizar o conteúdo, o Glance precisa recriar os RemoteViews e enviá-los novamente.

Para enviar a atualização, chame o método update da instância GlanceAppWidget, fornecendo o context e o glanceId:

MyAppWidget().update(context, glanceId)

Para receber o glanceId, consulte o GlanceAppWidgetManager:

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

Como alternativa, use uma das extensões 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
}

Esses métodos podem ser chamados de qualquer parte do aplicativo. Como são funções suspend, recomendamos iniciá-las fora do escopo da linha de execução principal. No exemplo a seguir, eles são iniciados em um 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()
    }
}

Consulte Corrotinas do Kotlin no Android para mais detalhes sobre corrotinas.

Quando atualizar widgets

Atualize os widgets imediatamente ou periodicamente.

O widget pode ser atualizado imediatamente quando o app está ativo. Exemplo:

  • Quando um usuário interage com um widget, acionando uma ação, uma chamada lambda ou uma intent para iniciar uma atividade.
  • Quando o usuário interage com o app em primeiro plano ou enquanto ele já está sendo atualizado em resposta a uma mensagem do Firebase Cloud Messaging (FCM) ou uma transmissão.

Nesses casos, chame o método update conforme descrito neste guia.

O widget pode ser atualizado periodicamente quando o app não está ativo. Exemplo:

  • Use updatePeriodMillis para atualizar o widget até uma vez a cada 30 minutos.
  • Use WorkManager para programar atualizações mais frequentes, como a cada 15 minutos.
  • Atualizar o widget em resposta a uma transmissão.

Recursos