Nantes Université

Skip to content
Extraits de code Groupes Projets
Valider 521321b1 rédigé par Arnaud LANOIX's avatar Arnaud LANOIX
Parcourir les fichiers

init tuto4

parent
Aucune branche associée trouvée
Aucune étiquette associée trouvée
Aucune requête de fusion associée trouvée
# Android > Tutoriel n°4
## Objectifs
- Application Android avec plusieurs activités
- Passage de données entre activités
## Manipuler plusieurs activités
En Android, les activités (même dans une même application) sont indépendantes. Il va falloir demander
au téléphone de démarrer la nouvelle activité souhaitée. Pour cela il est nécessaire de créer une "intention" (un objet `Intent`) décrivant la demande.
C'est cette intention qui sera adresser au systeme d'exploitation qui se chargera ensuite de répondre à la demande.
### Intentions implicites
Quand on va créer une intention "implicite", ce sera pour utiliser une activité "externe" c-à-d une autre application : on va alors laisser le système d'exploitation nous proposer une activité permettant de répondre à l'action que l'on souhaite réaliser.
Par exemple "envoyer un message" via une application de messagerie :
val sendMsg = Intent(Intent.ACTION_SEND)
sendMsg.type = "text/plain"
sendMsg.putExtra(Intent.EXTRA_SUBJECT, "Test")
sendMsg.putExtra(Intent.EXTRA_TEXT, "some message to send")
startActivity(sendMsg)
Ou "ouvrir une URL" via un navigateur :
val openUrl = Intent(Intent.ACTION_VIEW)
openUrl.data = Uri.parse("http://www.google.fr")
startActivity(openUrl)
### Intentions explicites
Ici, on demande explicitement l'ouverture d'une classe précise :
val intent = Intent(FromActivity.this, TargetActivity::class.java)
startActivity(intent)
Faîtes bien attention à la notation `TargetActivity::class.java` pour référencer l'Activité à ouvrir
### Passer des données d'une activité à une autre
Pour passer des données d'une activité à une autre, on va ajouter des données à l'intention via les `extras`.
Les `extras` sont un *dictionnaire* associé à l'`Intent`, c-à-d une collection de données de type clefs/valeurs dans laquelle
- la clef sera toujours une `String` et
- la valeur pourra être de différents types : `Int`, `Double`, `String`, etc. ou un objet `Parcelable`
Les données sont envoyées depuis `FromActivity` ainsi :
val data1 : Double
val data2 : String
...
val intent = Intent(FromActivity.this, TargetActivity::class.java)
intent.putExtra("key_data_1", data1)
intent.putExtra("key_data_2", data2)
startActivity(intent)
Et elles sont reçues dans `TargetActivity`:
val value1 = intent.getDoubleExtra("key_data_1", 0.0)
// 0.0 is the default value
val value2 = intent.getStringExtra("key_data_2")
### Retour de données dans l'activité principale
Si l'on souhaite que l'activité de départ recoive des données à la fermeture de la seconde activité, il faut démarrer un peu différement la seconde activité
startActivityForResult(intent, FLAG_ACTIVITY)
`FLAG_ACTIVITY` est une constante entiere qui permettra d'identifier la seconde activité lors du retour dans l'activité principale.
Lorsqu'on voudra terminer la seconde activité et renvoyer des données à l'activité principale, on créera une intention (avec les données necessaires en extras) et on placera cette intention en résulat de l'activité :
val someResult = 123
val intent = Intent()
intent.putExtra("key_some_result", someResult)
setResult(Activity.RESULT_OK, intent)
finish()
Dans l'activité principale, on surchargera la méthode `onActivityResult(...)` pour prendre en compte
les informations reçues depuis la seconde activité
override fun onActivityResult(requestCode : Int, resultCode : Int, data : Intent?) {
super.onActivityResult(requestCode, resultCode, data)
if (resultCode == Activity.RESULT_OK && requestCode == FLAG_ACTIVITY) {
if (data != null) {
result = data.getIntExtra("key_some_result", 0)
// todo
}
}
}
Le `requestCode` doit correspondre à la constante entière définie précédemment.
### En résumé
![](img/intents.png)
## Travail à faire
Ouvrez dans Android Studio le projet Android `tuto4.zip`.
Nous allons faire une version de l'application "ChiffreCesar" qui manipulera plusieurs activités
![](img/tuto4.drawio.png)
Les 3 activités sont déjà créées et tous les composants sont déjà placés.
*Plus généralement, on créé une nouvelle activité dans Android Studio, via un assistant : `File > New > Activity > Empty Activity` ; cela génère un fichier Kotlin `.kt` associé à un fichier de layout `.xml`.*
### Cliquer sur "Chiffrement"
L'action à réaliser lors d'un clic sur le bouton "chiffrement" sera la suivante :
1. Préparer l'ouverture de l'activité `resultActivity`
- passer la valeur de l'attribut `decalage`
- passer le texte original à chiffrer
2. Ouvrir `resultActivity`
3. A l'ouverture de `resultActivity`
- récupérer la valeur de décalage
- récupérer le texte original à chiffrer
- Utiliser la classe `ChiffreCesar` pour réaliser le chiffrement
- Afficher le texte chiffré dans la zone de texte correspondante
### Cliquer sur "Paramètres"
L'action à réaliser sera la suivante :
1. Préparer l'ouverture de `ParamActivity`
- passer la valeur de décalage actuelle
2. Ouvrir `ParamActivity`
3. A l'ouverture de `ParamActivity`
- Récupérer la valeur de décalage actuelle
- Utiliser cette valeur pour initialiser correctement la barre de sélection et l'affichage de la sélection
4. Lors d'un clic sur le bouton "OK"
- Envoyer en résultat la valeur de la barre de sélection
- Fermer `ParamActivity`
5. Dans `MainActivity`
- récupérer la nouvelle valeur de décalage
- mettre à jour l'attribut `decalage` et l'affichage du décalage
### Cliquer sur "Envoi"
Envoyez le texte chiffré lorsque l'on clique sur "Envoi" dans l'activité `resultActivity`
## Code déprécié `startActivityForResult(...)`
Vous allez peut-etre constaté que ma méthode `startActivityForResult(...)` est dépréciée ; cela veut dire
qu'il est déconseillé de continuer à utiliser cette méthode.
Une nouvelle façon d'obtenir un retour depuis une activité est proposée dans les dernières versions d'Android. Dans l'activité principal `FromActivity` :
val intent = Intent(FromActivity.this, TargetActivity::class.java)
val register = registerForActivityResult(
ActivityResultContracts.StartActivityForResult()
) {
if (it.resultCode == Activity.RESULT_OK) {
if (it.data != null) {
decalage = it.data!!.getIntExtra("KEY_DECALAGE", 0)
affichageDecalage.text = decalage.toString()
}
}
}
...
register.launch(intentParam)
Le code fermant l'activité secondaire `TargetActivity` reste identique
## Exercice de synthèse
Réalisez une application réalisant les traitements suivants :
![](img/tuto4_exo.drawio.png)
img/intents.png

70,9 ko

Ce diff est replié.
img/tuto4.drawio.png

927 ko

img/tuto4_choix.png

84,6 ko

<mxfile host="Electron" modified="2023-01-10T11:17:39.516Z" agent="5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) draw.io/16.1.2 Chrome/96.0.4664.55 Electron/16.0.5 Safari/537.36" etag="2v923YY6jZdJGiQV54O9" version="16.1.2" type="device"><diagram id="cGBsuJXZXI4zIK4dVOHi" name="Page-1">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</diagram></mxfile>
\ No newline at end of file
img/tuto4_exo.drawio.png

80 ko

img/tuto4_main.png

81,9 ko

img/tuto4_param.png

76,6 ko

img/tuto4_result.png

79,7 ko

img/tuto4_sms.png

101 ko

Fichier ajouté
0% Chargement en cours ou .
You are about to add 0 people to the discussion. Proceed with caution.
Veuillez vous inscrire ou vous pour commenter