Créer un hôte de widget

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 souhaitez remplacer l'écran d'accueil ou application similaire, vous pouvez aussi permettre à l'utilisateur d'intégrer des widgets en implémentant AppWidgetHost Ce n'est pas ce que la plupart des applications doivent faire, mais si vous créez votre propre hôte, important de comprendre les obligations contractuelles qu’un hôte accepte implicitement.

Cette page se concentre sur les responsabilités liées à l'implémentation d'un modèle AppWidgetHost 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. AppWidgetHost doit avoir un identifiant unique dans le propre 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 attribuer dans votre application.

  • App widget ID (ID de widget d'application) : un identifiant unique est attribué à chaque instance de widget à chaque fois. de liaison. Voir bindAppWidgetIdIfAllowed() et, pour plus de détails, la section Liaison de widgets ci-après. La host obtient l'identifiant unique en utilisant allocateAppWidgetId() Cet identifiant est conservé pendant toute la durée de vie du widget jusqu'à ce qu'il soit supprimé du hôte. Tout état spécifique à l'hôte, tel que la taille et l'emplacement d'hébergement : ils doivent être conservés par le package d'hébergement et associés au ID de widget d'application.

  • App widget host view (Vue hôte du widget de l'application) : pensez à AppWidgetHostView en tant que cadre que le widget est encapsulé chaque fois qu'il doit être affiché. Un widget est associé à un AppWidgetHostView chaque fois que le widget est gonflé par la hôte.

    • Par défaut, le système crée un AppWidgetHostView, mais l'hôte peut créer sa propre sous-classe de AppWidgetHostView en l'étendant.
    • À partir d'Android 12 (niveau d'API 31), AppWidgetHostView introduit le la setColorResources() et resetColorResources() de gestion dynamique des couleurs surchargées. L'hôte est responsable de la fourniture des couleurs à ces méthodes.
  • Groupe d'options: AppWidgetHost utilise le bundle d'options pour communiquer des informations AppWidgetProvider sur l'affichage du widget, par exemple, liste des plages de tailles, en précisant si est affiché sur un écran de verrouillage ou sur l'écran d'accueil. Ces informations permettent au AppWidgetProvider adapte le contenu et l'apparence du widget en fonction où il est affiché. Vous pouvez utiliser updateAppWidgetOptions() et updateAppWidgetSize() pour modifier le bundle d'un widget. Ces deux méthodes déclenchent onAppWidgetOptionsChanged() à AppWidgetProvider.

Lier des widgets

Lorsqu'un utilisateur ajoute un widget à un hôte, un processus appelé binding se produit. Liaison désigne l'association d'un identifiant de widget d'application particulier à un hôte spécifique et à des AppWidgetProvider spécifiques.

Les API de liaison permettent également à un hôte de fournir une UI personnalisée pour la liaison. Pour que vous puissiez utiliser ce processus, votre application doit déclarer le 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 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'organisateur

Vous pouvez spécifier un certain nombre de paramètres de configuration pour les widgets à l'aide de la propriété 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 disposent du 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. Généralement, l'hôte doit lancer la configuration du widget s'il existe et qu'il n'est pas marqué comme facultatif, en spécifiant à la fois Options configuration_optional et reconfigurable. 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 de pouvoir s'afficher.

  • Les widgets spécifient une largeur et une hauteur par défaut dans AppWidgetProviderInfo de métadonnées. Ces valeurs sont définies dans des cellules (à partir d'Android 12, si targetCellWidth et targetCellHeight sont spécifiés) ou en dps si seuls minWidth et minHeight sont spécifiés. Consultez la section Attributs de dimensionnement des widgets.

    Assurez-vous que le widget est disposé 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 et minHeight.

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 d'entrées différentes est limité à MAX_INIT_VIEW_COUNT (16). RemoteViews qu'un AppWidgetProvider peut fournir à RemoteViews Étant donné que les objets AppWidgetProvider mappent un objet RemoteViews à chaque taille du List<SizeF>, ne fournissez pas plus de MAX_INIT_VIEW_COUNT tailles.

Android 12 présente également maxResizeWidth et maxResizeHeight en dps. Nous recommandons qu'un widget utilisant au moins l'un de ces ne dépasse pas la taille spécifiée par les attributs.

Ressources supplémentaires

  • Consultez la documentation de référence sur Glance.