L'écran d'accueil Android, disponible sur la plupart des appareils Android, permet à l'utilisateur d'intégrer des widgets d'application (ou widgets) pour accéder rapidement au contenu. Si vous créez un écran d'accueil de remplacement ou une application similaire, vous pouvez également autoriser l'utilisateur à intégrer des widgets en implémentant AppWidgetHost
. Ce n'est pas quelque chose que la plupart des applications doivent faire, mais si vous créez votre propre hôte, il est important de comprendre les obligations contractuelles auxquelles un hôte accepte implicitement.
Cette page se concentre sur les responsabilités impliquées dans l'implémentation d'un AppWidgetHost
personnalisé. Pour obtenir un exemple spécifique d'implémentation d'un AppWidgetHost
, consultez le code source de l'écran d'accueil Android LauncherAppWidgetHost
.
Voici un aperçu des classes et des concepts clés impliqués dans l'implémentation d'un AppWidgetHost
personnalisé:
Hôte de widget d'application:
AppWidgetHost
permet d'interagir avec le service AppWidget pour les applications qui intègrent des widgets dans leur UI. UnAppWidgetHost
doit avoir un ID unique dans le package de l'hôte. Cet ID persiste pour toutes les utilisations de l'hôte. L'ID est généralement une valeur codée en dur que vous attribuez dans votre application.ID du widget d'application: chaque instance de widget se voit attribuer un ID unique au moment de la liaison. Consultez
bindAppWidgetIdIfAllowed()
et, pour en savoir plus, la section Lier des widgets qui suit. L'hôte obtient l'ID unique à l'aide deallocateAppWidgetId()
. Cet ID est conservé pendant toute la durée de vie du widget jusqu'à ce qu'il soit supprimé de l'hôte. Tout état spécifique à l'hôte (taille et emplacement du widget, par exemple) doit être conservé par le package d'hébergement et associé à l'ID du widget de l'application.Vue d'hôte de widget d'application: considérez
AppWidgetHostView
comme un cadre dans lequel le widget est encapsulé chaque fois qu'il doit être affiché. Un widget est associé à unAppWidgetHostView
chaque fois qu'il est gonflé par l'hôte.- Par défaut, le système crée un
AppWidgetHostView
, mais l'hôte peut créer sa propre sous-classe deAppWidgetHostView
en l'étendant. - À partir d'Android 12 (niveau d'API 31),
AppWidgetHostView
introduit les méthodessetColorResources()
etresetColorResources()
pour gérer les couleurs surchargées de manière dynamique. L'hôte est chargé de fournir les couleurs à ces méthodes.
- Par défaut, le système crée un
Groupe d'options:
AppWidgetHost
utilise le groupe d'options pour communiquer des informations àAppWidgetProvider
sur l'affichage du widget (par exemple, la liste des plages de taille) et si le widget se trouve sur un écran de verrouillage ou sur l'écran d'accueil. Ces informations permettent àAppWidgetProvider
d'adapter le contenu et l'apparence du widget en fonction de la façon et de l'emplacement où il s'affiche. Vous pouvez utiliserupdateAppWidgetOptions()
etupdateAppWidgetSize()
pour modifier le bundle d'un widget. Ces deux méthodes déclenchent le rappelonAppWidgetOptionsChanged()
vers leAppWidgetProvider
.
Lier des widgets
Lorsqu'un utilisateur ajoute un widget à un hôte, un processus appelé liaison se produit. La liaison consiste à associer un ID de widget d'application spécifique à un hôte et à un AppWidgetProvider
spécifiques.
Les API de liaison permettent également à un hôte de fournir une UI personnalisée pour la liaison. Pour utiliser ce processus, votre application doit déclarer l'autorisation BIND_APPWIDGET
dans le fichier manifeste de l'hôte:
<uses-permission android:name="android.permission.BIND_APPWIDGET" />
Mais ce n'est que la première étape. Au moment de l'exécution, l'utilisateur doit accorder explicitement une autorisation à votre application pour lui permettre d'ajouter un widget à l'hôte. Pour vérifier si votre application est autorisée à ajouter le widget, utilisez la méthode bindAppWidgetIdIfAllowed()
. Si bindAppWidgetIdIfAllowed()
renvoie false
, votre application doit afficher une boîte de dialogue invitant l'utilisateur à accorder l'autorisation: "Autoriser" pour l'ajout actuel du widget ou "Toujours autoriser" pour couvrir tous les futurs ajouts de widgets.
Cet extrait de code montre comment afficher la boîte de dialogue:
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'hôte doit vérifier si le widget qu'un utilisateur ajoute doit être configuré. Pour en savoir plus, consultez Permettre aux utilisateurs de configurer les widgets d'application.
Responsabilités de l'hôte
Vous pouvez spécifier un certain nombre de paramètres de configuration pour les widgets à l'aide des métadonnées AppWidgetProviderInfo
.
Vous pouvez récupérer ces options de configuration, décrites plus en détail dans les sections suivantes, à partir de l'objet AppWidgetProviderInfo
associé à un fournisseur de widgets.
Quelle que soit la version d'Android que vous ciblez, tous les hôtes ont les responsabilités suivantes:
Lorsque vous ajoutez un widget, attribuez-lui un ID de widget comme décrit précédemment. Lorsqu'un widget est supprimé de l'hôte, appelez
deleteAppWidgetId()
pour désallouer l'ID du widget.Lorsque vous ajoutez un widget, vérifiez si l'activité de configuration doit être lancée. En règle générale, l'hôte doit lancer l'activité de configuration du widget s'il existe et n'est pas marqué comme facultatif en spécifiant les indicateurs
configuration_optional
etreconfigurable
. Pour en savoir plus, consultez la section Mettre à jour le widget à partir de l'activité de configuration. Cette étape est nécessaire pour de nombreux widgets avant qu'ils ne puissent s'afficher.Les widgets spécifient une largeur et une hauteur par défaut dans les métadonnées
AppWidgetProviderInfo
. Ces valeurs sont définies dans des cellules (à partir d'Android 12, sitargetCellWidth
ettargetCellHeight
sont spécifiés) ou en dps si seulsminWidth
etminHeight
sont spécifiés. Consultez la section Attributs de dimensionnement des widgets.Assurez-vous que le widget est mis en page avec au moins ce nombre de dp. Par exemple, de nombreux hôtes alignent les icônes et les widgets dans une grille. Dans ce scénario, par défaut, l'hôte ajoute le widget à l'aide du nombre minimal de cellules qui répondent aux contraintes
minWidth
etminHeight
.
En plus des exigences listées dans la section précédente, des versions de plate-forme spécifiques introduisent des fonctionnalités qui imposent de nouvelles responsabilités à l'hôte.
Définir votre approche en fonction de la version d'Android ciblée
Android 12
Android 12 (niveau d'API 31) regroupe un List<SizeF>
supplémentaire contenant la liste des tailles possibles en dp qu'une instance de widget peut prendre dans le bundle d'options.
Le nombre de tailles fournies dépend de l'implémentation de l'hôte. Les hôtes fournissent généralement deux tailles pour les téléphones (portrait et paysage) et quatre tailles pour les appareils pliables.
Le nombre de RemoteViews
différents qu'un AppWidgetProvider
peut fournir à RemoteViews
est limité à MAX_INIT_VIEW_COUNT
(16).
Étant donné que les objets AppWidgetProvider
mappent un objet RemoteViews
à chaque taille dans le List<SizeF>
, ne fournissez pas plus de tailles MAX_INIT_VIEW_COUNT
.
Android 12 introduit également les attributs maxResizeWidth
et maxResizeHeight
en dps. Nous vous recommandons qu'un widget qui utilise au moins l'un de ces attributs ne dépasse pas la taille spécifiée par les attributs.
Ressources supplémentaires
- Consultez la documentation de référence sur
Glance
.