Pages

dimanche 19 août 2012

Appeler une activity d’une autre application (exemple de l’envoi de mail)

Nous avons vu dans les articles précédents comment développer des activités pour créer une application correspondant à vos besoins. Mais si vous avez besoin dans votre application d’envoyer un e-mail pourquoi redévelopper un client de mail alors que des outils existants sont là et le font certainement mieux. Si vous êtes par contre dans le cas d’un développeur Gmail vous souhaitez mettre à disposition des autres vos écrans qui permettent d’envoyer un message.

Intent filter
Android permet de gérer les deux cas et tout se fait dans la déclaration de votre activité au niveau du fichier AndroidManifest.xml de votre projet en ajoutant un Intent Filter. Dans les exemples précédemment nous avons vu qu’il fallait au moins en définir un sur votre activité principale pour définir votre lanceur (pour rappel une intent est la description d'une opération à réaliser)

<activity android:name=".SplashActivity" android:label="@string/app_name"
android:screenOrientation="portrait">
    <intent-filter>
        <action android:name="android.intent.action.MAIN" />
        <category android:name="android.intent.category.LAUNCHER" />
    </intent-filter>
</activity>


Autre exemple
<activity android:name="ShareActivity">
    <intent-filter>
        <action android:name="android.intent.action.SEND"/>
        <category android:name="android.intent.category.DEFAULT"/>
        <data android:mimeType="text/plain"/>
        <data android:mimeType="image/*"/>
    </intent-filter>
</activity>


Plusieurs balises peuvent être ajoutées
  • data va également permettre d’ajouter des informations supplémentaires comme dans notre exemple ci dessus, le type mime. Si nous avions défini une action ACTION_PACKAGE_CHANGED
Appeler une intent à partir de l’une de vos activity
Par exemple pour appeler une application qui gère l’envoi de mail nous écrirons

final Intent emailIntent = new Intent(android.content.Intent.ACTION_SEND);
emailIntent.setType("plain/text");
emailIntent.putExtra(android.content.Intent.EXTRA_SUBJECT, "Feuille de match ");
emailIntent.putExtra(android.content.Intent.EXTRA_TEXT,buffer.toString());
startActivity(Intent.createChooser(emailIntent, "Envoi email..."));


Dans le code donné en exemple vous remarquerez que nous avons utilisé la méthode Intent.createChooser qui affiche une liste demandant de choisir l’activité à choisir si plusieurs répondent à votre demande (dans le cas contraire le système prendra celle déclarée par défaut)

Il existe deux méthodes pour appeler une Activity suivant si on attend une réponse ou non (startActivity() ou startActivityForResult()).

Recevoir une demande
Ce cas est beaucoup plus courant et j’en ai déjà parlé dans un article précédent mais voici un exemple d’une activité qui reçoit une demande contenant une donnée en paramètre
if (getIntent().getExtras() != null) {
    matchEvent = getIntent().getExtras().getParcelable(PARAM_EVENT_TO_UPDATE);
}

Pour renvoyer une réponse on utilisera la méthode setResult de l’Intent
Intent intent = this.getIntent(); 
intent.putExtra(PARAM_EVENT_SAVED, matchEvent);
this.setResult(RESULT_OK, intent);
finish();

Ajouter un ou plusieurs flags lors de l’appel d’une Intent
Vous pouvez ajouter (addFlags) ou spécifier des flags (setFlags) pour contrôler comment votre activité doit se comporter. Par exemple

intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP|(Intent.FLAG_ACTIVITY_NEW_TASK)

  • FLAG_ACTIVITY_CLEAR_TOP permet d’indiquer au système que si d’autres instances de l’Activity sont déjà lancées alors elles seront toutes fermées et seule l’instance appelée sera conservée. 
  • FLAG_ACTIVITY_NEW_TASK permet de spécifier que la tâche appelée devient la nouvelle tâche sur la pile d’historique des Activity. 
Ces flags sont très importants pour gérer correctement l’utilisation de la touche Retour arrière. Voir les préconisations Google http://developer.android.com/design/patterns/navigation.html

Aucun commentaire:

Enregistrer un commentaire

Remarque : Seul un membre de ce blog est autorisé à enregistrer un commentaire.