La schermata Home di Android, disponibile sulla maggior parte dei dispositivi Android, consente all'utente di incorporare widget delle app (o widget) per accedere rapidamente ai contenuti. Se stai creando una sostituzione della schermata Home o un'app simile, puoi anche consentire all'utente di incorporare widget implementando AppWidgetHost
. Non è
qualcosa che la maggior parte delle app deve fare, ma se stai creando il tuo host, è
importante comprendere gli obblighi contrattuali che un host accetta implicitamente.
Questa pagina si concentra sulle responsabilità coinvolte nell'implementazione di un AppWidgetHost
personalizzato. Per un esempio specifico di come implementare un AppWidgetHost
,
consulta il codice sorgente della schermata Home di Android
LauncherAppWidgetHost
.
Di seguito è riportata una panoramica delle classi e dei concetti chiave coinvolti nell'implementazione di un
AppWidgetHost
personalizzato:
Host del widget dell'app:
AppWidgetHost
fornisce l'interazione con il servizio AppWidget per le app che incorporano widget nella loro UI. UnAppWidgetHost
deve avere un ID univoco all'interno del pacchetto dell'host. Questo ID viene mantenuto in tutti gli utilizzi dell'host. L'ID è in genere un valore hardcoded che assegni nella tua app.ID widget app: a ogni istanza del widget viene assegnato un ID univoco al momento del binding. Vedi
bindAppWidgetIdIfAllowed()
e, per maggiori dettagli, la sezione Associazione dei widget che segue. L'host ottiene l'ID univoco utilizzandoallocateAppWidgetId()
. Questo ID persiste per tutta la durata del widget finché non viene eliminato dall'host. Qualsiasi stato specifico dell'host, come le dimensioni e la posizione del widget, deve essere mantenuto dal pacchetto di hosting e associato all'ID widget dell'app.Visualizzazione host widget app: pensa a
AppWidgetHostView
come a un frame in cui il widget viene inserito ogni volta che deve essere visualizzato. Un widget è associato a unAppWidgetHostView
ogni volta che viene espanso dall'host.- Per impostazione predefinita, il sistema crea un
AppWidgetHostView
, ma l'host può creare una propria sottoclasse diAppWidgetHostView
estendendola. - A partire da Android 12 (livello API 31),
AppWidgetHostView
introduce i metodisetColorResources()
eresetColorResources()
per la gestione dei colori sovraccarichi in modo dinamico. L'organizzatore è responsabile della fornitura dei colori a questi metodi.
- Per impostazione predefinita, il sistema crea un
Bundle di opzioni: il
AppWidgetHost
utilizza il bundle di opzioni per comunicare informazioni alAppWidgetProvider
su come viene visualizzato il widget, ad esempio l'elenco degli intervalli di dimensioni e se il widget si trova nella schermata di blocco o nella schermata Home. Queste informazioni consentono aAppWidgetProvider
di personalizzare i contenuti e l'aspetto del widget in base a come e dove viene visualizzato. Puoi utilizzareupdateAppWidgetOptions()
eupdateAppWidgetSize()
per modificare il bundle di un widget. Entrambi i metodi attivano il callbackonAppWidgetOptionsChanged()
aAppWidgetProvider
.
Widget di binding
Quando un utente aggiunge un widget a un host, si verifica un processo chiamato associazione. Il binding
si riferisce all'associazione di un particolare ID widget dell'app a un host specifico e a un
AppWidgetProvider
specifico.
Le API di binding consentono inoltre a un host di fornire una UI personalizzata per il binding. Per utilizzare questa procedura, la tua app deve dichiarare l'autorizzazione
BIND_APPWIDGET
nel 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
l'autorizzazione alla tua app per consentirle di 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 mostrare una
finestra di dialogo che chiede all'utente di concedere l'autorizzazione: "Consenti" per l'aggiunta del widget corrente o "Consenti sempre" per coprire tutte le aggiunte future 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 il widget aggiunto da un utente richiede una configurazione. Per maggiori informazioni, vedi Consentire agli utenti di configurare i widget delle app.
Responsabilità dell'host
Puoi specificare una serie di impostazioni di configurazione per i widget utilizzando i
metadati AppWidgetProviderInfo
.
Puoi recuperare queste opzioni di configurazione, trattate in modo più dettagliato nelle sezioni seguenti, dall'oggetto
AppWidgetProviderInfo
associato a un fornitore di widget.
Indipendentemente dalla versione di Android a cui fai riferimento, tutti gli host hanno le seguenti responsabilità:
Quando aggiungi un widget, assegna l'ID widget come descritto in precedenza. Quando un widget viene rimosso dall'host, chiama
deleteAppWidgetId()
per deallocare l'ID widget.Quando aggiungi un widget, controlla se è necessario avviare l'attività di configurazione. In genere, l'host deve avviare l'attività di configurazione del widget se esiste e non è contrassegnata come facoltativa specificando i flag
configuration_optional
ereconfigurable
. Per maggiori dettagli, vedi Aggiornare il widget dall'attività di configurazione. 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 in celle, a partire da Android 12, se sono specificatitargetCellWidth
etargetCellHeight
, o in dp se sono specificati solominWidth
eminHeight
. Vedi Attributi di dimensionamento dei widget.Assicurati che il widget sia disposto con almeno questo numero di dp. 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
eminHeight
.
Oltre ai requisiti elencati nella sezione precedente, versioni specifiche della piattaforma introducono funzionalità che assegnano nuove responsabilità all'host.
Determinare l'approccio in base alla versione di Android di destinazione
Android 12
Android 12 (livello API 31) include un extra List<SizeF>
che contiene l'elenco
delle possibili dimensioni in dp che un'istanza del widget può assumere nel bundle di opzioni.
Il numero di dimensioni fornite dipende dall'implementazione dell'host. In genere, gli host
forniscono due dimensioni per gli smartphone (verticale e orizzontale) e quattro dimensioni
per i dispositivi pieghevoli.
Esiste un limite di MAX_INIT_VIEW_COUNT
(16) al numero di RemoteViews
diversi che un AppWidgetProvider
può fornire a RemoteViews
.
Poiché gli oggetti AppWidgetProvider
mappano un oggetto RemoteViews
a ogni taglia nel
List<SizeF>
, non fornire più di MAX_INIT_VIEW_COUNT
taglie.
Android 12 introduce anche gli attributi
maxResizeWidth
e
maxResizeHeight
in dps. Ti consigliamo di non superare le dimensioni specificate dagli attributi per un widget che utilizza almeno uno di questi attributi.
Risorse aggiuntive
- Consulta la documentazione di riferimento di
Glance
.