Le Tutoriel de Android Intents

1- Introduction

Ce document est basé sur:
  • Android Studio 1.4

2- Qu'est ce qu'Intent?

Intent (Intention) sont des messages asynchrones qui permettent aux composants d'application de demander des fonctionnalités à partir d'autres composants Android. Des Intents vous permettent d'interagir avec les composants des mêmes applications ainsi qu'avec les composants apportés par d'autres applications. Par exemple, une activité peut démarrer une activité externe pour prendre une photo.
intent est un objet de la classe  android.content.Intent. Votre code peut envoyer Intent au système Android pour définir les composants que vous ciblez.

Par exemple, à travers la méthode  startActivity(), vous pouvez définir un  Intent qui devrait être utilisée pour lancer une Activity. Dans Activity cible, via la méthode startActivity(), vous pouvez déterminer l'intention de l'expéditeur de lancer (start) cette  Activity.

Un  Intent peut contenir des données via un Bundle. Ces données peuvent être utilisées par le composant de réception.
 
Intent peut être utilisé pour:
  1. Démarrer une activité
  2. Démarrer une sous activité
  3. Démarrer un service
\Après avoir appris Intent, vous pouvez trouver plus de détails sur l'  Android Service à:

3- Les types d'Intent

Android prend en charge les Intents explicites (explicits) et des Intents implicites (implicit).

Une application peut définir le composant cible directement dans l' Intent (intention explicite) ou demander au système Android d'évaluer les composants enregistrés en fonction des données d' Intent (intentions implicites).

4- Intent explicite

Intent explicit (Explicit intents): Sont des intentions (intent) qui spécifient explicitement le nom du composant cible pour gérer l'intention; dans ceux- ci, le nom de composant du champ facultatif (ci-dessus) est défini une valeur précise à l'aide des méthodes  setComponent() ou  setClass().
Par exemple, créez Intent:
// Create the Intent with the target of Greeting Activity.
// Intent(FirstActivity, SecondActivity.class)
Intent intent = new Intent(this,GreetingActivity.class);

// The data attached
intent.putExtra("firstName",firstName);
intent.putExtra("lastName", lastName);

// Start Activity (GreetingActivity)
// (No need feedback from the activity is called)
this.startActivity(intent);


// Start Activity and will have a feedback from the activity is called.
this.startActivityForResult(intent, MY_REQUEST_CODE);
Ou:
// Way 1.
Intent mIntent = new Intent(this, GreetingActivity.class);
Bundle extras = mIntent.getExtras();
extras.putString("firstName", "<firstName>");
extras.putString("látName", "<lastName>");

// Way 2.
Intent mIntent2 = new Intent(this, GreetingActivity.class);
Bundle mBundle = new Bundle();
mBundle.putString("firstName", "<firstName>");
mBundle.putString("látName", "<lastName>");
mIntent2.putExtras(mBundle);

// Way 3:
// Using putExtra()
Intent mIntent3 = new Intent(this, GreetingActivity.class);
mIntent3.putExtra("firstName", "<firstName>");
mIntent3.putExtra("látName", "<lastName>");
Dans la cible  Activity:
Intent intent = this.getIntent();

String firstName= intent.getStringExtra("firstName");
String lastName = intent.getStringExtra("lastName");

// Or
Bundle extras = this.getIntent().getExtras();

String firstName1 = extras.getString("firstName");
String lastName2  = extras.getString("lastName");
OK, vous pouvez voir l'exemple simple suivant:

5- Exemple de l'Intent explicite

C'est le modèle de l'exemple:
Créez un nouveau projet  "Empty Activity" baptisé  ExplicitIntentExample:
  • main_activity.xml
En double-cliquant sur les composants de l'interface, vous pouvez définir l' ID et le texte pour eux:
EditText 1:
  • ID: text_firstName
  • Properties
    • layout_width: fill_parent
EditText 2:
  • ID: text_lastName
  • Properties
    • layout_width: fill_parent
TextView:
  • ID: text_feedback
  • Text: <Feedback>
  • Properties:
    • layout_width: fill_parent
    • gravity: center_horizontal
Button:
  • ID: button_greeting
  • Text: Show Greeting
  • Properties:
    • onClick: showGreeting
activity_main.xml
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent"
    android:layout_height="match_parent" android:paddingLeft="@dimen/activity_horizontal_margin"
    android:paddingRight="@dimen/activity_horizontal_margin"
    android:paddingTop="@dimen/activity_vertical_margin"
    android:paddingBottom="@dimen/activity_vertical_margin" tools:context=".MainActivity">

    <EditText
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:id="@+id/text_firstName"
        android:layout_alignParentTop="true"
        android:layout_marginTop="66dp"
        android:layout_centerHorizontal="true" />

    <EditText
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:id="@+id/text_lastName"
        android:layout_below="@+id/text_firstName"
        android:layout_centerHorizontal="true"
        android:layout_marginTop="40dp" />

    <Button
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Show Greeting"
        android:id="@+id/button_greeting"
        android:layout_alignParentBottom="true"
        android:layout_centerHorizontal="true"
        android:layout_marginBottom="132dp"
        android:onClick="showGreeting" />

    <TextView
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:textAppearance="?android:attr/textAppearanceLarge"
        android:text="&lt;Feedback>"
        android:id="@+id/text_feedback"
        android:layout_alignParentBottom="true"
        android:layout_centerHorizontal="true"
        android:layout_marginBottom="59dp"
        android:gravity="center_horizontal" />

</RelativeLayout>

 
Lorsque les utilisateurs cliquent sur le bouton, le programme appellera une autre Activity pour afficher un message d'accueil. Vous devez créer une Activity avec un nom  GreetingActivity.
  • File/New/Activity/Empty Activity
  • activity_greeting.xml
Modifiez les attributs des composants sur l'interface:
TextView
  • ID: text_greeting
  • Text: <Greeting>
  • Properties:
    • layout_width: fill_parent
    • gravity: center_horizontal

Button:
  • ID: button_back
  • Properties
    • onClick: backClicked
activity_greeting.xml
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent"
    android:layout_height="match_parent" android:paddingLeft="@dimen/activity_horizontal_margin"
    android:paddingRight="@dimen/activity_horizontal_margin"
    android:paddingTop="@dimen/activity_vertical_margin"
    android:paddingBottom="@dimen/activity_vertical_margin"
    tools:context="org.o7planning.explicitintentexample.GreetingActivity">

    <TextView
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:textAppearance="?android:attr/textAppearanceLarge"
        android:text="&lt;Greeting>"
        android:id="@+id/text_greeting"
        android:layout_marginBottom="65dp"
        android:layout_above="@+id/button_back"
        android:layout_alignParentLeft="true"
        android:layout_alignParentStart="true"
        android:gravity="center_horizontal" />

    <Button
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Back"
        android:id="@+id/button_back"
        android:layout_centerVertical="true"
        android:layout_centerHorizontal="true"
        android:onClick="backClicked" />
</RelativeLayout>
 
MainActivity.java
package org.o7planning.explicitintentexample;

import android.app.Activity;
import android.content.Intent;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.EditText;
import android.widget.TextView;
import android.widget.Toast;

public class MainActivity extends AppCompatActivity {

   private EditText textFirstName;
   private EditText textLastName;
   private TextView textFeedback;

   public static final int MY_REQUEST_CODE = 100;

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

       this.textFirstName = (EditText)this.findViewById(R.id.text_firstName);
       this.textLastName = (EditText)this.findViewById(R.id.text_lastName);
       this.textFeedback = (TextView)this.findViewById(R.id.text_feedback);
   }

   // When 'Greeting Activity' completed, it sends back a feedback.
   // (If you have started it by startActivityForResult())
   @Override
   protected void onActivityResult(int requestCode, int resultCode, Intent data) {
       if (resultCode == Activity.RESULT_OK && requestCode == MY_REQUEST_CODE ) {
           String feedback = data.getStringExtra("feedback");
           this.textFeedback.setText(feedback);
       } else {
           this.textFeedback.setText("!?");
       }
   }

   // The method is called when the user clicks on "Show Greeting" button.
   public void showGreeting(View view)  {
        String firstName= this.textFirstName.getText().toString();
        String lastName= this.textLastName.getText().toString();

       Intent intent = new Intent(this,GreetingActivity.class);
       intent.putExtra("firstName", firstName);
       intent.putExtra("lastName", lastName);

       // Start Activity and no need feedback.
       // this.startActivity(intent);

       // Start Activity and get feedback.
       this.startActivityForResult(intent, MY_REQUEST_CODE);
   }

}
GreetingActivity.java
package org.o7planning.explicitintentexample;

import android.app.Activity;
import android.content.Intent;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.TextView;

public class GreetingActivity extends AppCompatActivity {

   private String firstName;
   private String lastName;

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

       // Intent is passed into
       Intent intent = this.getIntent();

       this.firstName= intent.getStringExtra("firstName");
       this.lastName = intent.getStringExtra("lastName");

       String greeting = "Hello "+ firstName+" "+ lastName;

       TextView textGreeting =(TextView) this.findViewById(R.id.text_greeting);

       textGreeting.setText(greeting);
   }

   // When completed this Activity, send feedback to the caller.
   @Override
   public void finish() {
       // Prepare data intent
       Intent data = new Intent();
       data.putExtra("feedback", "I'm "+ this.firstName+", Hi!");
       // Activity finished ok, return the data
       this.setResult(Activity.RESULT_OK, data);
       super.finish();
   }


   // The method is called when the user clicks the Back button.
   public void backClicked(View view)  {
       // Calling onBackPressed().
       // Gọi phương thức onBackPressed().
       this.onBackPressed();
   }

 
}
Exécutez l'application:

6- Le filtre Intent (Intent Filter)

Lorsque vous créez une nouvelle  Activity ou un  Service, vous devez les déclarer avec  AndroidManifest.xml. Normalement, lorsque vous les créez avec l' aide d'assistant (wizard) dans Android Studio, le code d'enregistrement est automatiquement créé dans AndroidManifest.xml. Par exemple:
Vous pouvez constater que dans la déclaration Activity sur  AndroidManifest.xml peut avoir le tag  <intent-filter>, cette étiquette spécifie le type d'intention qui lui est envoyé (Activity) qu'elle peut accepter.
Lorsque vous créez une intention implicite (Implicit Intent), le système Android trouve le composant approprié pour commencer en comparant le contenu de l'intention aux filtres d'intention (Intent) déclarés dans le fichier manifeste d'autres applications sur le périphérique. Si l' Intent correspond à un filtre d'intention, le système démarre ce composant et lui délivre l'objet Intent.
Exemple:
** AndroidManifest.xml **
.....

<activity android:name=".HelloWorld"
   android:label="@string/app_name">
   <intent-filter>
       <action android:name="android.intent.action.VIEW"/>
       <category android:name="android.intent.category.DEFAULT"/>
       <category android:name="android.intent.category.BROWSABLE"/>
       <data android:scheme="http" android:host="o7planning.org"/>
   </intent-filter>
</activity>

...
Par exemple, créer une Intent implicite peut appeler l'activité ci-dessus (elle correspond aux filtres d' Intent).
// An implicit intent, requested to view a URL

Intent intent = new Intent (Intent.ACTION_VIEW, Uri.parse("http://o7planning.org"));
startActivity(intent);

7- Intent implicite

Intent Implicite (Implicit Intents): Ceux-ci ne précisent pas de composant cible, mais incluent suffisamment d'informations pour le système afin de déterminer lequel des composants disponibles est le mieux pour exécuter cette intention. Considérez une application qui répertorie les restaurants disponibles près de chez vous. Lorsque vous cliquez sur une option de restaurant en particulier, l'application doit demander aux une autre application d'afficher l'itinéraire vers ce restaurant. Pour ce faire, il pourrait soit envoyer une intention explicite directement à la application Google Maps, soit envoyer une intention implicite, qui serait livrée à toute application qui fournit la fonctionnalité de la carte (map) (par exemple, Yahoo Maps).

8- L'exemple simple avec Intent implicite

Cet exemple simple, lorsque vous cliquez sur un Button qui nécessite de voir le site Web par URL, vous créez Intent implicite, une Intent a été envoyée au système Android pour décider quels composants seront ouverts, peut-être que votre équipement installe de nombreux navigateurs différents (Firefox, Chrome, ...), l'appareil l'ouvrira dans votre navigateur par défaut ou votre navigateur préféré.
En plus, les exemples incluent également:
  • Envoy un e-mail
Créez un nouveau projet Android nommé  "ImplicitIntentExample".
Définissez l' ID, le  text et des attributs pour le bouton:
Button 1:
  • ID: button_google
  • Text: Go Google
  • Properties:
    • onClick: goGoogle
Button 2:
  • ID: button_email
  • Text: Send Email
  • Properties:
    • onClick: sendEmail
activity_main.xml
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent"
    android:layout_height="match_parent" android:paddingLeft="@dimen/activity_horizontal_margin"
    android:paddingRight="@dimen/activity_horizontal_margin"
    android:paddingTop="@dimen/activity_vertical_margin"
    android:paddingBottom="@dimen/activity_vertical_margin" tools:context=".MainActivity">

    <Button
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Go Google"
        android:id="@+id/button_google"
        android:layout_alignParentTop="true"
        android:layout_centerHorizontal="true"
        android:layout_marginTop="86dp"
        android:onClick="goGoogle" />

    <Button
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Send Email"
        android:id="@+id/button_email"
        android:layout_below="@+id/button_google"
        android:layout_centerHorizontal="true"
        android:layout_marginTop="45dp"
        android:onClick="sendEmail" />

</RelativeLayout>

 
MainActivity.java
package org.o7planning.implicitintentexample;

import android.content.Intent;
import android.net.Uri;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.view.View;

public class MainActivity extends AppCompatActivity {


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

   // The method is called when the user clicks on "Go Google" button.
   public void goGoogle(View view)  {
       String url="http://google.com";

       // An implicit intent, request a URL.
       Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse(url));
       this.startActivity(intent);
   }

   // The method is called when the user clicks on "Send Email" button.
   public void sendEmail(View view)  {

       // List of recipients
       String[] recipients=new String[]{"friendemail@gmail.com"};

   
       String subject="Hi, how are you!";

     
       String content ="This is my test email";

       Intent intentEmail = new Intent(Intent.ACTION_SEND, Uri.parse("mailto:"));
       intentEmail.putExtra(Intent.EXTRA_EMAIL, recipients);
       intentEmail.putExtra(Intent.EXTRA_SUBJECT, subject);
       intentEmail.putExtra(Intent.EXTRA_TEXT, content);

       intentEmail.setType("text/plain");

       startActivity(Intent.createChooser(intentEmail, "Choose an email client from..."));
   }



}
Exécutez l'application:
  • Send Email  (VIEW SLIDER).

9- Exemple d'intention implicite, photographié à partir de la caméra et enregistrer dans un fichier

Un exemple avec Intent implicite, lorsque vous cliquez sur un bouton, l'application a envoyé au système Android une demande de prise de photo par Camera et d'enregistrer l'image dans un fichier.

View more categories: