intent – Transmettre des données entre activités

Naviguer entre les activités avec les Intents

Passer de l’activité principale à une autre activité

Utilisez une Intent explicite.

Nous ajoutons une activité vide et la nommons AddCourseActivity, en cochant « Generate Layout File ».
Cependant, ne cochez pas l’option Launcher Activity.

Intent

Une Intent est un moyen important pour les composants d’une application Android d’interagir.
Elle peut indiquer l’action que le composant actuel souhaite effectuer et également transmettre des données entre composants.


Les Intents se divisent en : Intent explicite et Intent implicite

Elle possède plusieurs constructeurs.
Sur un bouton de l’activité principale, j’instancie une Intent pour passer de l’activité principale à la deuxième activité.

// D'abord, initialiser une Intent en précisant d'où vers où
Intent it = new Intent(FirstActivity.this, AddCourseActivity.class);
startActivity(it);Langage du code : JavaScript (javascript)

Utilisation d’une Intent implicite

Par rapport à une Intent explicite, une Intent implicite ne nécessite pas de spécifier quelle activité lancer. Elle spécifie plutôt une série d’actions et de catégories plus abstraites.

Puis le système analyse cette Intent et nous aide à trouver une activité valide à lancer.

Nous modifions AndroidManifest.xml.

Ajoutez une action et une catégorie à la deuxième activité.

Pour l’action, nous indiquons que cette activité peut répondre à cette action.

<activity android:name=".AddCourseActivity">
    <intent-filter>
        <action android:name="com.foxdevelop.www.activitydemo.ACTION_START" />
        <category android:name="android.intent.category.DEFAULT" />
    </intent-filter>
</activity>Langage du code : HTML, XML (xml)

C’est seulement si la Intent correspond à l’action et à la catégorie de l’activité que celle-ci pourra y répondre.

// Initialiser une Intent pour correspondre à l'action correspondante dans AndroidManifest.xml
Intent it = new Intent("com.foxdevelop.www.activitydemo.ACTION_START");
startActivity(it);Langage du code : JavaScript (javascript)

Pourquoi n’avons-nous pas besoin de faire correspondre la catégorie ?

Parce que cette activité utilise android.intent.category.DEFAULT.

C’est la valeur par défaut.

Lorsque nous appelons startActivity, DEFAULT est automatiquement transmis.

Chaque Intent ne peut spécifier qu’une seule action, mais peut avoir plusieurs catégories.

Puisque c’est actuellement DEFAULT, nous n’avons pas besoin de l’ajouter.

Si nous devons ajouter d’autres catégories :

// Initialiser une Intent pour correspondre à l'action ci-dessous et ajouter des catégories
Intent it = new Intent("com.foxdevelop.www.activitydemo.ACTION_START");
it.addCategory("com.foxdevelop.www.activitydemo.MY_CATEGORY");
it.addCategory("com.foxdevelop.www.activitydemo.MY_CATEGORY1111111");
startActivity(it);Langage du code : JavaScript (javascript)

En cliquant sur le menu « Ajouter un cours », l’application a planté.

La raison est que nous avons ajouté une catégorie à l’intent, mais la deuxième activité ne déclare pas cette catégorie.

Nous devons donc ajouter cette catégorie.

<activity android:name=".AddCourseActivity">
    <intent-filter>
        <action android:name="com.foxdevelop.www.activitydemo.ACTION_START" />
        <category android:name="android.intent.category.DEFAULT" />
        <category android:name="com.foxdevelop.www.activitydemo.MY_CATEGORY" />
    </intent-filter>
</activity>Langage du code : HTML, XML (xml)

Note :

Si une intent possède plusieurs catégories, cela ne signifie pas qu’il suffit d’en correspondre une seule ; toutes les catégories doivent correspondre.

<activity android:name=".AddCourseActivity">
    <intent-filter>
        <action android:name="com.foxdevelop.www.activitydemo.ACTION_START" />
        <category android:name="android.intent.category.DEFAULT" />
        <category android:name="com.foxdevelop.www.activitydemo.MY_CATEGORY" />
    </intent-filter>
</activity>Langage du code : HTML, XML (xml)
case R.id.add:
    // Initialiser une Intent pour correspondre à l'action ci-dessous et ajouter des catégories
    Intent it = new Intent("com.foxdevelop.www.activitydemo.ACTION_START");
    it.addCategory("com.foxdevelop.www.activitydemo.MY_CATEGORY2222222");
    //it.addCategory("android.intent.category.DEFAULT");
    startActivity(it);
    break;Langage du code : JavaScript (javascript)

Ouvrir une page web avec une Intent implicite

Les Intents implicites peuvent faire bien plus que cela.

Elles peuvent non seulement lancer des activités au sein de la même application, mais aussi des activités d’autres applications.

Cela rend possible le partage de fonctionnalités entre plusieurs applications.

Par exemple, dans une discussion WeChat, quand un ami vous envoie une adresse, vous pouvez l’ouvrir avec le navigateur QQ.

Essayons ci-dessous :

Intent it = new Intent(Intent.ACTION_VIEW); // Action système intégrée
it.setData(Uri.parse("http://www.foxdevelop.com")); // Ouvrir une URL
startActivity(it);Langage du code : JavaScript (javascript)

Le « http:// » ne peut pas être omis, sinon une erreur se produira.

E/AndroidRuntime: FATAL EXCEPTION: main
                  Process: com.foxdevelop.www.activitydemo, PID: 8917
                  android.content.ActivityNotFoundException: No Activity found to handle Intent { act=android.intent.action.VIEW dat=www.foxdevelop.com }
                      at android.app.Instrumentation.checkStartActivityResult(Instrumentation.java:1809)
                      at android.app.Instrumentation.execStartActivity(Instrumentation.java:1523)
                      at android.app.Activity.startActivityForResult(Activity.java:4224)
                      at android.support.v4.app.BaseFragmentActivityApi16.startActivityForResult(BaseFragmentActivityApi16.java:54)
                      at android.support.v4.app.FragmentActivity.startActivityForResult(FragmentActivity.java:68)Langage du code : PHP (php)

Passer des appels avec une Intent implicite

Vous pouvez utiliser le protocole tel pour passer des appels

Dans le cours précédent, nous avons utilisé le protocole http pour ouvrir un domaine.

Par exemple, essayons de composer le 10010.

Intent it = new Intent(Intent.ACTION_DIAL); // Action système intégrée
it.setData(Uri.parse("tel:10010")); // Composer ce numéro ; confirmation de l'utilisateur requise
startActivity(it);Langage du code : JavaScript (javascript)

Transmettre des données entre activités

Les Intents peuvent transmettre des données

intent (nom) : intention, but ; sens, signification.

Utilisez sa méthode putExtra pour transmettre des données.

Puis dans la deuxième activité, en appelant la méthode getStringExtra, vous pouvez obtenir les données transmises.

Dans la deuxième activité, vous pouvez appeler getIntent pour obtenir la Intent.

Bien sûr, si vous transmettez un entier, vous pouvez utiliser getIntExtra pour l’obtenir.

D’abord, dans la première activité :

Intent it = new Intent(FirstActivity.this, AddCourseActivity.class);
it.putExtra("site", "www.foxdevelop.com");
it.putExtra("name", "FoxDevelop");
startActivity(it);Langage du code : JavaScript (javascript)

Ensuite, dans la deuxième activité, récupérez l’objet Intent et obtenez ses valeurs.

Dans la méthode onCreate de la deuxième activité :

protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_add_course_acticity);
    Intent it = getIntent();
    String site = it.getStringExtra("site");
    String name = it.getStringExtra("name");
    int version = it.getIntExtra("version", 1);
    Log.e(TAG, site);
}Langage du code : JavaScript (javascript)

Renvoyer des données à l’activité précédente

Lorsque nous quittons l’activité actuelle

L’activité possède une méthode startActivityForResult qui peut renvoyer un résultat à l’activité précédente avant d’être détruite.

Cette méthode prend deux paramètres : le premier est la Intent, le second est le code de requête, utilisé plus tard dans le rappel pour déterminer la source des données.

Avant que l’activité ne soit détruite, utilisez la méthode setResult pour renvoyer un résultat à l’activité précédente. Utilisez généralement RESULT_OK ou RESULT_CANCELED. Le deuxième paramètre est la Intent contenant les données.

Vous pouvez utiliser putExtra pour définir des valeurs sur la Intent.

Puisque nous avons utilisé startActivityForResult dans l’activité précédente pour lancer la deuxième activité, lorsque celle-ci est détruite, elle déclenche la méthode onActivityResult de la première activité. Ici, nous pouvons obtenir la Intent et le code de résultat.

Si l’utilisateur ne clique pas sur un bouton pour revenir en arrière mais utilise la touche retour, nous devons redéfinir la méthode onBackPressed de la deuxième activité.

1. Lors du lancement de la Intent dans la première activité

Intent it = new Intent(FirstActivity.this, AddCourseActivity.class);
it.putExtra("site", "www.foxdevelop.com");
it.putExtra("name", "FoxDevelop");
it.putExtra("version", 1);
startActivityForResult(it, 1);Langage du code : JavaScript (javascript)

2. Redéfinition dans la première activité

public class FirstActivity extends AppCompatActivity {
    private static final String TAG = "FirstActivity";
    // Redéfinir la méthode de la première activité ; quand la deuxième activité se termine, ce code s'exécute
    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        if (resultCode == RESULT_OK) {
            String h = data.getStringExtra("hot");
            Log.d(TAG, h);
        }
        super.onActivityResult(requestCode, resultCode, data);
    }Langage du code : JavaScript (javascript)

3. Dans la deuxième activité

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_add_course_acticity);

    // Récupérer les données de l'activité précédente
    Intent it = getIntent();
    String site = it.getStringExtra("site");
    String name = it.getStringExtra("name");
    int version = it.getIntExtra("version", 1);
    Log.e(TAG, site);

    // Ajouter un événement de retour au bouton, définir les valeurs de la Intent dans l'événement, définir le code de résultat et terminer
    Button b = findViewById(R.id.button);
    b.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            Intent it = getIntent();
            it.putExtra("hot", "Cours populaires");
            setResult(RESULT_OK, it);
            finish();
        }
    });
}Langage du code : JavaScript (javascript)

Lorsque nous revenons à l’activité principale, l’événement est déclenché et le journal est affiché.

05-12 06:17:46.741 12960-12960/com.foxdevelop.www.activitydemo D/FirstActivity: Cours populaires

Si vous voulez que la touche retour renvoie aussi des données

Vous devez redéfinir onBackPressed.

Nous redéfinissons cela dans la deuxième activité :

// Cette méthode est déclenchée quand nous appuyons sur la touche retour
@Override
public void onBackPressed() {
    Intent it = getIntent();
    it.putExtra("hot", "Derniers cours");
    setResult(RESULT_OK, it);
    finish();
}Langage du code : JavaScript (javascript)
05-12 06:23:08.654 13209-13209/com.foxdevelop.www.activitydemo D/FirstActivity: Cours populaires
05-12 06:23:16.405 13209-13209/com.foxdevelop.www.activitydemo D/FirstActivity: Derniers cours
05-12 06:23:35.612 13209-13209/com.foxdevelop.www.activitydemo D/FirstActivity: Derniers cours

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *