Professional Documents
Culture Documents
Tarak Chaari
Matre assistant lISECS
Votre interlocuteur
Tarak CHAARI
Matre Assistant lInstitut Suprieur dElectronique
et de Communication de Sfax
Thse soutenue fin septembre 2007 lINSA de Lyon
Recherche (ReDCAD ENIS)
ladaptation dans les systmes dinformation pervasifs
gestion smantique de la qualit de service
Tarak CHAARI
Android
Objectifs
Prsentation des enjeux des architectures mobiles
Android
Introduction
Tarak CHAARI
Android
Constat
Explosion du march des terminaux mobiles
Faible cot
Internet
AVANT :
Affichage limit
100x60 pour les crans N/B
640x240 pour les terminaux avec crans couleurs
Faible mmoire
Ne dpasse pas 1Mo de mmoire morte et vive runies
Faibles capacits de calcul
Moyens de communication limits
MAINTENANT :
Hautes rsolutions, GPS, WIFI, extension mmoire
Android
Tarak CHAARI
Android
Tarak CHAARI
Android
Enjeux
Fournir linformation partout
et tout moment
Tlphone mobile
PALM
PDA
Tablettes
eBook / cartable lectronique
Tarak CHAARI
Android
Origines
Google? Pas tout fait, cest une PME amricaine qui
sappelle Android cr en 2003 et rachete par Google en
2005
Google voulait sintroduire dans le march mobile (pas
russi au dbut)
Lobjectif est davoir un OS mobile qui peut apercevoir la
situation de lutilisateur (notamment lemplacement
gographique)
En 2007, Apple dvoile
technologie apparait)
Tarak CHAARI
lIphone
(un
gouffre
Android
de
Tarak CHAARI
Android
10
Tarak CHAARI
Android
11
store)
publier autant dapplication quon veut vie pour 25 $
complmentaires)
API simple de haut niveau (2 lignes de code pour envoyer un
SMS)
Android
12
Ingnieux
rutiliser le maximum de lexistant et combiner les composants :
Exemple : utiliser le rpertoire tlphonique
Combiner les composants (Appareil photo + GPS par exemple)
Collecte
source)
Tarak CHAARI
Android
13
bloquer
Un SMS ou un appel est toujours plus prioritaire que les autres
applications
Android
14
des utilisateurs)
Nature de lcran
avec stylet petits composants
sensitif composants plus gros
Android
15
Android
16
Tarak CHAARI
Android
17
Architecture dAndroid
Tarak CHAARI
Android
18
Architecture couches
Tarak CHAARI
Android
19
Android
Le noyau android
Noyau standard Linux assurant :
Alarm
Process Binder
Power Management
Kernel Debugger
Logger
Android
Gestion de lnergie
Problme
Limite
Tarak CHAARI
Android
Tarak CHAARI
Android
Core Libraries
Fournit les fonctionnalits offertes par les librairies de
de donnes
Utilitis
Tarak CHAARI
Android
pile
Tarak CHAARI
Android
Tarak CHAARI
Android
Librairies (1/2)
Dveloppes en C/C++
Android
Librairies (2/2)
Suite de la liste des librairies principales
System C Library (Bionic)
Media Libraries
Surface Manager (Surface Flinger)
Audio Manager (Audio Flinger)
3D Libraries (OpenGL)
LibWebCore (WebKit)
Gestion de la persistance (SQLite)
Bionic
Custom libc implementation optimized for embedded use
Problem with GNU libc
License
Size
Speed
Tarak CHAARI
Composants
applications
Java
de
base
pour
les
autres
Tarak CHAARI
Android
Couche Applications
Tarak CHAARI
Android
Tarak CHAARI
Android
31
Tarak CHAARI
Android
32
Outils Android
Tarak CHAARI
Android
33
Prrequis (1/2)
JDK http://www.oracle.com/technetwork/java/javase/downloads
Android SDK http://developer.android.com/sdk/index.html
Tarak CHAARI
Android
34
Prrequis (2/2)
Tarak CHAARI
Android
35
Development
Tools
System Images
Sample Code
and
Applications
Documentation
Rpertoire
Description
Development Tools
System Images
Sample Code and
Applications
Documentation
Tarak CHAARI
Android
Tarak CHAARI
un
processus
Android
sqlite3
Un outil permettant daccder aux bases de donnes SQLite des
applications Android
Traceview
Analyse statistiques sur les applications (mmoire utilise, charge
processeur)
dx
Tarak CHAARI
Android
IDE de dveloppement
Pour ne pas dstabiliser les dveloppeurs: un diteur habituel
Tarak CHAARI
Android
40
communaut
Tarak CHAARI
Android
Android
Exemples de plug-ins:
Plug-in
Function
JDT
CDT
UML2
...
Tarak CHAARI
Android
Tarak CHAARI
Android
Installation - ADT
Tarak CHAARI
Android
Un mulateur (1/3)
Pour essayer les applications dveloppes (pas obligatoire)
Tarak CHAARI
Android
46
Un mulateur (2/3)
Tarak CHAARI
Android
47
Un mulateur (3/3)
Pour le test
sur le
terminal, ne
pas oublier
dinstaller les
pilotes USB !
Tarak CHAARI
Android
48
Tarak CHAARI
Android
49
Tarak CHAARI
Android
Data Files
Tarak CHAARI
Resources
Files
Android
Description
Activity
Service
Broadcast Receiver
Content Provider
Android
Applications Android
une application graphique est un assemblage de
fentres entre lesquelles il est possible de naviguer
Ces diffrentes fentres sont appeles des activits
Android
Activits
Tarak CHAARI
Android
Activit
Android
55
Android
56
OnPause
2)
3)
OnResume
4)
Tarak CHAARI
Android
Android
Android
Activits
activit_1
Activit 2
Activit 3
onCreate(..)
onStart();
Dveloppeur
Android OS
activit_1.onCreate();
startActivity(activit_1);
activit_1.onStart();
Tarak CHAARI
Android
Android
Android
Android
State
Description
Running
Paused
Stopped
64
Android
65
Nom de lactivit
ressources
Android
66
J2ME
67
67
Les resources
Un rpertoire res est automatiquement cr lors de la
cration dun projet android (en plus dun rpertoire src)
/* AUTO-GENERATED FILE. DO NOT MODIFY. This class was
automatically generated by the
* aapt tool from the resource data it found. It should not be
modified by hand. */
/res
anim
drawable
xhdpi
hdpi
mdpi
ldpi
layout
values
arrays.xml
colors.xml
strings.xml
xml
raw
Tarak CHAARI
R.java
package cs454.demo;
public final class R {
public static final class attr {
}
public static final class drawable {
public static final int icon=0x7f020000;
}
public static final class id {
public static final int textview=0x7f050000;
}
public static final class layout {
public static final int main=0x7f030000;
}
public static final class string {
public static final int app_name=0x7f040001;
public static final int hello=0x7f040000;
}
}
Android
Types de ressources
Type
Description
Dessin et image
(res/drawable)
Menu
(res/menu)
Donne brute
(res/raw)
Diffrentes variables
(res/values)
Tarak CHAARI
Android
69
Exemples de quantificateurs :
Langues : fr,en, fr-rFR, fr-rCA
Taille de lcran : small, normal, large, xlarge
rsolution de lcran : ldpi (160 dpi), mdpi (160 dpi), hdpi (240
Android
String hw = res.getString(R.string.hello);
XXX o = res.getXXX(id);
texte.setText("Here we go !");
J2ME
71
En voici lutilisation au sein dun exemple qui cre une mise en page sous
forme de table (dune ligne et de deux colonnes) dont les cellules sont
remplies par des chanes de caractres :
<?xml version="1.0" encoding="utf-8"?>
<TableLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:stretchColumns="1">
<TableRow>
<TextView android:text="@string/table_cellule_gauche" />
<TextView android:text="@string/table_cellule_droite" />
</TableRow>
</TableLayout>
J2ME
72
72
Les chanes
res = getResources();
hw = res.getString(R.string.hello);
J2ME
73
73
Internationalisation
Le systme de ressources permet de grer facilement l'internationalisation
d'une application.
Il
suffit de crer des rpertoires values-XX o XX est le code de la langue que l'on
souhaite implanter.
On
place alors dans ce sous rpertoire le fichier xml strings.xml contenant les
chaines traduites associes aux mme clefs que dans values/strings.xml.
Android
systme.
On
res/
values/
strings.xml
values-es/
strings.xml
values-fr/
strings.xml
J2ME
74
74
75
75
Les couleurs
Une couleur dfinit une valeur RVB (rouge, vert et bleu) et une
transparence.
Cette
: R.color.bleu_transparent
XML : @[package:]color/bleu_transparent
J2ME
76
76
Les dimensions
sp
77
77
: R.dimen.un_nom
Resources.getDimen(R.dimen.taille_texte);
XML
: @dimen/un_nom
<TextView android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:textSize="@dimen/taille_texte"/>
J2ME
78
78
Les images
: R.drawable.image1
XML : @[package:]drawable/image1
J2ME
79
79
Les animations
La dclaration danimations contient des possibilits de rotation, de
fondu, de translation et de changements de taille. Les animations sont
places dans un ou plusieurs fichiers dans le rpertoire res/anim.
Voici les quatre types danimations proposes :
<alpha> : permet de faire un fondu ;
<scale> : dfinit un facteur dchelle de dpart et darrive en X et Y ;
<translate> : permet de dplacer llment ;
<rotate> : propose une rotation avec un point pivot et un angle en degrs.
<alpha xmlns:android="http://schemas.android.com/apk/res/android"
android:interpolator="@android:anim/accelerate_interpolator"
android:fromAlpha="0.0" android:toAlpha="1.0" android:duration="100"/>
Tarak Chaari
J2ME
80
Tarak CHAARI
Android
81
XML
Par programmation
package cs454.demo;
import android.app.Activity;
import android.widget.TextView;
import android.os.Bundle;
public class AndroidDemo extends Activity {
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
// Activity is a subclass of context, so the TextView takes this as a parameter
TextView tv = new TextView(this);
tv.setText("Hello, CS454");
setContentView(tv);
}
}
package cs454.demo;
import android.app.Activity;
import android.os.Bundle;
Whats R?
package cs454.demo;
public final class R {
public static final class attr {
}
public static final class drawable {
public static final int icon=0x7f020000;
}
public static final class id {
public static final int textview=0x7f050000;
}
public static final class layout {
public static final int main=0x7f030000;
}
public static final class string {
public static final int app_name=0x7f040001;
public static final int hello=0x7f040000;
}
}
Linear Layout
Shows nested View elements
/* linear.xml */
<?xml version=1.0 encoding=utf-8?>
<LinearLayout android:orientation=horizontal
android:layout_width=fill_parent
android:layout_height=fill_parent
android:layout_weight=1>
<TextView android:text=red />
<TextView android:text=green />
</LinearLayout>
<LinearLayout android:orientation=vertical
android:layout_width=fill_parent
android:layout_height=fill_parent
android:layout_weight=1>
<TextView android:text=row one />
</LinearLayout>
Tarak CHAARI
Android
Table Layout
Like the HTML div tag
/* table.xml */
<?xml version=1.0 encoding=utf-8?>
<TableLayout android:layout_width=fill_parent
android:layout_height=fill_parent
android:stretchColumns=1>
<TableRow>
<TextView android:layout_column=1
android:text=Open...
android:padding=3dip />
<TextView android:text=Ctrl-O
android:gravity=right
android:padding=3dip />
</TableRow>
</TableLayout>
Tarak CHAARI
Android
Grid View
/* grid.xml */
<?xml version=1.0 encoding=utf-8?>
<GridView
android:id=@+id/gridview
android:layout_width=fill_parent
android:layout_height=fill_parent
android:columnWidth=90dp
android:numColumns=auto_fit
android:verticalSpacing=10dp
android:horizontalSpacing=10dp
android:stretchMode=columnWidth
android:gravity=center
/>
Tarak CHAARI
Android
Grid View
/* GridExample.java */
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.grid);
GridView gridview = (GridView) findViewById(R.id.gridview);
gridview.setAdapter(new AdapterForGridView(this));
gridview.setOnItemClickListener(
new OnItemClickListener() {
public void onItemClick(AdapterView<?> parent, View v,
int pos, long id) {
Toast.makeText(
GridPrimer.this, "" + pos, Toast.LENGTH_SHORT).show();
}});
Tarak CHAARI
Android
Grid View
/* AdapterForGridView.java */
public class AdapterForGridView extends BaseAdapter {
private Context mContext;
public AdapterForGridView(Context c) { mContext = c; }
public int getCount() { return mThumbIDs.length; }
public Object getItem(int position) { return null;}
public long getItemId(int position) { return 0; }
// bad getView implementation
public View getView(int pos, View convertView, ViewGroup parent) {
ImageView imageView = new ImageView(mContext);
imageView.setImageResource(mThumbIDs[pos]);
return imageView;
}
private Integer[] mThumbIDs =
{ R.drawable.img1, R.drawable.img2 /*...*/ };
}
Tarak CHAARI
Android
Tab Layout
/* tab.xml */
<?xml version=1.0 encoding=utf-8?>
<TabHost android:id=@android:id/tabhost
android:layout_width=fill_parent
android:layout_height=fill_parent>
<LinearLayout android:orientation=vertical
android:layout_width=fill_parent
android:layout_height=fill_parent>
<TabWidget android:id=@android:id/tabs
android:layout_width=fill_parent
android:layout_height=wrap_content/>
<FrameLayout
android:layout_width=fill_parent
android:layout_height=fill_parent/>
</LinearLayout>
</TabHost>
Tarak CHAARI
Android
Tab Layout
/* selector1.xml */
<?xml version=1.0 encoding=utf-8?>
<selector xmlns:android=http://schemas.android.com/apk/res/android>
<! Tab is selected -->
<item android:drawable=@drawable/ic_tab_1_selected
android:state_selected=true />
<! Tab not selected -->
<item android:drawable=@drawable/ic_tab_1_not_selected />
</selector>
/* selector2.xml */
/* selector3.xml */
Tarak CHAARI
Android
Tab Layout
/* Tab1.java */
public class Tab1 extends Activity {
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
TextView textview = new TextView(this);
textview.setText(This is the Artists tab);
setContentView(textview);
}
}
/* Tab2.java */
/* Tab3.java */
Tarak CHAARI
Android
Tab Layout
/* TabExample.java */
public class TabExample extends TabActivity {
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.tab);
TabHost tabHost = getTabHost();
//--- tab 1 --Intent intent = new Intent().setClass(this, Tab1.class);
TabHost.TabSpec spec = tabHost.newTabSpec(tab1).setIndicator(
Artists, getResources().getDrawable(R.drawable.selector1))
.setContent(intent);
tabHost.addTab(spec);
//--- tab 1 --tabHost.setCurrentTab(2);
}
Tarak CHAARI
Android
List View
/* list_item.xml */
<?xml version=1.0 encoding=utf-8?>
<TextView
android:layout_width=fill_parent
android:layout_height=fill_parent
android:padding=10dp
android:textSize=16sp />
Tarak CHAARI
Android
List View
/* ListViewExample.java */
public class ListViewExample extends ListActivity {
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setListAdapter(new ArrayAdapter<String>(this,
R.layout.list_item, COUNTRIES));
ListView lv = getListView();
lv.setTextFilterEnabled(true);
lv.setOnItemClickListener(new OnItemClickListener() {
public void onItemClick(AdapterView<?> parent, View view,
int position, long id) {
Toast.makeText(getApplicationContext(),
((TextView) view).getText(), Toast.LENGTH_SHORT).show();
}});
}
Tarak CHAARI
Android
Button
ImageButton
EditText
CheckBox
RadioButton
ToggleButton
RatingBar
Tarak CHAARI
Android
DatePicker
TimePicker
Spinner
AutoComplete
Gallery
MapView
WebView
Tarak CHAARI
Android
Events
Event Handler
Hardware buttons
Event Listener
Touch screen
Tarak CHAARI
Android
Events
Tarak CHAARI
Android
Events
Tarak CHAARI
Android
Menus
Options Menu: MENU button, tied to an Activity
Context Menu: View LongPress
Submenu
public void onCreate(Bundle savedInstanceState) {
registerForContextMenu((View)findViewById(/*...*/));
public boolean onCreateOptionsMenu(Menu menu) {
}
menu.add(0, MENU_ADD, 0, Add)
public void onCreateContextMenu(ContextMenu menu, View v,
.setIcon(R.drawable.icon);
ContextMenuInfo menuInfo){
menu.add(0, MENU_WALLPAPER, 0, Wallpaper);
super.onCreateContextMenu(menu, v, menuInfo);
return super.onCreateOptionsMenu(menu);
menu.add(0, MENU_SMS, 0, SMS);
}
menu.add(0, MENU_EMAIL, 0, Email);
public boolean onOptionsItemSelected(MenuItem item) {
}
switch(item.getItemId()) {
public boolean onContextItemSelected(MenuItem item) {
case MENU_ADD:
//... ; return true;
switch(item.getItemId()) { case MENU_SMS: /*...*/ }
case MENU_WALLPAPER: //... ; return true;
}
default: return false;
}
}
Tarak CHAARI
Android
les intents
J2ME
106
106
etc)
Contenu concern (identifi par un URI)
Exemples
startActivity(new Intent(Intent.VIEW_ACTION, Uri.parse("http://www..google.fr"));
startActivity(new Intent(Intent.VIEW_ACTION, Uri.parse("geo:47.480843,8.211293"));
startActivity(new Intent(Intent.EDIT_ACTION,Uri.parse("content://contacts/people/1"));
Tarak CHAARI
Android
Android
l'action
les
des
une
des
Solliciter
J2ME
110
110
111
111
112
112
113
113
114
114
115
115
116
116
117
117
J2ME
118
118
J2ME
119
119
120
120
121
121
J2ME
122
122
startActivity(callactivity2);
123
123
124
124
emailIntent.putExtra(android.content.Intent.EXTRA_SUBJECT, "Test");
emailIntent.putExtra(android.content.Intent.EXTRA_TEXT, "Message");
emailIntent.setType("text/plain");
startActivity(Intent.createChooser(emailIntent, "Send mail..."));
finish();
125
125
126
127
127
128
128
129
129
J2ME
130
130
131
131
132
132
Activity
SMS
Tarak CHAARI
Android
Tarak CHAARI
Android
134
Dans le manifest
Android
135
J2ME
136
136
Media
Player
Activity
Tarak CHAARI
Communication
Pause/rewind
/stop/restart
Service
Background
running
for playback
Android
par Context.startService()
Arrter par Context.stopService()
Tarak CHAARI
Android
Tarak CHAARI
Android
Android
140
Dans le manifest
Dclaration du service
<service android:name="com.tuto.android.MonPremierService"/>
Permissions ncessaires
<uses-permission android:name="android.permission.ACCESS_GPS" />
<uses-permission android:name="android.permission.LOCATION" />
Tarak CHAARI
Android
141
Activity
Application
Application
Activity
Content
Resolver
Service
Content
Resolver
Content
Provider
Content
Resolver
Data
SQLite
XML
Remote
Store
Android
donnes
Un ContentResolver peut interagir avec nimporte quel content
provider.
Android
www.redcad.org/members/tarak.chaari/
cours/cours_android.pdf
Tarak CHAARI
Android
144