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,[Link]);
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=
"[Link] "[Link]
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: [Link] • Fichier: [Link]
public class ParentActivity extends Activity {
Button bouton_1;
public class Enfant1Activity extends
@Override Activity {
public void onCreate(Bundle savedInstanceState) { @Override
[Link](savedInstanceState);
public void onCreate(Bundle
setContentView([Link].parent_layout); savedInstanceState) {
bouton_1=(Button)findViewById([Link]); [Link](savedInstanceState);
setContentView([Link].enfant1_layout
bouton_1.setOnClickListener(new
OnClickListener(){ );
}
public void onClick (View view){
Intent intent=
}
new
Intent([Link],[Link]);
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="[Link]
xmlns:android="[Link] 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: [Link]
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout public class ParentActivity extends Activity {
xmlns:android="[Link]
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" [Link](savedInstanceState);
> setContentView([Link].parent_layout);
<TextView bouton_1=(Button)findViewById([Link].bouton1);
android:layout_width="fill_parent" bouton_2=(Button)findViewById([Link].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([Link],[Link]);
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([Link],[Link]);
android:id="@+id/boutonANNULER2" startActivityForResult(intent,2);
android:text="ANNULER" }
/> });
</LinearLayout> }//on create
Developpement mobile sous
11
Android
Exemple de startActivityForResult()
• Suite du fichier [Link] • Fichier: [Link]
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
[Link](this,"Enfant1 OK", public void onCreate(Bundle savedInstanceState) {
Toast.LENGTH_SHORT).show(); [Link](savedInstanceState);
return; setContentView([Link].enfant1_layout);
case RESULT_CANCELED:
[Link](this,"Enfant1 Annuler", B_OK=(Button)findViewById([Link].boutonOK1);
Toast.LENGTH_SHORT).show();
return; B_AN=(Button)findViewById([Link].boutonANNULER1);
}
case (2): switch (resultCode){ B_OK.setOnClickListener (new OnClickListener () {
case RESULT_OK: public void onClick (View view) {
[Link](this,"Enfant2 OK", setResult(RESULT_OK);
Toast.LENGTH_SHORT).show(); finish();
return; }
case RESULT_CANCELED: });
[Link](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 [Link]
public class Enfant2Activity extends Activity {
Button B_OK;
Button B_AN;
@Override
public void onCreate(Bundle savedInstanceState)
{
[Link](savedInstanceState);
setContentView([Link].enfant2_layout);
B_OK=(Button)findViewById([Link].boutonOK2);
B_AN=(Button)findViewById([Link].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,[Link]);
[Link]("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) {
[Link](savedInstanceState);
Bundle extra = [Link]().getExtras();
if(extra != null)
String data = [Link]("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="[Link]
<?xml version="1.0" encoding="utf-8"?> droid"
<LinearLayout android:orientation="vertical"
xmlns:android="[Link] android:layout_width="fill_parent"
[Link]/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: [Link] • Fichier: [Link]
public class ParentActivity extends Activity { public void onCreate(Bundle savedInstanceState) {
Button bouton; [Link](savedInstanceState);
EditText texte_nom; setContentView([Link].enfant1_layout);
@Override
public void onCreate(Bundle savedInstanceState) {
Bundle infoNom = [Link]().getExtras();
[Link](savedInstanceState);
if(infoNom != null){
setContentView([Link].parent_layout);
bouton=(Button)findViewById([Link]); nom=[Link]("monNom");
[Link](new OnClickListener(){ }
public void onClick (View view){
texte_nom=(EditText)findViewById([Link]); textV=(TextView)findViewById([Link]);
String nom = texte_nom.getText().toString(); [Link]("Bonjour "+nom+" bienvenu dans
Intent intent=new l'activité Enfant1");
Intent([Link],[Link]);
[Link]("monNom", nom); B_OK=(Button)findViewById([Link]);
startActivityForResult(intent,1); B_AN=(Button)findViewById([Link]);
}
}); 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: }
[Link](this,"Enfant1 OK", });
Toast.LENGTH_SHORT).show(); B_AN.setOnClickListener (new OnClickListener () {
return; public void onClick (View view) {
case RESULT_CANCELED:
[Link](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 = [Link]("[Link]
Intent intent = new Intent(Intent.ACTION_DIAL, uri);
startActivity(intent);
• Exemple 2:
Uri uri = [Link]("[Link]
Intent intent = new Intent(Intent.ACTION_CALL, uri);
startActivity(intent);
• Exemple 3: Affichage d’une page web
Uri uri = [Link]("[Link]
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 = [Link]("[Link]
Intent intent = new Intent(Intent.ACTION_CALL, uri);
startActivity(intent);
Nécessite la permission [Link].CALL_PHONE:
<manifest ...
<uses-permission
android:name="[Link].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="[Link]" />
<category
android:name="[Link]"/>
<category
android:name="[Link]"/>
<data android:scheme="demo" />
</intent-filter>
</activity>
• L’Intent filtre déclaré ci-dessus acceptera l’intent crée suivant:
Uri uri = [Link]("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