09.02.2017 Views

creez-des-applications-pour-android

Create successful ePaper yourself

Turn your PDF publications into a flip-book with our unique Google optimized e-Paper software.

4.2 La communication entre composants<br />

— Soit votre recherche est infructueuse et vous avez 0 résultat, auquel cas c’est grave et une<br />

ActivityNotFoundException sera lancée. Il vous faut donc penser à gérer ce type d’erreurs.<br />

— Si on n’a qu’un résultat, comme dans le cas <strong>des</strong> intents explicites, alors ce résultat va directement<br />

se lancer.<br />

— En revanche, si on a plusieurs réponses possibles, alors le système va demander à l’utilisateur<br />

de choisir à l’aide d’une boîte de dialogue. Si l’utilisateur choisit une action par défaut<br />

<strong>pour</strong> un intent, alors à chaque fois que le même intent sera émis ce sera toujours le même<br />

composant qui sera sélectionné. D’ailleurs, il peut arriver que ce soit une mauvaise chose<br />

parce qu’un même intent ne signifie pas toujours une même intention (ironiquement). Il<br />

se peut qu’avec ACTION_SEND, on cherche un jour à envoyer un SMS et un autre jour à envoyer<br />

un e-mail, c’est <strong>pour</strong>quoi il est possible de forcer la main à Android et à obliger l’utilisateur<br />

à choisir parmi plusieurs éventualités à l’aide de Intent createChooser(Intent<br />

target, CharSequence titre). On peut ainsi insérer l’intent à traiter et le titre de la<br />

boîte de dialogue qui permettra à l’utilisateur de choisir une application.<br />

Dans tous les cas, vous pouvez vérifier si un composant va réagir à un intent de manière programmatique<br />

à l’aide du Package Manager. Le Package Manager est un objet qui vous permet<br />

d’obtenir <strong>des</strong> informations sur les packages qui sont installés sur l’appareil. On y fait appel<br />

avec la méthode PackageManager getPackageManager() dans n’importe quel composant.<br />

Puis on demande à l’intent le nom de l’activité qui va pouvoir le gérer à l’aide de la méthode<br />

ComponentName resolveActivity (PackageManager pm) :<br />

Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse("tel:0606060606"));<br />

PackageManager manager = getPackageManager();<br />

ComponentName component = intent.resolveActivity(manager);<br />

// On vérifie que component n'est pas null<br />

if(component != null)<br />

//Alors c'est qu'il y a une activité qui va gérer l'intent<br />

4.2.5 Pour aller plus loin : navigation entre <strong>des</strong> activités<br />

Une application possède en général plusieurs activités. Chaque activité est dédiée à un ensemble<br />

cohérent d’actions, mais toujours centrées vers un même objectif. Pour une application qui lit <strong>des</strong><br />

musiques, il y a une activité <strong>pour</strong> choisir la musique à écouter, une autre qui présente les contrôles<br />

sur les musiques, encore une autre <strong>pour</strong> paramétrer l’application, etc.<br />

Je vous avais présenté au tout début du tutoriel la pile <strong>des</strong> activités. En effet, comme on ne peut<br />

avoir qu’une activité visible à la fois, les activités étaient présentées dans une pile où il était possible<br />

d’ajouter ou d’enlever un élément au sommet afin de changer l’activité consultée actuellement.<br />

C’est bien sûr toujours vrai, à un détail près. Il existe en fait une pile par tâche. On <strong>pour</strong>rait<br />

dire qu’une tâche est une application, mais aussi les activités qui seront lancées par cette application<br />

et qui sont extérieures à l’application. Ainsi que les activités qui seront lancées par ces<br />

activités extérieures, etc.<br />

Au démarrage de l’application, une nouvelle tâche est créée et l’activité principale occupe la racine<br />

de la pile.<br />

269

Hooray! Your file is uploaded and ready to be published.

Saved successfully!

Ooh no, something went wrong!