Crea un host widget

La schermata Home di Android, disponibile sulla maggior parte dei dispositivi Android, consente widget di app (o widget) incorporati dall'utente per rapido accesso ai contenuti. Se stai creando un'app simile o un'app che sostituisce la schermata Home, puoi anche consentire all'utente di incorporare i widget implementando AppWidgetHost. Non è necessario per la maggior parte delle app, ma se stai creando il tuo host, è importante comprendere le obbligazioni contrattuali che un host accetta implicitamente.

Questa pagina si concentra sulle responsabilità derivanti dall'implementazione di una AppWidgetHost. Per un esempio specifico di come implementare un'AppWidgetHost, guarda il codice sorgente della schermata Home di Android LauncherAppWidgetHost

Di seguito è riportata una panoramica delle classi e dei concetti principali coinvolti nell'implementazione di un AppWidgetHost personalizzato:

  • Host di widget dell'app: AppWidgetHost fornisce l'interazione con il servizio AppWidget per le app che incorporano widget nella loro UI. Un AppWidgetHost deve avere un ID univoco all'interno del pacchetto dell'host. Questo ID persiste in tutti gli utilizzi dell'host. L'ID è in genere un valore hardcoded che assegni nell'app.

  • ID widget dell'app: a ogni istanza di widget viene assegnato un ID univoco al momento della convalida. Consulta bindAppWidgetIdIfAllowed() e, per ulteriori dettagli, la sezione Eseguire il binding dei widget che segue. L'attività dell'host ottiene l'ID univoco utilizzando allocateAppWidgetId(). Questo ID persiste per tutta la durata del widget finché non viene eliminato dal widget. . Qualsiasi stato specifico dell'host, ad esempio le dimensioni e la posizione deve essere mantenuto dal pacchetto di hosting e associato al dell'ID widget dell'app.

  • Visualizzazione dell'host del widget dell'app: considera AppWidgetHostView come un riquadro in cui viene inserito il widget ogni volta che deve essere visualizzato. Un widget è associata a un valore AppWidgetHostView ogni volta che il widget viene aumentato in modo artificioso .

    • Per impostazione predefinita, il sistema crea un AppWidgetHostView, ma l'host può crea la propria sottoclasse di AppWidgetHostView estendendola.
    • A partire da Android 12 (livello API 31), AppWidgetHostView introduce i metodi setColorResources() e resetColorResources() per gestire i colori sovraccaricati dinamicamente. L'organizzatore è responsabile di fornire i colori a questi metodi.
  • Gruppo di opzioni: AppWidgetHost utilizza il pacchetto di opzioni per comunicare informazioni AppWidgetProvider su come viene visualizzato il widget, ad esempio elenco di intervalli di dimensioni e se il si trovi in una schermata di blocco o nella schermata Home. Queste informazioni consentono al AppWidgetProvider di personalizzare i contenuti e l'aspetto del widget in base a come e dove viene visualizzato. Puoi utilizzare la modalità updateAppWidgetOptions() e updateAppWidgetSize() per modificare il bundle di un widget. Entrambi i metodi attivano onAppWidgetOptionsChanged() il callback al AppWidgetProvider.

Widget di associazione

Quando un utente aggiunge un widget a un host, si verifica un processo chiamato associazione. Associazione si riferisce all'associazione di un particolare ID widget dell'app a un host specifico e a un specifico per AppWidgetProvider.

Le API di binding consentono inoltre a un host di fornire un'interfaccia utente personalizzata per la convalida. Per poter utilizzare questa procedura, la tua app deve dichiarare BIND_APPWIDGET autorizzazione nel file manifest dell'host:

<uses-permission android:name="android.permission.BIND_APPWIDGET" />

Ma questo è solo il primo passo. In fase di runtime, l'utente deve concedere esplicitamente all'app l'autorizzazione per aggiungere un widget all'host. Per verificare se la tua app ha l'autorizzazione per aggiungere il widget, utilizza il metodo bindAppWidgetIdIfAllowed(). Se bindAppWidgetIdIfAllowed() restituisce false, la tua app deve visualizzare un Finestra di dialogo che chiede all'utente di concedere l'autorizzazione: "consenti" per il widget corrente addizioni o "consenti sempre" per coprire tutte le future aggiunte di widget.

Questo snippet fornisce un esempio di come visualizzare la finestra di dialogo:

Kotlin

val intent = Intent(AppWidgetManager.ACTION_APPWIDGET_BIND).apply {
    putExtra(AppWidgetManager.EXTRA_APPWIDGET_ID, appWidgetId)
    putExtra(AppWidgetManager.EXTRA_APPWIDGET_PROVIDER, info.componentName)
    // This is the options bundle described in the preceding section.
    putExtra(AppWidgetManager.EXTRA_APPWIDGET_OPTIONS, options)
}
startActivityForResult(intent, REQUEST_BIND_APPWIDGET)

Java

Intent intent = new Intent(AppWidgetManager.ACTION_APPWIDGET_BIND);
intent.putExtra(AppWidgetManager.EXTRA_APPWIDGET_ID, appWidgetId);
intent.putExtra(AppWidgetManager.EXTRA_APPWIDGET_PROVIDER, info.componentName);
// This is the options bundle described in the preceding section.
intent.putExtra(AppWidgetManager.EXTRA_APPWIDGET_OPTIONS, options);
startActivityForResult(intent, REQUEST_BIND_APPWIDGET);

L'host deve verificare se è necessario configurare il widget aggiunto da un utente. Per maggiori informazioni, vedi Consentire agli utenti di configurare i widget delle app.

Responsabilità dell'organizzatore

Puoi specificare una serie di impostazioni di configurazione per i widget utilizzando i metadati AppWidgetProviderInfo. Puoi recuperare queste opzioni di configurazione, descritte in modo più dettagliato nelle sezioni seguenti, dall'oggetto AppWidgetProviderInfo associato a un provider di widget.

Indipendentemente dalla versione di Android scelta come target, tutti gli host hanno le seguenti responsabilità:

  • Quando aggiungi un widget, assegna l'ID widget come descritto in precedenza. Quando il widget viene rimosso dall'organizzatore, la chiamata deleteAppWidgetId() per deallocare l'ID widget.

  • Quando aggiungi un widget, controlla se l'attività di configurazione deve essere è stato avviato. In genere, l'host deve avviare la configurazione del widget l'attività se esiste e non è contrassegnata come facoltativa specificando sia il Flag configuration_optional e reconfigurable. Consulta: Aggiornare il widget dall'attività di configurazione per maggiori dettagli. Questo è un passaggio necessario per molti widget prima che possano essere visualizzati.

  • I widget specificano una larghezza e un'altezza predefinite nei metadati AppWidgetProviderInfo. Questi valori sono definiti nelle celle, a partire da Android 12, se targetCellWidth e targetCellHeight sono o dps se sono specificati solo minWidth e minHeight. Consulta Attributi di dimensionamento dei widget.

    Assicurati che il widget sia impostato con almeno questo numero di pixel per pollice. Per ad esempio, molti host allineano icone e widget in una griglia. In questo scenario, per impostazione predefinita l'host aggiunge un widget utilizzando il numero minimo di celle che soddisfano i vincoli minWidth e minHeight.

Oltre ai requisiti elencati nella sezione precedente, versioni specifiche della piattaforma introducono funzionalità che richiedono nuove responsabilità all'host.

Stabilisci il tuo approccio in base alla versione di Android target

Android 12

Android 12 (livello API 31) raggruppa un elemento List<SizeF> aggiuntivo contenente l'elenco delle possibili dimensioni in dps che un'istanza di widget può assumere nel pacchetto di opzioni. Il numero di dimensioni fornite dipende dall'implementazione dell'host. Host generalmente che offrono due formati per gli smartphone: verticale e orizzontale, per i pieghevoli.

Esiste un limite di MAX_INIT_VIEW_COUNT (16) al numero di RemoteViews che un AppWidgetProvider può fornire a RemoteViews. Poiché gli oggetti AppWidgetProvider mappano un oggetto RemoteViews a ogni dimensione nel List<SizeF>, non specificare più di MAX_INIT_VIEW_COUNT dimensioni.

Android 12 introduce anche maxResizeWidth e maxResizeHeight in dps. Ti consigliamo che un widget che utilizza almeno uno di questi attributi non superi le dimensioni specificate dagli attributi.

Risorse aggiuntive

  • Consulta la documentazione di riferimento di Glance.