Vous êtes sur la page 1sur 14

TP Développement mobile GLSI 3

Imène ELGRAYAÂ
2021-2022
imene.grayaa@fst.utm.tn

TP4
Les activité

1. Introduction
Une application est un ensemble d'activités.
Une activité est l'action unique et ciblée que l'utilisateur peut faire.

La classe Activity s'occupe de créer une fenêtre dans laquelle vous


pouvez placer votre UI

2. Le fichier Manifest

Chaque projet d'application doit avoir un fichier AndroidManifest.xml à


la racine de l'ensemble source du projet.

Le fichier Manifest décrit les informations essentielles sur votre


application pour Android build tools, l’OS et Google Play.

<?xml version="1.0" encoding="utf-8"?>


<manifest
xmlns:android="http://schemas.android.com/apk/res/android"
package="com.fst.app">

<application
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:roundIcon="@mipmap/ic_launcher_round"
android:supportsRtl="true"
android:theme="@style/Theme.FSTApp">
<activity
android:name=".MainActivity"
android:exported="true">
<intent-filter>
<action android:name="android.intent.action.MAIN"
/>
<category
android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
</application>

</manifest>

Ce fichier doit déclarer ce qui suit :


A. Nom du Package: Les outils de build Android l'utilisent pour
déterminer l'emplacement des entités de code lors de la génération
de votre projet.
Dans notre exemple : package="com.fst.app"
B. Les permission dont l'application a besoin pour accéder aux parties
protégées du système ou à d'autres applications. Il déclare
également toutes les autorisations que les autres applications
doivent avoir si elles souhaitent accéder au contenu de cette
application.
C. Les composants de l'application qui incluent toutes les activités,
services, Broadcast Receivers, et les content providers.
Chaque composant doit définir des propriétés de base telles que le
nom de sa classe Kotlin ou Java.
Dans notre exemple on a une seule activité
<activity
android:name=".MainActivity"
android:exported="true">
<intent-filter>
<action
android:name="android.intent.action.MAIN" />
<category
android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
C.1. Les Intentes
Une intent est un message défini par un objet Intent qui décrit une
action à effectuer, y compris les données sur lesquelles agir, la
catégorie de composant qui doit effectuer l'action et d'autres
instructions.

2/14
Ce morceau de code sert à déterminer quelle est la première activité
lancée au lancement de l’application.
<intent-filter>
<action
android:name="android.intent.action.MAIN" />
<category
android:name="android.intent.category.LAUNCHER" />
</intent-filter>

3. Le Cycle de vie d'une activité

3/14
Le cycle de vie d’une activité commence par l’appel du fun
onCreate(Bundle)qu’on trouve déjà définie dans notre activité après la
création.
Une activité créée n’est pas forcément visible, elle peut être visible entre
l’appel du onStart() et onStop(),
Seulement entre les états durables de l’activité, onResume() et
onPause() , l’utilisateur peut interagir avec elle. On dit aussi qu'elle est en
train d'être exécutée.

A. Créer une autre activité dans ton projet:


File -> new -> Activity -> empty Activity

Donner comme nom : MyFirstScreen


Cocher Launcher Activity pour qu’elle devienne le 1er écran lancé.

B. Créer une autre activité dans ton projet:


File -> new -> Activity -> empty Activity
Donner comme nom : MySecondScreen

Ne pas cocher Launcher Activity

4/14
C. Ouvrir le fichier manifest pour voir le changement.
D. Dans activity_my_first_screen.xml ajouter le code suivant:

<TextView
android:id="@+id/myFirstScreenText"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintEnd_toEndOf="parent"
android:textSize="23sp"
android:layout_marginTop="50dp"
android:text="My first Activity"
android:layout_width="wrap_content"
android:layout_height="wrap_content"/>

<Button
android:id="@+id/startActivityBtn"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintTop_toBottomOf="@id/myFirstScreenText"
android:layout_width="0dp"
android:layout_margin="32dp"
android:textAllCaps="false"
android:text="Start new activity"
android:layout_height="wrap_content"/>

5/14
E. Dans le fichier activity_my_second_screen.xml ajouter le code
suivant

<TextView
android:id="@+id/mySecondScreenText"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="50dp"
android:text="My second Activity"
android:textSize="23sp"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" />

<Button
android:id="@+id/showToastBtn"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_margin="32dp"
android:text="Show toast"
android:textAllCaps="false"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@id/mySecondScreenTex"
/>

F. Ajouter des actions


1. Ouvrir le fichier MyFirstScreen dans la méthode onCreate()
on a l’association du layout activity_my_first_screen.xml à
l'activité par la ligne
setContentView(R.layout.activity_my_first_screen)

override fun onCreate(savedInstanceState: Bundle?) {


super.onCreate(savedInstanceState)
setContentView(R.layout.activity_my_first_screen)

//add your code here...

6/14
2. Ajouter ce code dans la fonction onCreate
val startActivityBtn: Button =
findViewById(R.id.startActivityBtn)
startActivityBtn.setOnClickListener {
val intent =
Intent(this,MySecondScreen::class.java)
startActivity(intent)
}

Info Kotlin:
val -> déclaration d’une valeur
var -> déclaration d’une variable
override -> surcharge des methode

3. Lancez L’app puis tapez sur le bouton Start new Activity.

G. Ajouter un Listener

startActivityBtn.setOnClickListener {
//code a executé }
Pour ajouter un événement à un composant on utilise les écouteurs.
Le code défini entre {} ne s'exécute que si notre écouteur détecte
l'événement souhaité.
Dans cet exemple on a un écouteur du clique OnClickListener

De la même façon ajouter une action au bouton afficher Toast.


Le code a exécuter par le listener est le suivant:

Toast.makeText(this, "Hello I'm a toast",


Toast.LENGTH_SHORT).show()

7/14
4. L'observation du cycle de vie d'une activité
A. Définir les valeurs tag

B. Dans MyFirstScreen et MySecondScreen ajouter les


codes suivants:
B.1. Dans onCreate après la ligne setContaintView:
Log.d(TAG,"onCreate")
B.2. après la fin de la méthode onCreate
override fun onResume() {
super.onResume()
Log.d(TAG,"onResume")
}

override fun onRestart() {


super.onRestart()
Log.d(TAG,"onRestart")
}

override fun onStart() {


super.onStart()
Log.d(TAG,"onStart")
}

override fun onPause() {


super.onPause()
Log.d(TAG,"onPause")
}
override fun onStop() {

8/14
super.onStop()
Log.d(TAG,"onStop")
}

override fun onDestroy() {


super.onDestroy()
Log.d(TAG,"onDestroy")
}

override fun onBackPressed() {


super.onBackPressed()
Log.d(TAG,"onBackPressed")
}

C. Ouvrir l'onglet Logcat

D. Lancer l’app est voir les logs:

E. Filtrer les logs par la début de notre tag ::: pour voir nos log
seulement:

F. Cliquer sur le bouton start new activity et observer les logs

G. Cliquer sur le bouton back du device et observer les


logs.

9/14
H. Pile d’activitées

Lorsque l'activité en cours démarre une autre, la nouvelle activité est


placée en haut de la pile et prend le focus.

L'activité précédente reste dans la pile, mais elle est arrêtée.

Lorsqu'une activité s'arrête, le système conserve l'état actuel de son


interface utilisateur (UI)

Lorsque l'utilisateur effectue l'action de retour, l'activité en cours est extraite


du haut de la pile (l'activité est détruite) et l'activité précédente reprend
(l'état précédent de son interface utilisateur est restauré).

5. Les boîtes de Dialogue simple:


A. Dans activity_my_second_screen.XML ajouter le bouton
suivant:

<Button
android:id="@+id/showDialogBtn"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_margin="32dp"
android:text="Show dialog"
android:textAllCaps="false"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"

app:layout_constraintTop_toBottomOf="@id/showToast
Btn" />
B. Dans Dans l’activité MySecondScreen définir l’action du bouton
showDialogBtn

10/14
C. Dans l’activité MySecondScreen ajouter la variable suivante
var myAnswer = ""

D. puis la fonction suivante:


private fun showDialog() {
val dialogBuilder = AlertDialog.Builder(this)
.setPositiveButton("Ok") {
view, which -> myAnswer = "ok"
}
.setNegativeButton("Cancel") { _, _ -> myAnswer =
"Cancel" }
.setTitle("My first Dialog")
.setMessage("Click a button")

dialogBuilder.show()

Info Kotlin:
.setPositiveButton(Label du bouton) {
Les paramètres du listener -> Action
}

E. Dans l’action du bouton showDialogBtn ajouter l’appel au fonction


showDialog()

F. Observer l’execution
6. Communication par resultat
A. Avant l'accolade fermant de l’activité ajouter le code suivant:
companion object{
const val RESULT_CODE = 1
}

Info Kotlin:
companion object{
....
}

C’est un objet compagnon accessible d’une façon statique par les autres
classes

11/14
B. Dans l’activité changer la ligne suivante
startActivityBtn.setOnClickListener {
val intent = Intent(this, MySecondScreen::class.java)
startActivity(intent)
}
par startActivityForResult(intent, RESULT_CODE)

C. Dans l’activité MySecondScreen Modifier les action des boutons du


dialogue
private fun showDialog() {
val dialogBuilder = AlertDialog.Builder(this)
.setPositiveButton("Ok") { view, which ->
setResult(Activity.RESULT_OK)
this.finish()
}
.setNegativeButton("Cancel") { _, _ ->
setResult(Activity.RESULT_CANCELED)
this.finish()
}
.setTitle("My first Dialog")
.setMessage("Click a button")
dialogBuilder.show()
}

D. Dans l’activité Ajouter la fonction suivante:

override fun onActivityResult(requestCode: Int, resultCode:


Int, data: Intent?) {
super.onActivityResult(requestCode, resultCode, data)
Log.d(TAG, "On onActivityResult: requestCode =
$requestCode,resultCode = $resultCode")
when (resultCode) {
Activity.RESULT_OK -> {
Log.d(TAG, "resultCode = RESULT_OK")

myFirstScreenText.text = "The answer is OK"


}
Activity.RESULT_CANCELED -> {
Log.d(TAG, "resultCode = RESULT_CANCELED")
myFirstScreenText.text = "The answer is Cancel"
}
else -> {
myFirstScreenText.text = "There is no answer
detected"
}
}
}

12/14
Travail demandé:
Créer un Activité qui contient 4 boutons : TP1,TP2,TP3,TP.
1. Au clique sur le bouton TP1 une boîte de dialogue se lance avec le titre
TP1 et un message “Installation et configuration” et avec un seul bouton
Ok.
2. Au clique sur le bouton P2 l’interface créé dans la partie travail
demandé du tp2 se lance.
Au clique sur le bouton confirm l’activité retourne un résultat
RESULT_OK et se ferme.
Sur l'écran principale on affiche un message toast “TP2 result Ok”

3. Au clique sur le bouton TP3 l’interface créé dans la partie travail


demandé du tp3 se lance.
Au clique sur le bouton ADD l’activité retourne un résultat RESULT_OK
et se ferme.
Sur l'écran principale on affiche un message toast “TP3 result Ok”

13/14
4. Au clique sur le bouton tp4 une boîte de dialogue se lance avec le titre
TP4 et un message “c’est le TP4” et avec un seul bouton Ok.

Bon travail 😁

14/14

Vous aimerez peut-être aussi