Démarrer une activité et réceptionner son résultat

Commencer une activité avec startActivityForResult

Ce site ne sera plus alimenté de contenu après août 2014. Tous les nouveaux articles seront redigés pour www.waitingforcode.com

Parfois notre application aura besoin de passer par une autre application pour récupérer les données. Cela peut se faire dans la situation où l'on souhaite récupérer un contact du carnet d'adresses pour lui envoyer une information issue de notre application. Pour ce faire, on utilisera la fonction startActivityForResult() qui sera présentée ci-dessous.

La méthode startActivityForResult() permet de démarrer une activité en fonction du résultat. Elle peut être utile dans les situations où l'on doit passer par une application tiers pour effectuer une action dans notre système par la suite. Par exemple, cela peut s'appliquer à la situation où l'on veut choisir une personne de la liste des contacts à qui notre application enverra un e-mail. Le schéma d'appel est le suivant (activité parent : MainActivity, activité intermédiaire : IntermediateActivity) :

MainActivity => appel startActivityForResult(IntermediateActivity, 123) => IntermediateActivity.setResult() pour déterminer le résultat de l'action (RESULT_CANCELED, RESULT_OK ou des valeurs qui commencent avec RESULT_FIRST_USER) => MainActivity. onActivityResult(int, int, Intent) qui récupère le résultat et effectue le reste de l'opération si besoin

On peut constater la mise en place de ce schéma dans notre code chargé de vérifier si un e-mail a été correctement envoyé :

public class ContactFormActivity extends BaseActivity {
    // ...
    private final static int EMAIL_SENT = 1;

    public void handleForm(View view) {
        // ...
        startActivityForResult(Intent.createChooser(emailIntent, getResources().getString(R.string.email_select_client)), EMAIL_SENT);
    }

    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        String message = "";
        if (requestCode == EMAIL_SENT) {
            if (resultCode == RESULT_OK) {
                message = getResources().getString(R.string.mail_sent_ok);
            } else {
                message = getResources().getString(R.string.mail_sent_error);
            }
            Toast.makeText(this, message, Toast.LENGTH_LONG).show();
        }
    }
}

Dans le code ci-dessus on voit que la méthode startActivityForResult appelle une activité qui permet à l'utilisateur de choisir le programme qui servira à envoyer l'e-mail. Une fois que cette opération et l'envoi du message faits, Android va retourner à l'activité ContactFormActivity et invoquer la méthode onActivityResult(). Cette dernière vérifie d'abord si le code de la requête correspond à EMAIL_SENT, spécifié au moment d'appel startActivityForResult. Quand on est certains d'opérer sur l'action d'envoi de mail, on peut vérifier si le résultat retourné est correct ou pas pour afficher le message approprié.

Bartosz KONIECZNY Activités

Une question ? Une remarque ?

*

*

Un conseil Symfony1

Comment inclure un template commun pour plusieurs modules ?

Le fichier à inclure (par exemple _menu.php) devrait être stocké dans le répertoire templates de l'application en question.

Ensuite, dans notre fichier de layout (par exemple layout.php), il suffit d'appeler le helper include_partial : Le répertoire global signifie que le template est global et n'appartient pas à un module particulier.