Aller au contenu

Ouvrir une Activity via un click sur un widget


kujaff

Recommended Posts

Bonjour à tous :)

Je débute totalement dans le dev android, et java par la même occasion.

J'ai cherché dans des tutos, mais je ne trouve pas comment lancer une Activity lors d'un click sur l'icone de mon widget. la méthode onUpdate est appelée toutes les X millisecondes mais ce n'est pas ce que je veux.

Est-ce que quelqu'un a une idée ?

Lien vers le commentaire
Partager sur d’autres sites

Tout est là :

http://d.android.com/guide/topics/appwidgets/index.html#Basics

Pour ce qui est de lancer une activity, c'est la partie concernant le PendingIntent qui t'intéresse.

Pour résumer le principe :

- Le système demande régulièrement à ton widget de se redessiner via la méthode onUpdate()

- Ton widget reconstruit son layout et positionne d'éventuelles actions sur certains de ses éléments. Par exemple :

           // Create an Intent to launch ExampleActivity
           Intent intent = new Intent(context, ExampleActivity.class);
           PendingIntent pendingIntent = PendingIntent.getActivity(context, 0, intent, 0);

           // Get the layout for the App Widget and attach an on-click listener to the button
           RemoteViews views = new RemoteViews(context.getPackageName(), R.layout.appwidget_provider_layout);
           views.setOnClickPendingIntent(R.id.button, pendingIntent);

Cette portion de code affecte au bouton R.id.button du layout R.layout.appwidget_provider_layout une action consistant à lancer l'activity ExampleActivity.class.

- L'ensemble des éléments d'interface graphique du widget sont ensuite transmis à l'AppWidgetManager via appWidgetManager.updateAppWidget(appWidgetId, views);

- La home application récupère ces éléments d'interface et les dessine sur un bureau

Pourquoi ces histoire de RemoteViews et PendingIntents ? Pour des raisons de sécurité. Un des principes de base des applications Android c'est qu'elles sont très isolées les unes des autres. Elles n'ont aucune idée de la façon dont elles sont constituées. Ceci est valable aussi pour la Home, qui par ailleurs peut être différente d'un appareil à un autre.

Du coup les concepteurs du framework android ont du construire des passerelles pour permettre un certain niveau d'interactions entre applis, et la problématique des widgets en est un bon exemple.

Sans les PendingIntents, le code de la home, qui s'exécute en dehors du contexte de l'application qui a fourni le widget, ne pourrait pas avoir le droit de lancer une Activity interne d'une autre application. Une PendingIntent est en quelques sortes une délégation de droit d'une application à une autre pour exécuter du code déterminé par l'application émettrice du widget.

Les RemoteViews fonctionnent sur le même principe, elles permettent à une application A de fournir des éléments graphiques pour qu'ils soient exécutés par le process d'une application B.

Lien vers le commentaire
Partager sur d’autres sites

@Nivek : merci pour les infos, dans le lien que tu m'as donné (et que j'ai trouvé traduit un peu partout), il n'est pas clairement expliqué comment gérer le onclick comme tu l'as fait.

autre question : pourquoi quand je fais un toast.show, et derrière une activation du wifi, l'affichage de mon toast n'est fait qu'une fois que le wifi est activé ? c'est bizarre quand même ... quelle solution vous me conseillez ? un thread qui affiche des toast, et un autre pour les activations / désactivations du wifi ?

Lien vers le commentaire
Partager sur d’autres sites

Je suis de retour avec mon problème de widget ^^

J'ai lu la doc, j'ai essayé de faire pareil, mais je ne trouve pas mon widget dans la liste des widgets. J'ai regardé l'exemple dans samples mais je ne vois pas ce qu'il me manque :(

Quelqu'un peut m'aider ?

J'ai fait un zip de mes sources :

http://www.opensofts.org/temp/Wifi.zip

Merci d'avance

Lien vers le commentaire
Partager sur d’autres sites

  • 2 weeks later...

Finalement j'ai trouvé, c'était une mauvaise position de la déclaration du widget dans AndroidManifest.xml.

Maintenant j'ai un autre problème : je ne veux pas d'interface graphique lors du click sur mon widget. Apparement une activity a forcément une interface graphique (même vide).

Je ne trouve pas de possiblité de lancer autre chose qu'une activity, ou d'avoir une activity sans "fenêtre".

Est-ce que quelqu'un peut m'orienter ?

Merci

Lien vers le commentaire
Partager sur d’autres sites

Archivé

Ce sujet est désormais archivé et ne peut plus recevoir de nouvelles réponses.

×
×
  • Créer...