Vous êtes sur la page 1sur 24

Chapitre 4:

Communication entre
applications
(Les objets Intent)
Développement mobile sous Android

Developpement mobile sous


1
Android
Introduction
• La communication interne du système Android est basée sur
l’envoi et la réception de messages exprimant l’intention d’une
action
• Un message émis à destination d’un autre composant:
o de la même application (une activité, un service, etc.)
o celui d’une toute autre application
• Grâce a la classe Intent, ce message permet de véhiculer des:
• Informations au destinataire sur l’action à effectuer et les
données avec lesquelles agir
• Informations nécessaire au système pour son traitement
(catégorie du composante cible et instructions à exécuter)

Developpement mobile sous


2
Android
Introduction
 L’utilisation d’un composant externe peut ainsi être
décidée au moment de l’exécution de
l’application et non lors de la compilation
 Ce mécanisme permet d’éviter les dépendances
 Une application qui permet d’ouvrir une page web
demande au système d’appeler le navigateur par
défaut de l’utilisateur.
 2 types d’envoie d’intent:
 Explicite: en ciblant composant précis d’une application
 Implicite: en laissant le système déléguer le traitement au composant le
plus approprié
 Un système de filtres permet à chaque application
de filtrer les intents pertinentes pour celle ci

Developpement mobile sous


3
Android
Principe de fonctionnement
• L’objet « Intent » est utilisé pour:
1. Démarrer une autre activité
2. Démarrer une autre application
3. Envoyer de l’information

• Le système peut décider quelle application à lancer


pour satisfaire un Intent: La résolution de l’intention.

• Un Intent peut être envoyé à plusieurs application au


même temps (cas de batterie faible)

Developpement mobile sous


4
Android
Principe de fonctionnement

Developpement mobile sous


5
Android
Démarrer une activité (1)
• Pour démarrer une activité EnfantActivity sans
attendre de retour, on utilise la méthode
startActivity avec comme paramètre une instance
de la classe Intent:

Intent intent = new Intent(this,EnfantActivity.class);


startActivity(intent);

• une erreur du type ActivityNotFoundException sera générée


lors de l’appel de la méthode startActivity si l’activité n’est
pas déclarer dans le fichier manifest.

<application ...>
<activity android:name=".EnafantActivity" />
</application>
Developpement mobile sous
6
Android
Exemple de startActivity()
• Fichier: parent_layout.xml • Fichier: enfant1_layout.xml
<?xml version="1.0" encoding="utf-8"?> <?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android= <LinearLayout xmlns:android=
"http://schemas.android.com/apk/res/a "http://schemas.android.com/apk/res/
ndroid" android"
android:orientation="vertical" android:orientation="vertical"
android:layout_width="fill_parent" android:layout_width="fill_parent"
android:layout_height="fill_parent" android:layout_height="fill_parent"
> >

<Button <TextView
android:layout_width="fill_parent"
android:layout_width="fill_parent" android:layout_height="wrap_content"
android:layout_height="wrap_content" android:text="Bienvenu dans l'activité
android:text="Appel de l'activité Enfant1 "
Enfant1" />
android:id="@+id/bouton"/> </LinearLayout>

</LinearLayout>

Developpement mobile sous


7
Android
Exemple de startActivity()
• Fichier: ParentActivity.java • Fichier: Enfant1Activity.java

public class ParentActivity extends Activity {


Button bouton_1;
public class Enfant1Activity extends
@Override Activity {
public void onCreate(Bundle savedInstanceState) { @Override
super.onCreate(savedInstanceState);
public void onCreate(Bundle
setContentView(R.layout.parent_layout); savedInstanceState) {
bouton_1=(Button)findViewById(R.id.bouton); super.onCreate(savedInstanceState);
setContentView(R.layout.enfant1_layout
bouton_1.setOnClickListener(new
OnClickListener(){ );
}
public void onClick (View view){
Intent intent=
}
new
Intent(PrarentActivity.this,Enfant1Activity.class);
startActivity(intent);
}
}); } }

Developpement mobile sous


8
Android
Démarrer une activité avec
startActivityForResult()
• La méthode startActivityForResult() utilisé pour appeler une
activité « EnfantActivity » et attendre un résultat.
• Cette méthode contient un paramètre requestCode qui
permet d’identifier l’activité à son retour.
• Ce paramètre requestCode sera envoyé de l’activité
parent à l’activité « enfant » et inversement.
• Un résultat resultCode (exp: RESULT_OK ou
RESULT_CANCELED) sera envoyé par l’activité
« EnfantActivity » à l’activité « ParentActivity ».
• La méthode setResult() permet d’envoyer ce résultat de
l’activité « EnfantActivity » vers l’activité « ParentActivity ».
• La methode onActivityResult() permet de recevoir le
resultat dans l’activité « ParentActivity »
Developpement mobile sous
9
Android
Exemple de startActivityForResult()
• Fichier: parent_layout.xml • Fichier: Enfant1_layout.xml
<?xml version="1.0" encoding="utf-8"?>
<?xml version="1.0" encoding="utf-8"?> <LinearLayout
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/an
xmlns:android="http://schemas.android.co droid"
m/apk/res/android" android:orientation="vertical"
android:layout_width="fill_parent"
android:orientation="vertical" android:layout_height="fill_parent"
android:layout_width="fill_parent" >
android:layout_height="fill_parent" <TextView
> android:layout_width="fill_parent"
android:layout_height="wrap_content"
<Button android:text="Bienvenus dans l'activité Enfant1 "
android:layout_width="fill_parent" />
android:layout_height="wrap_content" <Button
android:text="Appel de l'activité Enfant1" android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/bouton1" android:id="@+id/boutonOK1"
/> android:text="OK"
<Button />
android:layout_width="fill_parent" <Button
android:layout_width="wrap_content"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:text="Appel de l'activité Enfant2" android:id="@+id/boutonANNULER1"
android:id="@+id/bouton2" android:text="ANNULER"
/> />
</LinearLayout>
</LinearLayout>

Developpement mobile sous


10
Android
Exemple de startActivityForResult()
• Fichier: Enfant2_layout.xml • Fichier: ParentActivity.java
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout public class ParentActivity extends Activity {
xmlns:android="http://schemas.android.com/apk/
res/android" Button bouton_1;
Button bouton_2;
android:orientation="vertical"
@Override
android:layout_width="fill_parent"
public void onCreate(Bundle savedInstanceState) {
android:layout_height="fill_parent" super.onCreate(savedInstanceState);
> setContentView(R.layout.parent_layout);
<TextView bouton_1=(Button)findViewById(R.id.bouton1);
android:layout_width="fill_parent" bouton_2=(Button)findViewById(R.id.bouton2);
android:layout_height="wrap_content" bouton_1.setOnClickListener(new
android:text="Bienvenus dans l'activité Enfant2 " OnClickListener(){
/> public void onClick (View view){
<Button Intent intent=new
android:layout_width="wrap_content" Intent(Principale.this,Enfant1.class);
android:layout_height="wrap_content" startActivityForResult(intent,1);
}
android:id="@+id/boutonOK2"
});
android:text="OK"
bouton_2.setOnClickListener(new
/> OnClickListener(){
<Button public void onClick (View view){
android:layout_width="wrap_content" Intent intent=new
android:layout_height="wrap_content" Intent(Principale.this,Enfant2.class);
android:id="@+id/boutonANNULER2" startActivityForResult(intent,2);
android:text="ANNULER" }
/> });
</LinearLayout> }//on create

Developpement mobile sous


11
Android
Exemple de startActivityForResult()
• Suite du fichier ParentActivity.java • Fichier: Enfant1Activity.java
public void onActivityResult (int requestCode, int
resultCode, Intent data){ public class Enfant1Activity extends Activity {
Button B_OK;
switch (requestCode){ Button B_AN;
case (1): switch (resultCode){
case RESULT_OK: @Override
Toast.makeText(this,"Enfant1 OK", public void onCreate(Bundle savedInstanceState) {
Toast.LENGTH_SHORT).show(); super.onCreate(savedInstanceState);
return; setContentView(R.layout.enfant1_layout);
case RESULT_CANCELED:
Toast.makeText(this,"Enfant1 Annuler", B_OK=(Button)findViewById(R.id.boutonOK1);
Toast.LENGTH_SHORT).show();
return; B_AN=(Button)findViewById(R.id.boutonANNULER1);
}
case (2): switch (resultCode){ B_OK.setOnClickListener (new OnClickListener () {
case RESULT_OK: public void onClick (View view) {
Toast.makeText(this,"Enfant2 OK", setResult(RESULT_OK);
Toast.LENGTH_SHORT).show(); finish();
return; }
case RESULT_CANCELED: });
Toast.makeText(this,"Enfant2 Annuler", B_AN.setOnClickListener (new OnClickListener () {
Toast.LENGTH_SHORT).show(); public void onClick (View view) {
return; setResult(RESULT_CANCELED);
} finish();
}// switch (requestCode }
}//onActivityResult });
}//class ParentActivity }//onCreate
}//class Enfant1Activity

Developpement mobile sous


12
Android
Exemple de startActivityForResult()
• Fichier Enfant2Activity.java
public class Enfant2Activity extends Activity {
Button B_OK;
Button B_AN;
@Override
public void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.enfant2_layout);

B_OK=(Button)findViewById(R.id.boutonOK2);
B_AN=(Button)findViewById(R.id.boutonANNULER2
);
B_OK.setOnClickListener (new OnClickListener () {
public void onClick (View view) {
setResult(RESULT_OK);
finish();
}
});
B_AN.setOnClickListener (new OnClickListener () {
public void onClick (View view) {
setResult(RESULT_CANCELED);
finish();
}
});
}
}

Developpement mobile sous


13
Android
Transporter des informations avec des
« Intent »
• Les « Intent » peuvent transporter des informations.
• La méthode putextra() de l’objet « intent » permet d’jouter des
couples sous forme « clé/valeur » où la clé est un identifiant
unique permettant d’identifier la donnée dans l’objet « Bundle ».
• Exemple:
Intent intent = new Intent(this,AutreActivity.class);
intent.putExtra("maclé", "hello !");
startActivity(intent);
• La récupération des données se fait à travers l’intent envoyé par
la méthode « getExtra() »
• Exemple: Public class AutreActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
Bundle extra = this.getIntent().getExtras();
if(extra != null)
String data = extra.getString("maclé");
… }
}
Developpement mobile sous
14
Android
Exemple d’intent avec des données
• Fichier: parent_layout.xml • Fichier: enfant1_layout.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/an
<?xml version="1.0" encoding="utf-8"?> droid"
<LinearLayout android:orientation="vertical"
xmlns:android="http://schemas.androi android:layout_width="fill_parent"
d.com/apk/res/android" android:layout_height="fill_parent"
>
android:orientation="vertical" <TextView
android:layout_width="fill_parent" android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:layout_height="fill_parent"> android:id="@+id/textV"
<EditText />
android:layout_width="fill_parent" <Button
android:layout_height="wrap_content" android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:hint="Entrez votre nom" android:id="@+id/boutonOK"
android:id="@+id/edit" /> android:text="OK"
<Button />
android:layout_width="fill_parent" <Button
android:layout_width="wrap_content"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:text="Valider" android:id="@+id/boutonANNULER"
android:id="@+id/bouton" android:text="ANNULER"
/> />
</LinearLayout>
</LinearLayout>

Developpement mobile sous


15
Android
Exemple d’intent avec des données
• Fichier: ParentActivity.java • Fichier: Enfant1Activity.java
public class ParentActivity extends Activity { public void onCreate(Bundle savedInstanceState) {
Button bouton; super.onCreate(savedInstanceState);
EditText texte_nom; setContentView(R.layout.enfant1_layout);
@Override
public void onCreate(Bundle savedInstanceState) {
Bundle infoNom = this.getIntent().getExtras();
super.onCreate(savedInstanceState);
if(infoNom != null){
setContentView(R.layout.parent_layout);
bouton=(Button)findViewById(R.id.bouton); nom=infoNom.getString("monNom");
bouton.setOnClickListener(new OnClickListener(){ }
public void onClick (View view){
texte_nom=(EditText)findViewById(R.id.editT); textV=(TextView)findViewById(R.id.textV);
String nom = texte_nom.getText().toString(); textV.setText("Bonjour "+nom+" bienvenu dans
Intent intent=new l'activité Enfant1");
Intent(ParentActivity.this,Enfant1Activity.class);
intent.putExtra("monNom", nom); B_OK=(Button)findViewById(R.id.boutonOK);
startActivityForResult(intent,1); B_AN=(Button)findViewById(R.id.boutonANNULER);
}
}); B_OK.setOnClickListener (new OnClickListener () {
} public void onClick (View view) {
public void onActivityResult (int requestCode, int resultCode,
Intent data){ setResult(RESULT_OK);
switch (resultCode){ finish();
case RESULT_OK: }
Toast.makeText(this,"Enfant1 OK", });
Toast.LENGTH_SHORT).show(); B_AN.setOnClickListener (new OnClickListener () {
return; public void onClick (View view) {
case RESULT_CANCELED:
Toast.makeText(this,"Enfant1 setResult(RESULT_CANCELED);
Annuler", Toast.LENGTH_SHORT).show(); finish();
return; }
} });
} }
}
Developpement mobile sous
16
Android
Solliciter d’autres applications
• Un « intent » permet aussi de demander un
composant d’une autre application.
• C’est le système qui décide de l’application à
utiliser pour accomplir votre souhait
• Le système se base sur les informations fournit dans
l’intent: action, données, catégorie…

Developpement mobile sous


17
Android
Déléguer au système le choix de
l’application
• Exemple1: appelle d’un numéro de téléphone
Uri uri = Uri.parse("tel:0612345678");
Intent intent = new Intent(Intent.ACTION_DIAL, uri);
startActivity(intent);

• Exemple 2:
Uri uri = Uri.parse("tel:0612345678");
Intent intent = new Intent(Intent.ACTION_CALL, uri);
startActivity(intent);

• Exemple 3: Affichage d’une page web


Uri uri = Uri.parse("http://www.google.fr/");
Intent intent = new Intent(Intent.ACTION_VIEW, uri);
startActivity(intent);

Developpement mobile sous


18
Android
Actions natives du système Android

Developpement mobile sous


19
Android
Accorder les permissions liées aux
actions
• Certaines actions nécessitent une permission pour
la réaliser.
• La permission doit être ajouter au fichier « manifest »
(fichier de configuration)
• Exemple: Appeler un numéro de téléphone
Uri uri = Uri.parse("tel:0612345678");
Intent intent = new Intent(Intent.ACTION_CALL, uri);
startActivity(intent);

Nécessite la permission android.permission.CALL_PHONE:


<manifest ...
<uses-permission
android:name="android.permission.CALL_PHONE" />
</manifest>

Developpement mobile sous


20
Android
Filtrer la réception des intents
• Android permet aux applications de filtrer les intents reçus d’autres
applications

• Les intents filtre sont définit dans le fichier de configuration (Manifest).

• Exemple:
<activity ...
<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="demo" />
</intent-filter>
</activity>

• L’Intent filtre déclaré ci-dessus acceptera l’intent crée suivant:


Uri uri = Uri.parse("demo://ceci est une chaine de caractère");
Intent intent = new Intent(Intent.ACTION_VIEW, uri);
startActivity(intent);

Developpement mobile sous


21
Android
Filtrer la réception des intents

Chaque élément de la balise est important puisqu’il


détermine le niveau de filtrage :
 action : identifiant unique sous forme de chaîne de
caractères. Il est d’usage d’utiliser la convention de
nom Java
 category : premier niveau de filtrage de l’action.
Cette balise indique dans quelle circonstance
l’action va s’effectuer ou non. Il est possible
d’ajouter plusieurs balises de catégorie
 data : filtre l’objet Intent au niveau des données
elles-mêmes.

Developpement mobile sous


22
Android
Conclusion
• Lancer une activité ou naviguer entre les écrans
passent à travers les objets « Intent ».

• Les objets « intent » permet de solliciter d’autre


applications pour exécuter une action spécifique (
lancer une page web, appeler un correspondant
…)

• Les « intent » est un concept qui offre une flexibilité


et une puissance sans précédant sur les
plateformes mobiles.

Developpement mobile sous


23
Android
Fin chapitre 4

Developpement mobile sous


24
Android

Vous aimerez peut-être aussi