Ajouter des widgets à l'écran de lancement de la page sans bindAppWidgetId()
Je suis en train de tourner à l'ICS stock lanceur dans une application autonome. Je suis presque là - la seule choses qui ne fonctionnent pas sont l'icône de recherche et de déposer des widgets sur l'écran, ce qui provoque un blocage.
Le crash est parce que le stock lanceur utilise appWidgetManager.bindAppWidgetId(appWidgetId, componentName);
pour ajouter des widgets, qui apparemment système d'applications ont la permission de le faire.
Donc ma question est, quelle est la façon correcte pour un non-système d'application pour ajouter des widgets et de réaliser la même expérience d'INTERFACE utilisateur comme les ICS stock lanceur?
InformationsquelleAutor Timmmm | 2012-03-17
Vous devez vous connecter pour publier un commentaire.
Timmmm,
Votre problème est que vous êtes à la recherche pour le mauvais objet. Vous ne pouvez pas vraiment contrôler la
AppWidgetManager
. Ce n'est pas votre job, sa du Système. Ce que vous POUVEZ faire est de contrôler unAppWidgetHost
, il faut juste un peu de sémantique. Voici les règles de base.EDIT: de Fond sur le Widget Processus de Liaison
La AppWidgetManager est un objet singleton qui s'exécute lorsque le Système est démarré. Cela signifie que chaque instance de chaque lanceur utilise le même AppWidgetManager. Ce qui les différencie est leur AppWidgetHost et la RemoteViews ils sont actuellement en détention. Le AppWidgetManager maintient essentiellement une liste de tous les actifs d'hôtes et des widgets qu'ils sont maintenant. Un AppWidgetHost n'est pas un priveleged objet. C'est, toute activité peut avoir qu'un seul hôte. Ainsi, l'ensemble de l'application est peut-être rien, mais les Widgets, s'ils le souhaitent.
Lorsque vous créez une instance de l'Hôte, vous devez alors ajouter des points de Vue à elle. Donc, fondamentalement, c'est une liste de Vues enfant avec aucune parental obligatoire limites, à l'exception de ce que votre Activité donne. Tout d'abord, vous demander une pièce d'identité (via
myHost.allocateAppWidgetId()
). Ensuite, vous utilisez vos Choisir le Widget de l'Activité/la boîte de Dialogue. La boîte de Dialogue renvoie la WidgetInfo. La Vue est récupéré lorsque vous demandez à l'Hôte pour créer la Vue (viacreateView
) avec le WidgetInfo et l'ID que vous avez demandé. Il vous demande ensuite le widget pour sonRemoteView
.Enfin, vous liez le widget en plaçant la Vue dans votre Activité comme un Enfant. Cela se fait via le addView() la méthode de la
ViewGroup
qui détient toutes vos Widgets.Le Processus en Action (ÉDITÉ)
Tout d'abord, vous devez vous assurer que vous avez dans votre manifeste android:
Ensuite, vous devez créer un
AppWidgetHost
(je prolonger mon propre pour mon launcher). La clé de l'Hôte est de garder une référence à laAppWidgetManager
viaAppWidgetManager.getInstance();
.Maintenant, obtenez votre ID:
La prochaine étape est réalisée par toute méthode que vous utilisez pour obtenir le widget info. La plupart du temps, il est renvoyé par l'intermédiaire d'une Intention par le biais de onActivityResult. Maintenant, tout ce que vous avez à faire est d'utiliser la appInfo et créer la vue. Le WidgetId est normalement fourni par le pick widget activité résultat.
Maintenant, vous venez de lier le voir comme un enfant à tout ce que vous voulez lier.
Bien sûr, que vous devez toujours considérer où et comment le placer, etc. Aussi, vous devez vous assurer que votre
AppWidgetHost
est à l'écoute avant de vous commencer à ajouter des widgets.myHost.startListening()
Pour Résumer
Le Widget processus de liaison s'étend sur de nombreuses méthodes et les étapes, mais tout se passe par le biais de la
AppWidgetHost
. Parce que les Widgets sont codées à l'extérieur de votre espace de noms, vous n'avez aucun contrôle, sauf pour le cas où vous les mettre et comment vous la taille de la Vue. Depuis qu'ils sont en fin de compte code qui s'exécute dans votre espace, mais à l'extérieur de votre contrôle, laAppWidgetManager
agit comme un neutre médiateur, tandis que leAppWidgetHost
sert de facilitateur sur votre application en son nom. Une fois cela compris, votre tâche est simple. Les étapes ci-dessus sont toutes les étapes requises pour n'importe quel custom launcher (y compris le mien).EDIT: dernière précision
Le Lanceur ICS fait aussi bien. Le
appWidgetManager
qu'ils utilisent est juste un wrapper de logement de laAppWidgetHost
et les appels à laAppWidgetManager
. J'oublie que très peu de ce qui est expliqué sur le Développement Android site web de la Centrale.Espérons que cette aide! Laissez-moi savoir si vous avez besoin de plus de détails.
FuzzicalLogic
Je connais maintenant la réponse définitive. Dans Android 4.0, vous ne pouvez pas le faire. J'ai fini par faire mes utilisateurs de choisir le widget deux fois, ce qui est nul, mais il n'y a pas moyen de contourner cela.
Dans Android 4.1 ils ont résolu le problème!!!!
SDK applications peuvent maintenant accueillir les widgets et ne pas avoir à utiliser la poubelle widget sélecteur d'API! Vous pouvez regarder dans le Jellybean Launcher2 code source pour plus de détails, mais en gros, lorsque vous essayez de lier un widget Android fera apparaître une boîte de dialogue disant "voulez-vous autoriser cette application à lier des widgets", puis l'utilisateur peut décider de lui donner l'autorisation ou pas.
Je ne sais pas pourquoi ils sont allés pour le modal autorisation de la boîte de dialogue plutôt que le tout-autorisations-sur-installer le modèle qu'ils ont utilisé pour tout le reste, mais qu'importe, ça marche!!!
Maintenant nous avons juste à attendre 4 ou 5 ans, jusqu'à ce que tout le monde a Android 4.1 ou plus!
Je viens de trouver ce tuto sur comment ajouter appwidgets à la normale des applications, ce qui pourrait aider: http://coderender.blogspot.com/2012/01/hosting-android-widgets-my.html
Ce tutoriel utilise toujours le "AppWidget Sélecteur" de la liste, de sorte qu'il pourrait ne pas fonctionner pour vous depuis ICS a le sélecteur de widgets à l'intérieur du tiroir app elle-même.
Encore, a vaut la peine de parler depuis des tutoriels sur l'hébergement des widgets sont très rares 🙂
Acclamations,
Yuvi me
Fuzzical Logique,avec votre code ci-dessous,
si n'avez pas la permission de bind_widget,widgethost ai rien,cus withwidgetinfo est null,widgethost créer rien.
getAppWidgetInfo
pour retourner un objet de laforWidgetId
doit déjà être lié: en cueillant le widget via le système de sélecteur ou de l'appel debindAppWidgetIdIfAllowed
ou si retourne la valeur false justestartActivityForResult(AppWidgetManager.ACTION_APPWIDGET_BIND)
avec le droit params (voir la documentation).