android_introduction 1 android: introduction, présentation notes de cours jean-michel douin, douin...
TRANSCRIPT
![Page 1: Android_Introduction 1 Android: Introduction, présentation Notes de cours jean-michel Douin, douin au cnam point fr version : 20 Février 2013](https://reader035.vdocument.in/reader035/viewer/2022081602/551d9dba497959293b8dde21/html5/thumbnails/1.jpg)
Android_Introduction1
Android: Introduction, présentation
Notes de cours
jean-michel Douin, douin au cnam point frversion : 20 Février 2013
![Page 2: Android_Introduction 1 Android: Introduction, présentation Notes de cours jean-michel Douin, douin au cnam point fr version : 20 Février 2013](https://reader035.vdocument.in/reader035/viewer/2022081602/551d9dba497959293b8dde21/html5/thumbnails/2.jpg)
Android_Introduction2
Sommaire
• Intergiciel (middleware)– Les éléments de base
• Android OS comme intergiciel– Applications et évènements gérés par le middleware– Approche déclarative– Composants, classes de base
• Activity,• BroadcastReceiver,• Service,• ContentProvider,• Intent.
– Patrons de utilisés• Fabrique méthode• MVC, Modèle Vue Contrôleur• Façade• Procuration• Médiateur• Stratégie• …
![Page 3: Android_Introduction 1 Android: Introduction, présentation Notes de cours jean-michel Douin, douin au cnam point fr version : 20 Février 2013](https://reader035.vdocument.in/reader035/viewer/2022081602/551d9dba497959293b8dde21/html5/thumbnails/3.jpg)
Android_Introduction3
Bibliographie utilisée… à compléter
Mobile Middleware, Architecture, Patterns and Practice, Sasu Tarkoma,ed. Wiley 2009
[Sheng-De Wang]Le point de départ de ce support Auteur: Prof. Sheng-De Wang
http://intw2-2010.cs.pu.edu.tw/a1.ppthttp://0xlab.org/~jserv/android-binder-ipc.pdf
[Sch06]Le site de douglas Schmidthttp://www.cs.wustl.edu/~schmidt/patterns.htmlce site http://www.cs.wustl.edu/~schmidt/POSA/
[Kra06]La présentation de S. Krakowiak faite à l ’école d ’été ICAR 2006
http://sardes.inrialpes.fr/ecole/2006/http://www2.lifl.fr/icar/Chapters/Intro/intro.html
[VKZ05]le site de Uwe Zdun : http://www.infosys.tuwien.ac.at/Staff/zdun/
ce livre : http://www.infosys.tuwien.ac.at/Staff/zdun/remotingPatterns/index.html
ce support http://www.infosys.tuwien.ac.at/Staff/zdun/teaching/evs/evs.pdf
informations générales http://www.edlin.org/cs/patterns.html
http://www.powershow.com/view/133aa5-MjUxY/Mobile_Middleware_Course_Principles_and_Patterns_Sasu_Tarkoma_powerpoint_ppt_presentation
http://developer.android.com/resources/index.html
![Page 4: Android_Introduction 1 Android: Introduction, présentation Notes de cours jean-michel Douin, douin au cnam point fr version : 20 Février 2013](https://reader035.vdocument.in/reader035/viewer/2022081602/551d9dba497959293b8dde21/html5/thumbnails/4.jpg)
Android_Introduction4
Introduction
• Intergiciel, fonctionnalités attendues
• Android– Un premier aperçu en quelques diapositives
• Le vocable
• Architecture logicielle
• Le simulateur, les API
• Une démonstration
![Page 5: Android_Introduction 1 Android: Introduction, présentation Notes de cours jean-michel Douin, douin au cnam point fr version : 20 Février 2013](https://reader035.vdocument.in/reader035/viewer/2022081602/551d9dba497959293b8dde21/html5/thumbnails/5.jpg)
Android_Introduction5
Tendances, historique
• [Sch06]
RTP
DNS
HTTP
UDP TCP
IP
TELNET
Ethernet ATM FDDI
Fibre Channel
FTP
INTERNETWORKING ARCH
TFTP
20th CenturyWin2K Linux LynxOS
Solaris VxWorks
Middleware
MiddlewareServices
MiddlewareApplications
MIDDLEWARE ARCH
21st Century
![Page 6: Android_Introduction 1 Android: Introduction, présentation Notes de cours jean-michel Douin, douin au cnam point fr version : 20 Février 2013](https://reader035.vdocument.in/reader035/viewer/2022081602/551d9dba497959293b8dde21/html5/thumbnails/6.jpg)
Android_Introduction6
Fonctions attendues de l ’intergiciel
• de [Kra06]
• Proposer une API de haut Niveau
– Masquer l ’hétérogénéité
– Rendre la répartition invisible
– Faciliter la programmation répartie
Fonctions orientées: Réseau « fixe », internet, web, SOA
![Page 7: Android_Introduction 1 Android: Introduction, présentation Notes de cours jean-michel Douin, douin au cnam point fr version : 20 Février 2013](https://reader035.vdocument.in/reader035/viewer/2022081602/551d9dba497959293b8dde21/html5/thumbnails/7.jpg)
Android_Introduction7
Intergiciel et mobile
• Sécurité– Confidentialité, intégrité, contrôle des informations par l’utilisateur
• Mobile comme « Baie d’accueil » des applications– Installation, au sein d’un « sandbox »
• Liste des applications, annuaire,– Eligibilité, sélection de la « bonne » application,– Découverte au « run time » d’un service
• Déploiement, mise à jour, maintenance– Substitution d’une application par une autre
• Communication– Réseaux
• communications synchrones, asynchrones, interruptions de services• Notifications inhérentes: sms, push …
• Persistance– Embarquée
• Consommation– Batterie
![Page 8: Android_Introduction 1 Android: Introduction, présentation Notes de cours jean-michel Douin, douin au cnam point fr version : 20 Février 2013](https://reader035.vdocument.in/reader035/viewer/2022081602/551d9dba497959293b8dde21/html5/thumbnails/8.jpg)
Android_Introduction8
Android
• Sécurité– Linux, processus …
• Mobile comme « Baie d’accueil » des applications– Un processus une application une DVM (Dalvik Virtual Machine)
• (Vue logique), « sandbox » inhérent
• Déploiement, mise à jour, maintenance– Prise en charge par l’intergiciel
• Communication– Interne, externe -> intergiciel, sms, push …
• Persistance– -> intergiciel, SQLLite
![Page 9: Android_Introduction 1 Android: Introduction, présentation Notes de cours jean-michel Douin, douin au cnam point fr version : 20 Février 2013](https://reader035.vdocument.in/reader035/viewer/2022081602/551d9dba497959293b8dde21/html5/thumbnails/9.jpg)
Android_Introduction9
Android les grandes lignes
• Composants Android• Outils de Développement• Architecture Logicielle
• Développement – en java avec quelques directives et configurations en syntaxe XML
• Un exemple, une démonstration– Un exemple en quelques lignes de java et d’XML
![Page 10: Android_Introduction 1 Android: Introduction, présentation Notes de cours jean-michel Douin, douin au cnam point fr version : 20 Février 2013](https://reader035.vdocument.in/reader035/viewer/2022081602/551d9dba497959293b8dde21/html5/thumbnails/10.jpg)
Android_Introduction10
Composants Android
• Linux– Processus / DVM / Application
• Framework de déploiement d’applications– De nombreuses librairies,
• Navigateur intégré, WebKit ( webkit utilisé par safari, Google Chrome…)
• SQLite
• En natif, pilotes– Dépendant du matériel
• GSM• Bluetooth, EDGE, 3G, WiFi• Caméra, GPS, boussole et accéléromètre• Température, • …
![Page 11: Android_Introduction 1 Android: Introduction, présentation Notes de cours jean-michel Douin, douin au cnam point fr version : 20 Février 2013](https://reader035.vdocument.in/reader035/viewer/2022081602/551d9dba497959293b8dde21/html5/thumbnails/11.jpg)
Android_Introduction11
Outils de développement
• SDK Android–En ligne de commandes–Plug-in sous eclipse
–Émulateur–Débogueur–Traces fines d’exécution–Tests unitaires–Outils de mise au point
•Mesure de mémoire et performance
![Page 12: Android_Introduction 1 Android: Introduction, présentation Notes de cours jean-michel Douin, douin au cnam point fr version : 20 Février 2013](https://reader035.vdocument.in/reader035/viewer/2022081602/551d9dba497959293b8dde21/html5/thumbnails/12.jpg)
Android_Introduction12
Framework ou baie d’accueil des applications
• Source : http://www.linuxjournal.com/
![Page 13: Android_Introduction 1 Android: Introduction, présentation Notes de cours jean-michel Douin, douin au cnam point fr version : 20 Février 2013](https://reader035.vdocument.in/reader035/viewer/2022081602/551d9dba497959293b8dde21/html5/thumbnails/13.jpg)
Android_Introduction13
Architecture et API
http://developer.android.com/guide/basics/what-is-android.html
![Page 14: Android_Introduction 1 Android: Introduction, présentation Notes de cours jean-michel Douin, douin au cnam point fr version : 20 Février 2013](https://reader035.vdocument.in/reader035/viewer/2022081602/551d9dba497959293b8dde21/html5/thumbnails/14.jpg)
Android_Introduction14
Développement
• Développement
– En java, configurations en syntaxe XML
• Une configuration de l’application– AndroidManifest.xml
• Une déclaration de ressources en XML – comme l’IHM ou des String
» res/layout/hello_web_view.xml
» res/values/strings.xml
![Page 15: Android_Introduction 1 Android: Introduction, présentation Notes de cours jean-michel Douin, douin au cnam point fr version : 20 Février 2013](https://reader035.vdocument.in/reader035/viewer/2022081602/551d9dba497959293b8dde21/html5/thumbnails/15.jpg)
Android_Introduction15
Développement 1/2Fichier de configuration, AndroitManifest.xml
<?xml version="1.0" encoding="utf-8"?><manifest xmlns:android="http://schemas.android.com/apk/res/android" package="test.biblio" android:versionCode="1" android:versionName="1.0">
<uses-permission android:name="android.permission.INTERNET" />
<application android:icon="@drawable/icon" android:label="@string/app_name"> <activity android:name=".Demo" android:label="@string/app_name">
<intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity>
</application>
</manifest>
![Page 16: Android_Introduction 1 Android: Introduction, présentation Notes de cours jean-michel Douin, douin au cnam point fr version : 20 Février 2013](https://reader035.vdocument.in/reader035/viewer/2022081602/551d9dba497959293b8dde21/html5/thumbnails/16.jpg)
Android_Introduction16
Premier exemple support Sheng Wang
package com.android.webviews;
import android.app.Activity;
import android.os.Bundle;
import android.view.KeyEvent;
import android.webkit.WebView;
import android.webkit.WebViewClient;
public class HelloWebView extends Activity {
/** Called when the activity is first created. */
WebView webview;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
webview = (WebView) findViewById(R.id.webview);
webview.getSettings().setJavaScriptEnabled(true);
webview.loadUrl("http://www.cnam.fr");
webview.setWebViewClient(new HelloWebViewClient());
}
![Page 17: Android_Introduction 1 Android: Introduction, présentation Notes de cours jean-michel Douin, douin au cnam point fr version : 20 Février 2013](https://reader035.vdocument.in/reader035/viewer/2022081602/551d9dba497959293b8dde21/html5/thumbnails/17.jpg)
Android_Introduction17
Suite de l’exemple
@Overridepublic boolean onKeyDown(int keyCode, KeyEvent event) { if ((keyCode == KeyEvent.KEYCODE_BACK) && webview.canGoBack()) { webview.goBack(); return true; } return super.onKeyDown(keyCode, event);}
private class HelloWebViewClient extends WebViewClient { @Override public boolean shouldOverrideUrlLoading(WebView view, String url) { view.loadUrl(url); return true; }}
}
![Page 18: Android_Introduction 1 Android: Introduction, présentation Notes de cours jean-michel Douin, douin au cnam point fr version : 20 Février 2013](https://reader035.vdocument.in/reader035/viewer/2022081602/551d9dba497959293b8dde21/html5/thumbnails/18.jpg)
Android_Introduction18
Démonstration
• Démonstration
Puis • Les composants essentiels
![Page 19: Android_Introduction 1 Android: Introduction, présentation Notes de cours jean-michel Douin, douin au cnam point fr version : 20 Février 2013](https://reader035.vdocument.in/reader035/viewer/2022081602/551d9dba497959293b8dde21/html5/thumbnails/19.jpg)
Android_Introduction19
Vocabulaire
• Les Essentiels
– Activity• Une activité est associé à une IHM
– BroadcastReceiver• Réception d’un message transmis par Android
– Service• Une tache de fond sans IHM
– ContentProvider• La persistance des données
– Intent• Les notifications
– IntentFilter• Les filtres des notifications candidates
![Page 20: Android_Introduction 1 Android: Introduction, présentation Notes de cours jean-michel Douin, douin au cnam point fr version : 20 Février 2013](https://reader035.vdocument.in/reader035/viewer/2022081602/551d9dba497959293b8dde21/html5/thumbnails/20.jpg)
Android_Introduction20
Introduction … Classes
• Activity– Associée à une interface utilisateur
• Cycle de vie (démarrée, en pause, arrêtée, détruite…)– Peut démarrer d’autres activités, émet des évènements(intentions, intent)
• Une configuration de type XML, permissions, librairies,
• BroadcastReceiver– Bus de messages– Émission et réception d’intentions (intent)
• Service– Pas d’interface, un service à rendre, en tâche de fond– Intention de servir, langage commun aux clients et au service
• ContentProvider– Données rendues persistantes ( pour d’autres applications)– Un fichier, base SQLite
• Intent– Notifications,
• IntentFilter– Critères de sélection, éligibilité, mécanisme de résolution
![Page 21: Android_Introduction 1 Android: Introduction, présentation Notes de cours jean-michel Douin, douin au cnam point fr version : 20 Février 2013](https://reader035.vdocument.in/reader035/viewer/2022081602/551d9dba497959293b8dde21/html5/thumbnails/21.jpg)
Android_Introduction21
Application
• Une application peut être constituée de plusieurs écrans,
• A chaque écran lui correspond une activité,
• Une activité hérite et redéfinit certaines méthodes– onCreate, -> …, onPause, -> …, onStop, ->…onDestroy, -> …
• Android se charge des appels de ces méthodes– Un état de l’activité est donc induit par l’exécution de ces méthodes
• Inversion de contrôle – (cf. M.Fowler) http://martinfowler.com/articles/injection.html– Android impose un cycle de vie, un état de l’activité
![Page 22: Android_Introduction 1 Android: Introduction, présentation Notes de cours jean-michel Douin, douin au cnam point fr version : 20 Février 2013](https://reader035.vdocument.in/reader035/viewer/2022081602/551d9dba497959293b8dde21/html5/thumbnails/22.jpg)
Android_Introduction22
Architecture, vocabulaire
• Source : http://developer.android.com/guide/topics/fundamentals.html
• Application– Activity– Service– ContentProvider– BroadcastReceiver
![Page 23: Android_Introduction 1 Android: Introduction, présentation Notes de cours jean-michel Douin, douin au cnam point fr version : 20 Février 2013](https://reader035.vdocument.in/reader035/viewer/2022081602/551d9dba497959293b8dde21/html5/thumbnails/23.jpg)
Android_Introduction23
public class android.app.Activity
package android.app;
public class Activity extends ApplicationContext {
protected void onCreate(Bundle savedInstanceState){
protected void onStart(); protected void onRestart();
protected void onResume();
protected void onPause();
protected void onStop();
protected void onDestroy();
… etc …
} induit un cycle de vie imposé par le « framework »
![Page 24: Android_Introduction 1 Android: Introduction, présentation Notes de cours jean-michel Douin, douin au cnam point fr version : 20 Février 2013](https://reader035.vdocument.in/reader035/viewer/2022081602/551d9dba497959293b8dde21/html5/thumbnails/24.jpg)
Android_Introduction24
Inversion de Contrôle… Rappel
public class Activity extends ApplicationContext {
protected void onCreate(Bundle savedInstanceState);
protected void onStart(); …..}
Android, middleware
http://developer.android.com/reference/android/app/Activity.html
onCreate(..)onStart();
Activités activité_1 Activité 2 Activité 3
…activité_1 = new Activité_1();activité_1.onCreate();activité_1.onStart();….
![Page 25: Android_Introduction 1 Android: Introduction, présentation Notes de cours jean-michel Douin, douin au cnam point fr version : 20 Février 2013](https://reader035.vdocument.in/reader035/viewer/2022081602/551d9dba497959293b8dde21/html5/thumbnails/25.jpg)
Android_Introduction25
Le cycle de vie d’une activité
• Séquencement des appels imposé par le système
![Page 26: Android_Introduction 1 Android: Introduction, présentation Notes de cours jean-michel Douin, douin au cnam point fr version : 20 Février 2013](https://reader035.vdocument.in/reader035/viewer/2022081602/551d9dba497959293b8dde21/html5/thumbnails/26.jpg)
Android_Introduction26
Activité son état
• http://inandroid.in/archives/tag/activity-lifecycle• Attention une application dans l’état Paused ou Stopped peut être supprimé par Android
![Page 27: Android_Introduction 1 Android: Introduction, présentation Notes de cours jean-michel Douin, douin au cnam point fr version : 20 Février 2013](https://reader035.vdocument.in/reader035/viewer/2022081602/551d9dba497959293b8dde21/html5/thumbnails/27.jpg)
Android_Introduction27
Un exemple: une très petite IHM
Une « IHM »
• Un bouton, un écouteur, un clic et l’heure est affichée !
• En approche traditionnelle• Tout est codé en Java IHM comprise
– En approche déclarative• Usage d’XML pour la configuration, de java pour l’utilisation
![Page 28: Android_Introduction 1 Android: Introduction, présentation Notes de cours jean-michel Douin, douin au cnam point fr version : 20 Février 2013](https://reader035.vdocument.in/reader035/viewer/2022081602/551d9dba497959293b8dde21/html5/thumbnails/28.jpg)
Android_Introduction28
Activity Un Click et l’heure est actualisée
import android.app.Activity; import android.os.Bundle; import static android.view.View.OnClickListener ; import android.widget.Button; import java.util.Date;
public class Now extends Activity implements OnClickListener { private Button buttonNow;
@Override public void onCreate(Bundle bundle) { super.onCreate(bundle); buttonNow = new Button(this); // <- un bouton buttonNow.setOnClickListener(this);// <- un écouteur auprès de cette vue
setContentView(buttonNow); // <- le bouton devient la vue, l’écran }
public void onClick(View view) { // <- à chaque click buttonNow.setText(new Date().toString()); } }
Est-ce une vue apparentée swingEt ici un MVC à lui tout seul … ? discussion
![Page 29: Android_Introduction 1 Android: Introduction, présentation Notes de cours jean-michel Douin, douin au cnam point fr version : 20 Février 2013](https://reader035.vdocument.in/reader035/viewer/2022081602/551d9dba497959293b8dde21/html5/thumbnails/29.jpg)
Android_Introduction29
Activity-bis Un Click et l’heure est actualisée
• Approche « déclarative », – res/layout/activity_now.xml
– Balise XML <Button attribut android:onClick
– Le fichier res/layout/activity_now.xml<Button xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/buttonNowId"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:text="Now"
android:onClick="onClick" />
![Page 30: Android_Introduction 1 Android: Introduction, présentation Notes de cours jean-michel Douin, douin au cnam point fr version : 20 Février 2013](https://reader035.vdocument.in/reader035/viewer/2022081602/551d9dba497959293b8dde21/html5/thumbnails/30.jpg)
Android_Introduction30
L’activity devient (version déclarative)
public class NowActivity extends Activity { private Button buttonNow;
protected void onCreate(Bundle bundle) { super.onCreate(bundle);
// Vue issue du fichier XML, fichier R.java est généré automatiquement // R.java installe un accès en java aux ressources décrite en XML setContentView(R.layout.activity_now);
// Button, identifié par un Id, est issu du fichier XML buttonNow = (Button)findViewById(R.id.buttonNowId); }
// l’attribut onClick a ce nom de méthode comme valeur public void onClick(View view) { buttonNow.setText(new Date().toString()); }
}
![Page 31: Android_Introduction 1 Android: Introduction, présentation Notes de cours jean-michel Douin, douin au cnam point fr version : 20 Février 2013](https://reader035.vdocument.in/reader035/viewer/2022081602/551d9dba497959293b8dde21/html5/thumbnails/31.jpg)
Android_Introduction31
Discussion MVC ?
• Démonstration
• Discussion MVC ?
– Modèle ?
– Vue ?
– Contrôleur ?
![Page 32: Android_Introduction 1 Android: Introduction, présentation Notes de cours jean-michel Douin, douin au cnam point fr version : 20 Février 2013](https://reader035.vdocument.in/reader035/viewer/2022081602/551d9dba497959293b8dde21/html5/thumbnails/32.jpg)
Android_Introduction32
MVC discussion suite
• http://java.sun.com/blueprints/guidelines/designing_enterprise_applications/introduction/summary/index.html
![Page 33: Android_Introduction 1 Android: Introduction, présentation Notes de cours jean-michel Douin, douin au cnam point fr version : 20 Février 2013](https://reader035.vdocument.in/reader035/viewer/2022081602/551d9dba497959293b8dde21/html5/thumbnails/33.jpg)
Android_Introduction33
Retour sur les API
• Android: un ensemble d’API
– Activity Manager
– View System listes, boutons,… navigateur (WebView)
– http://developer.android.com/guide/basics/what-is-android.html
![Page 34: Android_Introduction 1 Android: Introduction, présentation Notes de cours jean-michel Douin, douin au cnam point fr version : 20 Février 2013](https://reader035.vdocument.in/reader035/viewer/2022081602/551d9dba497959293b8dde21/html5/thumbnails/34.jpg)
Android_Introduction34
View System
• Un usage du patron composite
![Page 35: Android_Introduction 1 Android: Introduction, présentation Notes de cours jean-michel Douin, douin au cnam point fr version : 20 Février 2013](https://reader035.vdocument.in/reader035/viewer/2022081602/551d9dba497959293b8dde21/html5/thumbnails/35.jpg)
Android_Introduction35
View (Component), ViewGroup (Composite)
Source: [Sheng-De Wang]C’est bien un composite
![Page 36: Android_Introduction 1 Android: Introduction, présentation Notes de cours jean-michel Douin, douin au cnam point fr version : 20 Février 2013](https://reader035.vdocument.in/reader035/viewer/2022081602/551d9dba497959293b8dde21/html5/thumbnails/36.jpg)
Android_Introduction36
Détaillé: Composite
Source: [Sheng-De Wang]Exemple précédent setContentView(buttonNow);
![Page 37: Android_Introduction 1 Android: Introduction, présentation Notes de cours jean-michel Douin, douin au cnam point fr version : 20 Février 2013](https://reader035.vdocument.in/reader035/viewer/2022081602/551d9dba497959293b8dde21/html5/thumbnails/37.jpg)
Android_Introduction37
Une calculette: Layout, View , Button…
• Description de cette interface en XML– Fichier res/layout/main.xml
LinearLayout
TextView
EditText
TableRow
Button
ProgressBar
![Page 38: Android_Introduction 1 Android: Introduction, présentation Notes de cours jean-michel Douin, douin au cnam point fr version : 20 Février 2013](https://reader035.vdocument.in/reader035/viewer/2022081602/551d9dba497959293b8dde21/html5/thumbnails/38.jpg)
Android_Introduction38
Interface, IHM : Approche déclarative ./res/
• Chaque composant possède un id (android:id= "@+id/push")
![Page 39: Android_Introduction 1 Android: Introduction, présentation Notes de cours jean-michel Douin, douin au cnam point fr version : 20 Février 2013](https://reader035.vdocument.in/reader035/viewer/2022081602/551d9dba497959293b8dde21/html5/thumbnails/39.jpg)
Android_Introduction39
Architecture: la calculette, un classique
• Le Modèle– La calculette munie de ses opérations (+,-,/,*,…)
• Les sources du modèle sont ici– http://douin.free.fr/tp4Calculette/– La calculette hérite de la classe java.util.Observable
• La Vue– L’IHM affichage, zone de saisie, boutons …
• Le Contrôleur– Le comportement de l’IHM
![Page 40: Android_Introduction 1 Android: Introduction, présentation Notes de cours jean-michel Douin, douin au cnam point fr version : 20 Février 2013](https://reader035.vdocument.in/reader035/viewer/2022081602/551d9dba497959293b8dde21/html5/thumbnails/40.jpg)
Android_Introduction40
CalculetteModèle
MVC nouvelle discussion
« XML »IHM
• L’activity Android est une vue du Modèle Calculette (implements Observer)• L’activity Android est le contrôleur de l’IHM décrite en XML (extends Activity)
CalcActivityContrôleur
Listeners
extends android.app.Activity implements java.util.Observer
enter, add, sub, …update(..
Classes déjà écrites
Android
extends java.util.Observable implements CalculetteI
![Page 41: Android_Introduction 1 Android: Introduction, présentation Notes de cours jean-michel Douin, douin au cnam point fr version : 20 Février 2013](https://reader035.vdocument.in/reader035/viewer/2022081602/551d9dba497959293b8dde21/html5/thumbnails/41.jpg)
Android_Introduction41
Résumé: Application, Activity …
– Un processus linux contient une application,
– Une application, peut contenir une ou plusieurs activités,
– Une activité se trouve dans un certain état, cf. cycle de vie
![Page 42: Android_Introduction 1 Android: Introduction, présentation Notes de cours jean-michel Douin, douin au cnam point fr version : 20 Février 2013](https://reader035.vdocument.in/reader035/viewer/2022081602/551d9dba497959293b8dde21/html5/thumbnails/42.jpg)
Android_Introduction42
Communication inter applications
• Intent, comme notification
– Souscription/Publication
– Appeler, déclencher une autre activité• Avec éventuellement des paramètres et des résultats attendus
– L’intergiciel sélectionne la « bonne application »• Selon les critères exigés par le souscripteur• Critères précisés lors de la publication
– Nécessaire adéquation à l’exécution services fournis / services requis
![Page 43: Android_Introduction 1 Android: Introduction, présentation Notes de cours jean-michel Douin, douin au cnam point fr version : 20 Février 2013](https://reader035.vdocument.in/reader035/viewer/2022081602/551d9dba497959293b8dde21/html5/thumbnails/43.jpg)
Android_Introduction43
Patron Publish-Subscribe/Intent & Context
• Source: http://roboticswikibook.org, rappel
![Page 44: Android_Introduction 1 Android: Introduction, présentation Notes de cours jean-michel Douin, douin au cnam point fr version : 20 Février 2013](https://reader035.vdocument.in/reader035/viewer/2022081602/551d9dba497959293b8dde21/html5/thumbnails/44.jpg)
Android_Introduction44
Sous Android
• Mediator, classe Context– http://developer.android.com/reference/android/content/Context.html
• Subscriber, classe BroadcastReceiver– http://developer.android.com/reference/android/content/BroadcastReceiver.html
• X,Y les thèmes, classe Intent– http://developer.android.com/reference/android/content/Intent.html
• IntentFilter– http://developer.android.com/reference/android/content/IntentFilter.html
![Page 45: Android_Introduction 1 Android: Introduction, présentation Notes de cours jean-michel Douin, douin au cnam point fr version : 20 Février 2013](https://reader035.vdocument.in/reader035/viewer/2022081602/551d9dba497959293b8dde21/html5/thumbnails/45.jpg)
Android_Introduction45
Un mobile à l’intention de téléphoner
• Intent
• Démarrer une activité prédéfinie : téléphoner, légitime…
public class TelephonerActivity extends Activity {
@Override protected void onCreate(Bundle bundle) { super.onCreate(bundle); setContentView(R.layout.activity_now); }
public void onClick(View view) {
Intent intent = new Intent();intent.setAction("android.intent.action.DIAL");this.startActivity(intent);
}
}
• android.app.Activity extends ….. extends android.content.Context
![Page 46: Android_Introduction 1 Android: Introduction, présentation Notes de cours jean-michel Douin, douin au cnam point fr version : 20 Février 2013](https://reader035.vdocument.in/reader035/viewer/2022081602/551d9dba497959293b8dde21/html5/thumbnails/46.jpg)
Android_Introduction46
Téléphoner: le souscripteur a déjà souscrit
• DiscussionsIntent intent = new Intent();
intent.setAction("android.intent.action.DIAL");
– À la recherche de la bonne action, application
• Ici un nom ("android.intent.action.DIAL");
• Plusieurs élus possibles • Composant logiciels,• Maintenance• …
• Démonstration !
![Page 47: Android_Introduction 1 Android: Introduction, présentation Notes de cours jean-michel Douin, douin au cnam point fr version : 20 Février 2013](https://reader035.vdocument.in/reader035/viewer/2022081602/551d9dba497959293b8dde21/html5/thumbnails/47.jpg)
Android_Introduction47
Recevoir un SMS, le souscripteur
– Le souscripteur hérite de android.content.BroadcastReceiver• Et implémente ce qu’il faut faire lors de la notification
public class ReceiverSMS extends BroadcastReceiver{
// à chaque SMS reçu
public void onReceive(Context ctxt, Intent intent) {
//
}
}
// à chaque SMS reçu ?
Adéquation intention (Intent) ReceiverSMS par un filtre (IntentFilter)
Réalisation : tout en java ou directives XML …
![Page 48: Android_Introduction 1 Android: Introduction, présentation Notes de cours jean-michel Douin, douin au cnam point fr version : 20 Février 2013](https://reader035.vdocument.in/reader035/viewer/2022081602/551d9dba497959293b8dde21/html5/thumbnails/48.jpg)
Android_Introduction48
Recevoir un SMS, le souscripteur– Tout java: un receveur/souscripteur au sein d’une activité
public class SMSActivity extends Activity { private static class ReceiverSMS extends BroadcastReceiver{ // à chaque SMS reçu public void onReceive(Context ctxt, Intent intent) { // … }}
protected void onCreate(Bundle bundle) { super.onCreate(bundle);
final String SMS_RECEIVED = "android.provider.Telephony.SMS_RECEIVED";
IntentFilter filter = new IntentFilter(SMS_RECEIVED); registerReceiver(new ReceiverSMS(), filter);
setContentView(R.layout.activity_now);}
![Page 49: Android_Introduction 1 Android: Introduction, présentation Notes de cours jean-michel Douin, douin au cnam point fr version : 20 Février 2013](https://reader035.vdocument.in/reader035/viewer/2022081602/551d9dba497959293b8dde21/html5/thumbnails/49.jpg)
Android_Introduction49
Le receveur en déclaratif
<receiver android:name=".ReceveurDeSMS" android:exported="true" >
<intent-filter android:priority="999"> <action android:name="android.provider.Telephony.SMS_RECEIVED" />
</intent-filter></receiver>
public class ReceveurDeSMS extends BroadcastReceiver{ // à chaque SMS reçu public void onReceive(Context ctxt, Intent intent) { // }}
![Page 50: Android_Introduction 1 Android: Introduction, présentation Notes de cours jean-michel Douin, douin au cnam point fr version : 20 Février 2013](https://reader035.vdocument.in/reader035/viewer/2022081602/551d9dba497959293b8dde21/html5/thumbnails/50.jpg)
Android_Introduction50
Publish/Subscribe
Plusieurs Receveurs/souscripteurs,
l’un deux peut arrêter la propagation,
une priorité peut être affecté à chaque receveur
La liste des souscripteurs serait-elle une Chaîne de responsabilités avec priorités ?
Démonstration1) un receveur de SMS
2) avec deux receveurs Scénario: si le contenu du message contient « vibrator »,
le mobile vibre et le message est intercepté !
![Page 51: Android_Introduction 1 Android: Introduction, présentation Notes de cours jean-michel Douin, douin au cnam point fr version : 20 Février 2013](https://reader035.vdocument.in/reader035/viewer/2022081602/551d9dba497959293b8dde21/html5/thumbnails/51.jpg)
Android_Introduction51
Patron publish/subscribe « Over the air »
• Google Cloud Messaging
• Android 2.2
• Message <= 4ko
• Trafic illimité– Nécessite une inscription auprès de Google
• Avec de préférence un compte gmail dédié
![Page 52: Android_Introduction 1 Android: Introduction, présentation Notes de cours jean-michel Douin, douin au cnam point fr version : 20 Février 2013](https://reader035.vdocument.in/reader035/viewer/2022081602/551d9dba497959293b8dde21/html5/thumbnails/52.jpg)
Android_Introduction52
Publish/Subscribe « Over the air »
• 1) Souscription
![Page 53: Android_Introduction 1 Android: Introduction, présentation Notes de cours jean-michel Douin, douin au cnam point fr version : 20 Février 2013](https://reader035.vdocument.in/reader035/viewer/2022081602/551d9dba497959293b8dde21/html5/thumbnails/53.jpg)
Android_Introduction53
Publish/Subscribe « Over the air »
• 2) Publication
![Page 54: Android_Introduction 1 Android: Introduction, présentation Notes de cours jean-michel Douin, douin au cnam point fr version : 20 Février 2013](https://reader035.vdocument.in/reader035/viewer/2022081602/551d9dba497959293b8dde21/html5/thumbnails/54.jpg)
Android_Introduction54
Publish/Subscribe « Over the air »
• 3) Notification
![Page 55: Android_Introduction 1 Android: Introduction, présentation Notes de cours jean-michel Douin, douin au cnam point fr version : 20 Février 2013](https://reader035.vdocument.in/reader035/viewer/2022081602/551d9dba497959293b8dde21/html5/thumbnails/55.jpg)
Android_Introduction55
Architecture : Objectifs
• Un client, tout système connecté – S’adresse au serveur Google qui se chargera de publier auprès des mobiles
• Mobiles ayant préalablement souscrits
• Mise en œuvre : une librairie toute prête, en un appel de méthode
![Page 56: Android_Introduction 1 Android: Introduction, présentation Notes de cours jean-michel Douin, douin au cnam point fr version : 20 Février 2013](https://reader035.vdocument.in/reader035/viewer/2022081602/551d9dba497959293b8dde21/html5/thumbnails/56.jpg)
Android_Introduction56
Architecture : Mise en œuvre, inscription
• Chaque participant– Doit avoir un compte google gmail– S’inscrit auprès de GCM, en retour un identifiant lui est attribué
• Un serveur mémorise, l’identifiant retourné par GCM– Un serveur au protocole HTTP de préférence
1)inscription
2)identifiant
3) dépôt de l’identifiant
GCM
![Page 57: Android_Introduction 1 Android: Introduction, présentation Notes de cours jean-michel Douin, douin au cnam point fr version : 20 Février 2013](https://reader035.vdocument.in/reader035/viewer/2022081602/551d9dba497959293b8dde21/html5/thumbnails/57.jpg)
Android_Introduction57
Architecture : Mise en œuvre, inscriptions
• Le serveur contient une liste des identifiants• Un identifiant par application
• Exemple : Une liste d’identifiants accessible depuis le web• http://jfod.cnam.fr/registration/demo/?cmd=toString
• id1• id2• id3• …• …• …
![Page 58: Android_Introduction 1 Android: Introduction, présentation Notes de cours jean-michel Douin, douin au cnam point fr version : 20 Février 2013](https://reader035.vdocument.in/reader035/viewer/2022081602/551d9dba497959293b8dde21/html5/thumbnails/58.jpg)
Android_Introduction58
Architecture : Mise en œuvre, publications
• Publication par tout système connecté1, 2) Demande et obtention de la liste des identifiants,
3) Envoi de cette liste au serveur Google/GCM accompagnée du message à transmettreGCM se charge de publier le message, de le ré-émettre, de le conserver …
2) [id1, id2, id3, ……]
1) Demande de la liste
3) Demande de publication [id1, id2, id3, ……] + message id1
message
message
message
id2
id3
![Page 59: Android_Introduction 1 Android: Introduction, présentation Notes de cours jean-michel Douin, douin au cnam point fr version : 20 Février 2013](https://reader035.vdocument.in/reader035/viewer/2022081602/551d9dba497959293b8dde21/html5/thumbnails/59.jpg)
Android_Introduction59
Architecture : publications
• Chaque mobile, ayant préalablement souscrit, est notifié
– C’est un « Receiver », prêt à l’emploi, qui est déclenché sur chaque mobile
id1message
message
message
id2
id3
![Page 60: Android_Introduction 1 Android: Introduction, présentation Notes de cours jean-michel Douin, douin au cnam point fr version : 20 Février 2013](https://reader035.vdocument.in/reader035/viewer/2022081602/551d9dba497959293b8dde21/html5/thumbnails/60.jpg)
Android_Introduction60
Démonstration
– Service web• Interrogations
– http://jfod.cnam.fr/registration/demo/?cmd=toString– http://jfod.cnam.fr/registration/demo/?cmd=list
• Publication– http://jfod.cnam.fr/registration/demo/?cmd=send&message=hello_GCM
• http://jfod.cnam.fr/cgm/demo.html
• id1• id2• id3• …• …• …
![Page 61: Android_Introduction 1 Android: Introduction, présentation Notes de cours jean-michel Douin, douin au cnam point fr version : 20 Février 2013](https://reader035.vdocument.in/reader035/viewer/2022081602/551d9dba497959293b8dde21/html5/thumbnails/61.jpg)
Android_Introduction61
Démonstration
• Installez cette application sur vos mobiles ou sur votre émulateur
– L ’application Android (souscription et publication)• Patience la durée de la découverte de votre mobile ou émulateur peut prendre
quelques minutes• http://jfod.cnam.fr/cgm/GCM_Client_Demo.apk
– Modeste interface web de tests…• http://jfod.cnam.fr/cgm/demo.html
![Page 62: Android_Introduction 1 Android: Introduction, présentation Notes de cours jean-michel Douin, douin au cnam point fr version : 20 Février 2013](https://reader035.vdocument.in/reader035/viewer/2022081602/551d9dba497959293b8dde21/html5/thumbnails/62.jpg)
Android_Introduction62
Les services: Sommaire
– Services• Cycle de vie
– création, démarrage et arrêt
• Service local
• Service « global », AIDL (Android Interface Description Language)
Note: A chaque thème un exemple complet et une démonstration
Avertissement : les démonstrations ne sont pas garanties…
![Page 63: Android_Introduction 1 Android: Introduction, présentation Notes de cours jean-michel Douin, douin au cnam point fr version : 20 Février 2013](https://reader035.vdocument.in/reader035/viewer/2022081602/551d9dba497959293b8dde21/html5/thumbnails/63.jpg)
Android_Introduction63
Sommaire : Architectures présentées 1/3
• Service local, une activité, un service– Échange de données
• Envoi des paramètres depuis l’activité par une intention• Réception des résultats
– Simplifié, variable globales, ici le compteur (même machine)– Usage des classes Messenger et Handler
Un processusUne DVM
Une activité
Un service
compteur
![Page 64: Android_Introduction 1 Android: Introduction, présentation Notes de cours jean-michel Douin, douin au cnam point fr version : 20 Février 2013](https://reader035.vdocument.in/reader035/viewer/2022081602/551d9dba497959293b8dde21/html5/thumbnails/64.jpg)
Android_Introduction64
Sommaire : Architectures présentées 2/3
• Un service global, une activité– Échange de données
• Envoi depuis l’activité par une intention• Réception des résultats
– Messenger et handler– ServiceConnection, accès via un mandataire AIDL
Un processusUne DVM
Une activité
Un service
compteur
Un processusUne DVM
![Page 65: Android_Introduction 1 Android: Introduction, présentation Notes de cours jean-michel Douin, douin au cnam point fr version : 20 Février 2013](https://reader035.vdocument.in/reader035/viewer/2022081602/551d9dba497959293b8dde21/html5/thumbnails/65.jpg)
Android_Introduction65
Bibliographie utilisée
• http://developer.android.com/reference/android/app/Service.html
• http://www.vogella.com/articles/AndroidServices/article.html
• http://grail.cba.csuohio.edu/~matos/notes/cis-493/lecture-notes/Android-Chapter22-Services.pdf
• http://davanum.wordpress.com/2007/12/15/android-listen-for-incoming-sms-messages/
• À compléter
![Page 66: Android_Introduction 1 Android: Introduction, présentation Notes de cours jean-michel Douin, douin au cnam point fr version : 20 Février 2013](https://reader035.vdocument.in/reader035/viewer/2022081602/551d9dba497959293b8dde21/html5/thumbnails/66.jpg)
Android_Introduction66
Service
• En tâche de fond– Pas d’IHM
• J’écoute un fichier audio mp3, pendant que je navigue sur le web,• Dès que je m’empare du mobile, une sonnerie retentit,• Les coordonnées GPS sont envoyées régulièrement,• Dès que je m’approche d’une zone dangereuse mon mobile s’éteint,• …
• Toujours disponibles– Locaux
• Service personnel, inaccessible pour les autres applications– Service, Intent, IntentService
» En accès restreint
– « Distants »• Accessible aux autres applications
– Langage commun AIDL – Recherche du service, IBinder, Connection
![Page 67: Android_Introduction 1 Android: Introduction, présentation Notes de cours jean-michel Douin, douin au cnam point fr version : 20 Février 2013](https://reader035.vdocument.in/reader035/viewer/2022081602/551d9dba497959293b8dde21/html5/thumbnails/67.jpg)
Android_Introduction67
Services : cycle de vie, deux stylesQuelque soit l’architecture choisie
Usage de
startServiceUsage de
bindService
![Page 68: Android_Introduction 1 Android: Introduction, présentation Notes de cours jean-michel Douin, douin au cnam point fr version : 20 Février 2013](https://reader035.vdocument.in/reader035/viewer/2022081602/551d9dba497959293b8dde21/html5/thumbnails/68.jpg)
Android_Introduction68
Service local, schéma des exemples
• Un service local– Une horloge
• Un compteur est incrémenté chaque seconde …tic…tic…tic…tic…tic…tic
– Lecture synchrone du compteur de tics• À son initiative, le client questionne … (combien de tics ?)
– Un message contenant le nombre de tics est envoyé par le service• Réception asynchrone par le client … (veuillez recevoir ce nombre de tics, svp)
– A chaque incrémentation du compteur une notification a lieu• Dans la barre des notifications… (le compteur a changé de valeur ?)
– A chaque incrémentation un envoi aux receveurs agréés est effectué• Envois asynchrones aux multiples receveurs éventuel selon un ordre
![Page 69: Android_Introduction 1 Android: Introduction, présentation Notes de cours jean-michel Douin, douin au cnam point fr version : 20 Février 2013](https://reader035.vdocument.in/reader035/viewer/2022081602/551d9dba497959293b8dde21/html5/thumbnails/69.jpg)
Android_Introduction69
Les exemples de ce support, suite
• Un service global – Un compteur de SMS entrants en trois étapes
1. AIDL, les services, le langage commun entre les clients et le service– Le squelette du programme
– Types primitifs et Parcelable
2. Mise en place du receveur de SMS– Liaison receveur et service
![Page 70: Android_Introduction 1 Android: Introduction, présentation Notes de cours jean-michel Douin, douin au cnam point fr version : 20 Février 2013](https://reader035.vdocument.in/reader035/viewer/2022081602/551d9dba497959293b8dde21/html5/thumbnails/70.jpg)
Android_Introduction70
Architecture du premier exemple
• De l’activité, – Démarrage du service par startService– accès au compteur de tics par l’appel d’une méthode de classe, lecture de la valeur
• Activité : classe ServiceLocalActivity• Service : classe TimeService
Un processusUne DVM
Une activitéLe (UI)thread main Un service
un thread tickertic…tic…tic…tic…tic…
compteur
![Page 71: Android_Introduction 1 Android: Introduction, présentation Notes de cours jean-michel Douin, douin au cnam point fr version : 20 Février 2013](https://reader035.vdocument.in/reader035/viewer/2022081602/551d9dba497959293b8dde21/html5/thumbnails/71.jpg)
Android_Introduction71
Un Service Local, au sein d’une activity
• Une horloge– Un compteur est incrémenté chaque seconde …tic…tic…tic…tic…tic…tic
• Le fichier Manifest.xml mentionne le service (TimeService)
<?xml version="1.0" encoding="utf-8"?><manifest xmlns:android="http://schemas.android.com/apk/res/android" package="service.local" android:versionCode="1" android:versionName="1.0"> <uses-sdk android:minSdkVersion="8" />
<application android:icon="@drawable/icon" android:label="@string/app_name">
<activity android:name=".ServiceLocalActivity" android:label="@string/app_name"> <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity>
<service android:name="TimeService" ></service>
</application></manifest>
![Page 72: Android_Introduction 1 Android: Introduction, présentation Notes de cours jean-michel Douin, douin au cnam point fr version : 20 Février 2013](https://reader035.vdocument.in/reader035/viewer/2022081602/551d9dba497959293b8dde21/html5/thumbnails/72.jpg)
Android_Introduction72
Un service local c’est :
Une déclaration XML et un héritage de la classe Service
Une déclaration• Balise service dans la configuration AndroidManifest.xml
– Par défaut le service se trouve dans le même processus que l’activité
Une classe au sein de la même application• public class TimeService extends android.app.Service{
– public void onCreate(){…}
– public int onStartCommand(Intent intent, int flags, int startId) {…}• onStart appelle cette méthode
– public onDestroy{…}
![Page 73: Android_Introduction 1 Android: Introduction, présentation Notes de cours jean-michel Douin, douin au cnam point fr version : 20 Février 2013](https://reader035.vdocument.in/reader035/viewer/2022081602/551d9dba497959293b8dde21/html5/thumbnails/73.jpg)
Android_Introduction73
Démarrage du service 1/2
• Au sein de l’activité, – Déclaration de l’intention
– Intent intent = new Intent(this, TimeService.class);• this : le contexte
• TimeService.class : le service,
» dans la même application (un package référencé par Android)
• L’intent peut contenir paramètres, exemple– intent.putExtra("pid", android.os.Process.myPid());
![Page 74: Android_Introduction 1 Android: Introduction, présentation Notes de cours jean-michel Douin, douin au cnam point fr version : 20 Février 2013](https://reader035.vdocument.in/reader035/viewer/2022081602/551d9dba497959293b8dde21/html5/thumbnails/74.jpg)
Android_Introduction74
Démarrage et arrêt du service 2/2
• Au sein de l’activité, – Démarrage et arrêt du service,
Cycle de vie du service
startService(intent);Démarrage effectif du service,
appel de onCreate, onStart->onStartCommand du service
stopService(intent);
Arrêt du service,
appel de onDestroy du service
![Page 75: Android_Introduction 1 Android: Introduction, présentation Notes de cours jean-michel Douin, douin au cnam point fr version : 20 Février 2013](https://reader035.vdocument.in/reader035/viewer/2022081602/551d9dba497959293b8dde21/html5/thumbnails/75.jpg)
Android_Introduction75
Schéma de programme du service, 1/3
public class TimeService extends Service {
// à la suite de l’appel de startService
public void onCreate(){
}
// non renseigné dans cette version utilisant startService
public IBinder onBind(Intent i) {
return null;
}
![Page 76: Android_Introduction 1 Android: Introduction, présentation Notes de cours jean-michel Douin, douin au cnam point fr version : 20 Février 2013](https://reader035.vdocument.in/reader035/viewer/2022081602/551d9dba497959293b8dde21/html5/thumbnails/76.jpg)
Android_Introduction76
Schéma de programme du service, 2/3
private static Thread ticker;private static AtomicLong count;
// suite de l’appel de startService, cf. cycle de viepublic int onStartCommand(Intent intent, int flags, int startId) {
if(ticker==null){ count = new AtomicLong(); // accès concurrents ticker = new Thread(new Ticker()); // un thread local ticker.start(); }
return START_STICKY; // démarrage et arrêt explicites // la constante retournée induit un comportement du service
// http://developer.android.com/reference/android/app/Service.html}
![Page 77: Android_Introduction 1 Android: Introduction, présentation Notes de cours jean-michel Douin, douin au cnam point fr version : 20 Février 2013](https://reader035.vdocument.in/reader035/viewer/2022081602/551d9dba497959293b8dde21/html5/thumbnails/77.jpg)
Android_Introduction77
Méthode run (le ticker), du service 3/3
// l’horloge et son thread, « du classique »private class Ticker implements Runnable{ public void run(){ while(!ticker.isInterrupted()){ try{ Thread.sleep(1000); count.set(count.longValue()+1L); }catch(Exception e){ return; } } }
// accès en lecture, par l’activitépublic static long getCount(){ return count.get();}
![Page 78: Android_Introduction 1 Android: Introduction, présentation Notes de cours jean-michel Douin, douin au cnam point fr version : 20 Février 2013](https://reader035.vdocument.in/reader035/viewer/2022081602/551d9dba497959293b8dde21/html5/thumbnails/78.jpg)
Android_Introduction78
Le client, une activity, un affichage
public class ServiceLocalActivity extends Activity
public void onClickStart(View v){ Intent intent = new Intent(this, TimeService.class); intent.putExtra("pid", android.os.Process.myPid()); started = startService(intent) != null; }
public void onClickStop(View v){ started = !stopService(new Intent(this, TimeService.class)); }
public void onClickGetCount(View v){ if(started) texte.setText("count: " + TimeService.getCount()); else texte.setText("service non démarré"); } Méthodes de classe
Même DVM (tout va bien)
![Page 79: Android_Introduction 1 Android: Introduction, présentation Notes de cours jean-michel Douin, douin au cnam point fr version : 20 Février 2013](https://reader035.vdocument.in/reader035/viewer/2022081602/551d9dba497959293b8dde21/html5/thumbnails/79.jpg)
Android_Introduction79
Démonstration
![Page 80: Android_Introduction 1 Android: Introduction, présentation Notes de cours jean-michel Douin, douin au cnam point fr version : 20 Février 2013](https://reader035.vdocument.in/reader035/viewer/2022081602/551d9dba497959293b8dde21/html5/thumbnails/80.jpg)
Android_Introduction80
Un résumé et la suite
• Un service local– Hérite de Service
• StartService
ou• Une autre écriture est possible avec bindService
– L’exemples présenté utilise la même DVM• Accès « simplifié » aux services rendus
– Accès par une méthode de classe,
• Et maintenant : un service global
![Page 81: Android_Introduction 1 Android: Introduction, présentation Notes de cours jean-michel Douin, douin au cnam point fr version : 20 Février 2013](https://reader035.vdocument.in/reader035/viewer/2022081602/551d9dba497959293b8dde21/html5/thumbnails/81.jpg)
Android_Introduction81
Discussion, même DVM ou non
• Ici le service partage le même processus que l’activité
• Attention
• Si nous choisissons, un processus dédié au service– <service android:name="TimeService" android:process= ":timeService">– </service>
– Cela ne fonctionne plus, démonstration …– explication … cf. schéma page suivante
![Page 82: Android_Introduction 1 Android: Introduction, présentation Notes de cours jean-michel Douin, douin au cnam point fr version : 20 Février 2013](https://reader035.vdocument.in/reader035/viewer/2022081602/551d9dba497959293b8dde21/html5/thumbnails/82.jpg)
Android_Introduction82
Schéma : processus et DVM
• Un seul processus• Activity + serviceTout va bien en apparence
• Deux processus, deux DVM• Exception !!!!(Le code pour la lecture de count est le même)
Activity TimeServiceActivity
TimeService
count 5count null count 5
• L’accès par des variables de classes: peu satisfaisant
![Page 83: Android_Introduction 1 Android: Introduction, présentation Notes de cours jean-michel Douin, douin au cnam point fr version : 20 Février 2013](https://reader035.vdocument.in/reader035/viewer/2022081602/551d9dba497959293b8dde21/html5/thumbnails/83.jpg)
Android_Introduction83
help -> recherche sur le web
• http://blog.developpez.com/android23/p8571/android/creation_de_service
• Utilisation de listener
• En conséquence pour un service global un IPC est nécessaire
– IPC comme Inter Process Communication
– Plusieurs façons de faire• Messenger + Handler• broadcastReceiver• AIDL
![Page 84: Android_Introduction 1 Android: Introduction, présentation Notes de cours jean-michel Douin, douin au cnam point fr version : 20 Février 2013](https://reader035.vdocument.in/reader035/viewer/2022081602/551d9dba497959293b8dde21/html5/thumbnails/84.jpg)
Android_Introduction84
Communication entre processus
• Solutions– Messenger + Handler
• Message inter process• Autorise une communication asynchrone• Un message est envoyé au client, celui-ci est prévenu à l’aide d’un Handler
– Un receveur ou plusieurs receveurs• Un ou des receveurs et le bon filtre sont enregistrés• Le service envoie un « intent » et son filtre,
– A destination des receveurs agréés, filtrés
– Le service devient global• Nécessité d’utiliser AIDL
– in, out, inout, et certains types pris en compte, – implements Parcelable pour du sur mesure
![Page 85: Android_Introduction 1 Android: Introduction, présentation Notes de cours jean-michel Douin, douin au cnam point fr version : 20 Février 2013](https://reader035.vdocument.in/reader035/viewer/2022081602/551d9dba497959293b8dde21/html5/thumbnails/85.jpg)
Android_Introduction85
Service global : création, démarrage et arrêt
• En tache de fond
• Toujours disponible
• Services globaux
– « Distants »• Rmi en plus simple … même machine …
• Accessible à tous– Attribut android:exported="true", balise service
![Page 86: Android_Introduction 1 Android: Introduction, présentation Notes de cours jean-michel Douin, douin au cnam point fr version : 20 Février 2013](https://reader035.vdocument.in/reader035/viewer/2022081602/551d9dba497959293b8dde21/html5/thumbnails/86.jpg)
Android_Introduction86
Un Service à disposition de tous
Service distant,– Découverte du service par une intention …– Sérialisation/désérialisation lors du passage de paramètre
• Implicite si types primitifs, List et Map, • Explicite par l’implémentation de Parcelable
Android, middleware
Applications
activité_1 Activité 2 service
Services
![Page 87: Android_Introduction 1 Android: Introduction, présentation Notes de cours jean-michel Douin, douin au cnam point fr version : 20 Février 2013](https://reader035.vdocument.in/reader035/viewer/2022081602/551d9dba497959293b8dde21/html5/thumbnails/87.jpg)
Android_Introduction87
Un simple service global
• Un service accessible par toute application– Avec quelques contraintes
• Un langage commun AIDL– AIDL, Android Interface Description Language
– Types primitifs de java
– String, CharSequence, List (ArrayList coté serveur), Map (HashMap)
• Indication du type de passage de paramètre in, out, inout• Sérialisation/désérialisation
– Autres classes, elles devront : implements Parcelable• Analogue à Serializable, mais rien n’est implicite
![Page 88: Android_Introduction 1 Android: Introduction, présentation Notes de cours jean-michel Douin, douin au cnam point fr version : 20 Février 2013](https://reader035.vdocument.in/reader035/viewer/2022081602/551d9dba497959293b8dde21/html5/thumbnails/88.jpg)
Android_Introduction88
Exemple : compteur de SMS …
• Approche incrémentale à l’aide d’un exemple
1. Un service global accessible par tous (Exemple 1)Limité à 3 fonctionnalités élémentaires
Démarrer, arrêter, combien ? 1. Nous déjà vu ces commandes quelque part ?
2. Ajout effectif du receveur de messages (Exemple 2)– Mise en œuvre du receveur d’intention standard
Démarrer le receveur, arrêter la réception, combien de SMS reçus ?
3. Ajout d’une nouvelle fonctionnalité (Exemple 3 ou une idée de TP)– Le texte d’un sms contient une commande (secrète) qui déclenche l’action
correspondante, (envoi de la position…)
![Page 89: Android_Introduction 1 Android: Introduction, présentation Notes de cours jean-michel Douin, douin au cnam point fr version : 20 Février 2013](https://reader035.vdocument.in/reader035/viewer/2022081602/551d9dba497959293b8dde21/html5/thumbnails/89.jpg)
Android_Introduction89
Exemple 1
3 fichiers
1. Une interface en AIDL des fonctionnalités distantes• Sous ensemble de Java, par défaut types primitifs, List, Map• Parcelable sinon
2. Une implémentation du service• La souche, le mandataire à destination des clients distants, est générée
3. Une activity de mise en oeuvre– Recherche du service– Connexion avec celui-ci
![Page 90: Android_Introduction 1 Android: Introduction, présentation Notes de cours jean-michel Douin, douin au cnam point fr version : 20 Février 2013](https://reader035.vdocument.in/reader035/viewer/2022081602/551d9dba497959293b8dde21/html5/thumbnails/90.jpg)
Android_Introduction90
Exemple un préambule compteur de SMS
package seja.android;
interface SMSServiceI{ void start(); // démarrage de la réception sms void stop(); // arrêt de celle-ci long received(); // combien de SMS reçus ?
}
.aidl
.java
![Page 91: Android_Introduction 1 Android: Introduction, présentation Notes de cours jean-michel Douin, douin au cnam point fr version : 20 Février 2013](https://reader035.vdocument.in/reader035/viewer/2022081602/551d9dba497959293b8dde21/html5/thumbnails/91.jpg)
Android_Introduction91
Service, AIDL (android interface description language)
package cnam.android;
interface SMSServiceI{ void start(); void stop(); long received();}
/*This file is auto-generated. DO NOT MODIFY.*/
package cnam.android;import …;public interface SMSServiceI extends android.os.IInterface{
/** Local-side IPC implementation stub class. */
public static abstract class Stub extends android.os.Binder implements cnam.android.SMSServiceI{ …
![Page 92: Android_Introduction 1 Android: Introduction, présentation Notes de cours jean-michel Douin, douin au cnam point fr version : 20 Février 2013](https://reader035.vdocument.in/reader035/viewer/2022081602/551d9dba497959293b8dde21/html5/thumbnails/92.jpg)
Android_Introduction92
Implémentation du service, SMSService.java
public class SMSService extends Service{
// appelée par les clients public IBinder onBind(Intent intent) { return new SMSServiceImplStub(); }
private static class SMSServiceImplStub extends SMSServiceI.Stub{ private static long counter; // compteur de sms provisoire
public void start() throws RemoteException { Log.i("SMSServiceImplStub","start"); }
public void stop() throws RemoteException { Log.i("SMSServiceImplStub","stop"); } public long received() throws RemoteException { synchronized(SMSServiceImplStub.class){ counter++; } return counter;}}}
![Page 93: Android_Introduction 1 Android: Introduction, présentation Notes de cours jean-michel Douin, douin au cnam point fr version : 20 Février 2013](https://reader035.vdocument.in/reader035/viewer/2022081602/551d9dba497959293b8dde21/html5/thumbnails/93.jpg)
Android_Introduction93
L’activité cliente du service
public class ServiceSMSReceivedActivity extends Activity {private SMSServiceI service;private ConnexionAuServiceSMS connexion;
• public void onClickStart(View v){ if(!connecte){ // identification du service Intent serviceIntent = new Intent(); serviceIntent.setClassName("seja.android", "seja.android.SMSService");
// connexion avec le service this.connexion = new ConnexionAuServiceSMS(); // connexion sera déclenchée par l’intergiciel (asynchrone) bindService(serviceIntent, connexion, Context.BIND_AUTO_CREATE);
connecte = true; start.setEnabled(false); stop.setEnabled(true); }}
![Page 94: Android_Introduction 1 Android: Introduction, présentation Notes de cours jean-michel Douin, douin au cnam point fr version : 20 Février 2013](https://reader035.vdocument.in/reader035/viewer/2022081602/551d9dba497959293b8dde21/html5/thumbnails/94.jpg)
Android_Introduction94
Connexion au service, par android, asynchrone
Cf. transparent précédent // connexion avec le service this.connexion = new ConnexionAuServiceSMS(); // connexion sera déclenchée par l’intergiciel (asynchrone) bindService(serviceIntent, connexion, Context.BIND_AUTO_CREATE);
private class ConnexionAuServiceSMS implements ServiceConnection{
public void onServiceConnected(ComponentName name, IBinder binder) { // méthode appelée par Abdroid, // service reçoit un mandataire service = SMSServiceI.Stub.asInterface(binder); }
public void onServiceDisconnected(ComponentName name) { }
}
![Page 95: Android_Introduction 1 Android: Introduction, présentation Notes de cours jean-michel Douin, douin au cnam point fr version : 20 Février 2013](https://reader035.vdocument.in/reader035/viewer/2022081602/551d9dba497959293b8dde21/html5/thumbnails/95.jpg)
Android_Introduction95
L’activité cliente connectée
public class ServiceSMSReceivedActivity extends Activity {private SMSServiceI service;private ConnexionAuServiceSMS connexion;
public void onClickHow(View v){ if(connecte){ try { texte.setText(Long.toString( service.received())); } catch (RemoteException e) { } }
Appel de service.received(), Affichage de la valeur 5 ouf…
![Page 96: Android_Introduction 1 Android: Introduction, présentation Notes de cours jean-michel Douin, douin au cnam point fr version : 20 Février 2013](https://reader035.vdocument.in/reader035/viewer/2022081602/551d9dba497959293b8dde21/html5/thumbnails/96.jpg)
Android_Introduction96
Pause avant l’accès par tous
• Rien de nouveau, sauf cette interface
– Architecture classique• Un service• Une liaison à l’aide d’une instance de la classe ServiceConnection
package cnam.android;
interface SMSServiceI{ void start(); void stop(); long received();}
![Page 97: Android_Introduction 1 Android: Introduction, présentation Notes de cours jean-michel Douin, douin au cnam point fr version : 20 Février 2013](https://reader035.vdocument.in/reader035/viewer/2022081602/551d9dba497959293b8dde21/html5/thumbnails/97.jpg)
Android_Introduction97
Le manifest, installation du service
Pour tous, et ici dans un processus séparé
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="seja.android"
android:versionCode="1"
android:versionName="1.0">
<uses-sdk android:minSdkVersion="8" />
<application android:icon="@drawable/icon" android:label="@string/app_name">
<activity android:name=".ServiceSMSReceivedActivity"
android:label="@string/app_name">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<service android:name=".SMSService"
android:exported="true"
android:process="seja.android.SMSService" /> </application>
</manifest>
![Page 98: Android_Introduction 1 Android: Introduction, présentation Notes de cours jean-michel Douin, douin au cnam point fr version : 20 Février 2013](https://reader035.vdocument.in/reader035/viewer/2022081602/551d9dba497959293b8dde21/html5/thumbnails/98.jpg)
Android_Introduction98
Un autre client depuis une autre application
• Recopie du fichier .aidl,
(langage commun) – Noms de paquetage
identiques
• Même séquence qu’un client du même contexte
– Recherche du service– Connexion au service
![Page 99: Android_Introduction 1 Android: Introduction, présentation Notes de cours jean-michel Douin, douin au cnam point fr version : 20 Février 2013](https://reader035.vdocument.in/reader035/viewer/2022081602/551d9dba497959293b8dde21/html5/thumbnails/99.jpg)
Android_Introduction99
Un client ordinaire d’une autre application
public void onClickHow(View v){ if(!connecte){ Intent intent = new Intent(); intent.setClassName("seja.android", "seja.android.SMSService"); this.connexion = new ConnexionAuServiceSMS(); try{ bindService( intent, connexion, Context.BIND_AUTO_CREATE); }catch(Exception e){} connecte = true; }else{ try { texte.setText(Long.toString(service.received())); } catch (Exception e) {} }} private class ConnexionAuServiceSMS implements ServiceConnection{ à l’identique d’un client présent dans la même application
![Page 100: Android_Introduction 1 Android: Introduction, présentation Notes de cours jean-michel Douin, douin au cnam point fr version : 20 Février 2013](https://reader035.vdocument.in/reader035/viewer/2022081602/551d9dba497959293b8dde21/html5/thumbnails/100.jpg)
Android_Introduction100
Exemple2 : SMSService enrichi
• Un compteur de SMS reçus– A chaque sms reçu un compteur est incrémenté– Service accessible par toute application
• Le service a maintenant l’intention de recevoir des SMS– IntentFilter filter = new IntentFilter(SMS_RECEIVED);– registerReceiver(new SMSReceiver(), filter);
• Un client recherchera ce service via le middleware
• Le service : SMSService
![Page 101: Android_Introduction 1 Android: Introduction, présentation Notes de cours jean-michel Douin, douin au cnam point fr version : 20 Février 2013](https://reader035.vdocument.in/reader035/viewer/2022081602/551d9dba497959293b8dde21/html5/thumbnails/101.jpg)
Android_Introduction101
ContentProvider
• Sauvegarde et restitution de données– Données accessibles à toutes applications
• ContentProvider
– Persistance
– DAO/CRUD
• Data Access Object• Create Retrieve Update et Delete
![Page 102: Android_Introduction 1 Android: Introduction, présentation Notes de cours jean-michel Douin, douin au cnam point fr version : 20 Février 2013](https://reader035.vdocument.in/reader035/viewer/2022081602/551d9dba497959293b8dde21/html5/thumbnails/102.jpg)
Android_Introduction102
Mes Contacts, un client le ContentProvider prédéfini : phone
![Page 103: Android_Introduction 1 Android: Introduction, présentation Notes de cours jean-michel Douin, douin au cnam point fr version : 20 Février 2013](https://reader035.vdocument.in/reader035/viewer/2022081602/551d9dba497959293b8dde21/html5/thumbnails/103.jpg)
Android_Introduction103
ContentProvider
• ContentProvider, comme les contacts, accès
– ContentResolver resolver = getContentResolver();
Identification du bon « Contentprovider » grâce à son URI
– Uri uri = android.provider.Contacts.Phones.CONTENT_URI;– String s = uri.toString();– // assert s.equals("content://contacts/phone");
– Appel de resolver.query• Pour une interrogation
– Parcours à l’aide d’un « Cursor »
![Page 104: Android_Introduction 1 Android: Introduction, présentation Notes de cours jean-michel Douin, douin au cnam point fr version : 20 Février 2013](https://reader035.vdocument.in/reader035/viewer/2022081602/551d9dba497959293b8dde21/html5/thumbnails/104.jpg)
Android_Introduction104
Cursor comme ResultSet
![Page 105: Android_Introduction 1 Android: Introduction, présentation Notes de cours jean-michel Douin, douin au cnam point fr version : 20 Février 2013](https://reader035.vdocument.in/reader035/viewer/2022081602/551d9dba497959293b8dde21/html5/thumbnails/105.jpg)
Android_Introduction105
Conclusion
• Ce n’est qu’une introduction …
– Approche par les patrons s’impose pour la partie Service et ContentProvider …