Vous êtes sur la page 1sur 51

Partie4

Mounia ABIK m.abik@um5s.net.ma


2020/2021
Objectifs du cours:
● l’utilisation d’Android pour le développement
d’applications pour terminaux mobiles et systèmes
embarqués, mettant en œuvre les mécanismes d’entrées/
sorties, des communications réseaux, des architectures
client/serveur et des bases de données.
● Créer et mettre en œuvre des interfaces utilisateurs orientées
événement.
● Mettre en œuvre le stockage de données sur des
périphériques
● Créer des applications utilisant les connexions HTTP, SMS,
Bluetooth, GPRS, …

Pr M.ABIK 2
Plan
● Introduction
● Présentation d’Android
● Historique, positionnement sur le marché..
● Architecture
● L’Environnement de développement
● Structure d’un projet Android
● Composants d’une application Android
● Cycle de vie d’une activité
● Création d’IHM
● inter process communication IPC (Intent, Service)
● Persistance des données
● Connectivité réseau, géolocalisation, Bluetooth
● Capteurs
● Dessin (Canevas et SurfaceView)
Composants IHM Avancée
● Certains composants graphiques permettent d'afficher
beaucoup d'items par des mécanismes de défilement:
Spiner Gallery GridView ListView/RecyclerView
AdapterView

AdapterView est une vue complexe qui contient plusieurs vues, et qui
nécessite un adaptateur pour construire ses vues filles
Adaptateur
● Les adaptateurs servent à gérer les données qui seront
affichées dans les vues qui composent l’adapterView
● Ils réalisent la liaison entre les sources de données
(tableau de string, BD, fournisseur de contenu…) et les
contrôles de l’interface utilisateur (via notre
AdapterView)
● Pour ajouter des éléments à un AdapterView (ListView,
Spinner…) on utilise des adaptateurs.
Liste & Adapter
Adaptateur(suite)
➔Android propose des adapters génériques que le
développeur peut utiliser pour afficher des
informations dans un élément de groupe
➔ BaseAdapter pour créer des adaptateurs personnalisés et c’est la
base des autres adapter :
➔ ArrayAdapter pour tous type de tableaux
➔ Cursor Adapter pour traiter les données de type cursor

➔ …
➔Le développeur peut définir son propre adapter pour
personnaliser l’affichage
Ex: Simple ListView
La méthode principale
est le getView qui crée
les vues pour la
listeView (avec
recyclage)

R.layout.simple_list_item_1
Adaptateur Personnalisé
Permet le recyclage des vues (quand le
nombre d’item > la taille de l’affichage de
l’écran)
Si Null : on doit construire une nouvelle
Si le contenu de la liste est plus complexe qu’un simple TextView
vue
(ex: image text …) il faut définir votre propre adapter en
Sinon : contient la valeur de la vue qui
respectant ces étapes: vient de disparaître. on peut modifier cette
position de
le layout auquel est vue pour l'élément demandé
1.Définir un layout qui représente une vue (qui va s’afficher sur
rattaché la vuel'item dans la
une ligne) liste
2.Créer une classe qui étend un adaptateur générique
(ArrayAdapter…)
1. Redéfinir la méthode getView(int position, View convertView,
ViewGroup parent) qui est appelée à chaque fois qu'un item est
affiché à l'écran. Permet de retourner pour chaque élément de
l’Adapterview un objet view
Adaptateur Personnalisé(Suite)
● Utiliser la classe statique interne ViewHolder qui permet de
charger les données dans la vue pour l’afficher dans la
ListView. C’est un objet attaché à chaque ligne de la
ListeView
static class ViewHolder 

Ex: On suppose que notre
{ 

layout contient des lignes de
public TextView label ;

trois view : la source de
public TextView desc; 

données contient des éléments
public ImageView img; 

composés de trois données
} 

Principe de fonctionnement (getView):
1. convertView est Null (la vue n’est pas dans le cache de listView):
● on initialise le convertView, en appelant la méthode inflate pour charger notre layout xml 

dans un objet View
convertView = inflater.inflate(R.layout.item, null);
● on crée une instance (holder) de la classe ViewHolder qui permettra d’initialiser 

le contenu d’un item de la liste une première fois et associe les composants de notre layout 

dans le holder
holder = new ViewHolder()
Ex : holder.label = (TextView)convertView.findViewById(R.id.label)
● Sauvegarder (en mémoire) cette valeur dans un tag attaché à l’objet convertView
convertView.setTag(holder)
2. convertView n’est pas Null
● réutilisation un holder déjà existant
holder = (ViewHolder) convertView.getTag();
3. On rempli le holder (dans les deux cas)
ex: holder.label.setText(Source.get(position).getlabel());
Dans class ArrayEtablissementAdapter:
Au niveau de la classe qui va afficher la ListView:

//liason entre la source des données (Etablissements) et les controles du layout item � afficher

adapter = new ArrayEtablissementAdapter(this, R.layout.item, Etablissements);


//L'association entre la ListView et l'Adapter
l = (ListView) findViewById(R.id.listview);
//// Binding resources Array to ListAdapter
l.setAdapter(adapter);

<ListView
android:id="@+id/listview"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
tools:ignore="MissingConstraints" />
RecyclerView
● En 2014 (android Lollipop) a introduit le concept de
RecycleView ayant les mêmes objectifs que Listview.. du
système android
● C’est une bibliothèque qui n’est pas dans le noyau mais
assure une compatibilité avec les anciennes version
d’android
● Ceci permet à google de faire des mises à jour à cette
bibliothèque tout en assurant la compatibilité avec toutes
les versions d’android.
● Plus riche que ListView mais un peu plus compliqué
● Les fonctionnalités de base sont assez similaires que ListView
RecyclerView
● LayoutManager est le responsable de l’organisation des
vues ( verticale , horizontale ou une grille ) et du
défilement ainsi que le recyclage.
● RecyclerView support 3 types de LayoutManager :
LinearLayoutManager, StraggeredLayoutManager et
GridLayoutManager
● Recycleview nous force à utiliser les bonnes manières
pour implémenter la liste
● Ex: force l’usage du Viewholder (RecyclerView.ViewHolder)
● Possibilité de mettre des animations
● RecyclerView.ItemAnimator
RecyclerView
● Pour créer une liste avec RecycleView on a besoin d’:
● ajouter le recyclerView au layout d’affichage
● ajouter un layout pour chaque vue à afficher (ex ligne de la
liste)
● Ajouter un adapter qui fait la liaison entre la vue de la liste et la
donnée du data list. Cette classe étend Recyclerview.Adapter
avec un ViewHolder:
● onCreateViewHolder qui inflate le layout et le passe au view

holder
● onBindViewHolde qui associe les données aux vues à l’aide du

view holder

https://developer.android.com/reference/android/support/v7/widget/RecyclerView.Adapter.html
https://google-developer-training.gitbooks.io/android-developer-fundamentals-course-concepts/content/en/
Unit%202/44_c_recyclerview.html
Activité 5:
RecyclerView
Tp :Consignes sur ClassRoom
public class MyAdapter extends RecyclerView.Adapter<MyAdapter.MyViewHolder> {

private final ArrayList Etablissements ;

public MyAdapter( ArrayList Etablissements) {


this.Etablissements = Etablissements ;
}
@Override
// retournele nb total de cellule que contiendra la liste

public int getItemCount() {


return Etablissements.size();
}

public MyViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {


LayoutInflater inflater = LayoutInflater.from(parent.getContext());
View view = inflater.inflate(R.layout.item, parent, false);
return new MyViewHolder(view); }

@Override
//Inflate le layout et l’associe au view holder
public void onBindViewHolder(MyViewHolder holder, int position) {
Etablissement Etab= (Etablissement) Etablissements.get(position);
holder.name.setText(Etab.getname());
holder.label.setText(Etab.getlabel());
holder.img.setImageResource(Etab.getimage()); }

public class MyViewHolder extends RecyclerView.ViewHolder {


private final TextView label;
private final TextView name;
private final ImageView img;
private Etablissement currentEtab;

public MyViewHolder(final View itemView) {


super(itemView);
label = itemView.findViewById(R.id.label);
name = itemView.findViewById(R.id.name);
img= itemView.findViewById(R.id.img);
//quand on click sur l'etablissement
itemView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
currentEtab = (Etablissement) Etablissements.get(getLayoutPosition());
new AlertDialog.Builder(itemView.getContext())
.setTitle(currentEtab.getlabel())
Fragment
● La taille des écrans devient de plus en plus grande
(tablette, télévisions connectées…)
● une application android est destinée à être exécutée sur
ces différents devices.
● Besoin d’exploiter l’espace efficacement sur chacune de
ces plates-formes.
● Google a introduit le fragment à partir des versions 3.X
et a développé aussi une bibliothèque de compatibilité
les version inférieurs de 3.X
● android.support.v4.app.fragment
Ex

Dupliquer les codes et créer deux interfaces ( pour téléphone et pour mobile)
Fragment
● Un Fragment est un composant autonome avec sa propre interface utilisateur
(UI) et son propre cycle de vie qui peut être réutilisé dans différentes parties
de l'interface utilisateur d'une application.
● Fragment peut également être utilisé sans interface utilisateur, afin de
conserver les valeurs malgré les modifications de configuration,

● Les fragments permettent de définir des morceaux d’interfaces, un ensemble


de vues, qu’il est possible de contrôler et de réutiliser sur plusieurs écrans.
● Plusieurs fragments peuvent être combinés dans une seule activité pour
construire une interface à plusieurs volets (multi-pane)
● Un fragment peut être réutilisé dans plusieurs activités
Fragment(Suite)
● Un fragment
● a son propre cycle de vie, mais directement affecté par
celui de son hôte
● reçoit ses propres entrées
● peut être ajouté ou enlevé dynamiquement pendant que
l’activité s’exécute

● Peut être ajouté à l’activité


● Dans le fichier Layout XML par <fragment>
● Dans le code de l’application en l’ajoutant à un
conteneur (ViewGroup) existant via le FragmentManager
Exemple Fragment
Exemple Fragment (suite)
● Fragment : créer les 2 fragments + layouts associés

● Dans l’activité principale on intègre les fragments


● Cette activité est associée à son layout qui contient un
conteneur qui va intégrer le fragment
Exemple Fragment(suite)
Activité 5:
RecyclerView
Tp :Consignes sur ClassRoom
Material Design

https://material.io/
Communication entre applications

Suite

● Intent (filter) : délégué au système le choix de


l’application (usage des Intent-Filters)
● Broadcast Receivers : Permettent de recevoir des intents
● sendBroadcast(intent) qui envoie un intent à tous les
composants Broadcast Receivers intéressés
● Services: startService(intent) ou bindService(intent, …)
pour communiquer avec un service en arrière plan (local
ou distant).
Intent: Déléguer au système le choix de
l’application
● Vous pouvez envoyer une intention et demander au
système de choisir le composant le plus approprié pour
exécuter l’action transmise.

Ex: Composer un numéro de téléphone


Intent: Solliciter d’autres applications
Pour décider du composant le plus
approprié, le système se base sur les
informations que vous spécifiez dans
votre objet Intent : action, données,
catégorie, etc.

S i p l u s i e u r s co m p o s a n t s s o n t
enregistrés pour une même action…,
un choix est présenté à l’utilisateur

Si aucune application n’est disponible et que la vérification n’est pas effectuée alors
l’application plante
Si aucune application n’est disponible

Renvoie le composant d'activité à utiliser pour gérer l’intention


EX: Intent Implicite

● Activité A crée un intent avec une description de


l'action et passe à startActivity () .
● Le système Android recherches toutes les applications
pour un filtre intention qui correspond à
l'intention. Lorsqu'une correspondance est trouvée,
● le système démarre l'activité de correspondance ( activité B ) en
invoquant onCreate ()
Filtres d’intents
● Android permet aux applications de spécifier quelles
sont les actions qu’elles gèrent : le système peut ainsi
choisir le composant le mieux adapté au traitement
d’une action (véhiculée dans un objet Intent).
Intents et Intent-Filters:
● L’utilisation d’une activité (ou d’un service) se fait par
une requête auprès du système android.
● chaque activité (ou service) déclare les
fonctionnalités(actions) pour lesquelles elle est
disponible (intent filter).

Lorsqu’une application désire utiliser une


fonctionnalité(action), elle déclare son intention de le
faire (intent), le système android détermine et démarre
l’activité/service correspondant
Intent: Les actions natives
Intent-Filters
● Dans un filtre on met:
● L’action: identifiant unique (chaine de caractère)

● Catégorie: premier niveau de filtrage de l’action. Elle


définit le contexte de l’action (n’est pas obligatoire dans
un intent)
Intent-Filters
EX :
●Une application Android est constituée de composants
logiciels faiblement couplés qui correspondent chacune à
une activité indépendante (cf Manifest)

●Parmi ces activités, l’une est plus importante que les


autres : elle apparait dans le intent-filter avec la catégorie
«launcher ».
Intent-Filters (suite)
● Données: Il est possible de préciser plusieurs informations sur les
données que cette activité peut traiter. Ex préciser le type MIME
avec android:mimeType, préciser le nom de domaine via l’attribut
android:host.
EX:
<data android:mimeType="text/plain" android:host="ensias.ma" />
Permissions liées aux actions
● Certaines actions ont besoin des privilèges spéciaux à

Ajouter des permissions dans le AndroidManifest

● Ex Pour l’action ACTION_CALL on ajoute


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

</manifest>
Broadcast Intent
● L’objectif de l’intent est de demander à un autre composant
de traiter son action
● L’objectif du Broadcast Intent est de prévenir les autres
applications qu’un évènement est survenu (pour les
intéressés)
● C’est des intents anonymes et diffusés à tout le système
● Très utilisé au niveau système pour transmettre des
informations: appel entrant, réseau WI-FI connecté, état
batterie…
● Usage d’un système de filtrage pour déterminer qui peut
recevoir l'intent
Broadcast Intent/ Broadcast Receiver
● Etapes de diffusions et réception d’intent
Etape 1 : diffuser l’intent
● sendBroadcast (intent) : envoie l’intent au système

Public void doBroadcast(){


Intent intent = new Intent("com.exemple. MON_INTENT ");
Intent.putExtra("extra", "hello")
sendBroadcast(intent)
}
Broadcast Intent/ Broadcast Receiver
Etape 2: recevoir et traiter l’intent diffusé
● Ecouter le flux de message via la methode
BroadcastReceiver
● Ajoutez une classe qui dérive de BroadcastReceiver (pas IHM
associé) et implémenter le onReceiver
● À Chaque reception de message il y a appel de la
methode onReceive par le système (l’application n a pas
besoin d’etre en exécution)
Broadcast Intent/ Broadcast Receiver
● Enregistrez le récepteur de diffusion:
Ajouter dans le manifeste le composant receiver portant le
nom de la classe qui dérive de BroadcastReceiver

Le récepteur écoutera
android:name="com.exemple. MON_INTENT" /> toujours l’événement
même si l'application
est détruite
Sécurité
● N'importe quelle application peut envoyer des
broadcast intents à votre receiver, ce qui est une
faiblesse au niveau sécurité.

Vous pouvez faire en sorte que votre receiver déclaré dans


le Manifest ne soit accessible qu'à l'intérieur de votre
application en lui ajoutant l'attribut
android:exported="false" .
● On peut aussi ajouter une permission au niveau de
sendBroadcast ainsi seuls les receivers qui déclarent
cette permission pourront recevoir ces broadcast
intents

● Puis dans le Manifest, il suffit de rajouter :


Composant applicatif: Service
● Un service est un composant d'application qui peut
exécuter des opérations en arrière-plan et ne fournit pas
d'interface utilisateur. android.app.Service
● Un autre composant d'application peut démarrer un service
et il continue à s'exécuter en arrière-plan même si
l'utilisateur passe à une autre application.
● un composant peut se lier à un service pour interagir avec
lui et même effectuer la communication interprocessus
(IPC)
● Ex un service peut gérer des transactions réseau, lire de la
musique, effectuer des E / S de fichiers ou interagir avec un
fournisseur de contenu, tous cela en arrière-plan.
Service
● Deux types de services
● LocalService : Services qui s’exécutent dans le même
processus que votre application.
● RemoteService : Ils s’exécutent dans des processus
indépendants de votre application.
Cycle de vie du service
Similaire au cycle de vie de l’activité, il peut être contrôlé par
d’autres applications (activités, services …)

http://developer.android.com/reference/android/
app/Service.html
https://google-developer-training.github.io/android-developer-fundamentals-
course-concepts/en/
-https://developer.android.com/courses/fundamentals-training/overview-v2
- https://corp.beapp.fr/expertises/questions-frequentes/difference-entre-web-
app-application-native-hybride
- https://developer.android.com/training/testing/index.html
-Livre : Programmation Android. Damien Guignard, Julien Chable, Emmanuel
Robel
-https://openclassrooms.com/courses/creez-des-applications-pour-android/
-https://codelabs.developers.google.com/

http://grail.cba.csuohio.edu/~matos/notes/cis-493/lecture-notes/slides/Android-
Chapter12-Files%20and%20Preferences.pdf

https://developer.android.com/reference/android/view/SurfaceHolder

Vous aimerez peut-être aussi