Vous êtes sur la page 1sur 48

Cours 2 : programmation Android

Plan
Gnral

Log
Listeners

Dmarrer une activit

Intent
startActivity, startActivityForResult

Inlterface graphiques avances

ListView
Menu

Programmation rseau

WebView
Socket

Les log
Class Log
Affiche les messages dans le logcat de faon structure

Id, estampille, tag personnalis, message

Niveaux de verbosit

Verbose, debug, info,

Methodes statiques de la class Log

Log.XXX
XXX=i,e,d,

Exemples

Log.d("MyActivity" , "dmarrage de lactivit")


Log.e("MyActivity" , "Erreur")

Les listeners personnaliss


On a dj une mthode pour ragir un vnement en
spcifiant le nom de la mthode appeler dans lattribut
onClick de la View correspondante

onClick="afficheResultat"

Il faut implmenter la mthode dans lactivit qui possde


la vue correspondante

public void afficheResultat(View v){}

Filtrage par nom de mthode

Noms de mthodes unique dans lactivit associe

Il existe une autre mthode pour associer un listener


une vue

Directement dans le code java

InputEvent et Listener
Une autre approche est de dabonner lactivit des vments
spcifiques.

Listener = Observer design pattern (conception OO)


http://www.vogella.com/articles/DesignPatternObserver/article.html

Mthodes de call-back pour InputEvent

1.
2.
3.

Etendre linterface OnXXXListener correspondante par la classe qui


intercepte lvt
La classe doit donc surcharger la mthode correspondante
onXXX()
La mthode est appele par le framework Android quand une action
correspondante se produit sur lobjet.

Exemple

Quand une vue est touche par lutilisateur, la mthode


onTouchEvent() method est appele sur cet objet.

Liste des interfaces de Listener graphique


http://developer.android.com/reference/android/view/View.html

Exemple dinterfaces
http://developer.android.com/reference/android/view/View.OnClickListener.html
http://developer.android.com/reference/android/view/View.OnTouchListener.html

Les listeners communs


Class myActivity implementes OnClickListener{
// contient 2 boutons b1 et b2
// une seule mthode pour tous les OnClickEvent

@Override
public void onClick(View v) {
Log.i("quelquun a cliqu quelquepart");

View.getid()
pour identifier
la source

if( b1.getId() == ((Button)v).getId() ){


// it was the first button
} else if( b2.getId() == ((Button)v).getId() ){
// it was the second button

}
}
}
8

Les listeners ddies une View


Une autre approche est de dabonner la vue des
vments spcifiques via une classe anonyme.
Chaque View construit son listener personnel.

Button b = (Button)findViewById(R.id.Button01);
b.setOnClickListener(new OnClickListener() {
@Override

public void onClick(View v) {


Toast.makeText(this, "on ma cliqu dessus!",
Toast.LENGTH_LONG).show();
}
});

Les activits

10

La pile des activits

Les activits sont


empiles/dpiles
Empile quand une activit
dmarre
Dpile (i.e. dtruite)
quand on presse le bouton
'BACK'
Une pression sur le
bouton 'HOME' ne
dpile pas l'activit.

11

Elle passe simplement en


arrire plan

Mthodes de call-back dune activit

On a dj vu que le changement dtat dune activit provoque


le dclenchement de la mthode de call-back correspondante.
Il est indispensable dimplmenter les mthodes suivantes sous
peine de comportement instable

En particulier lorsque lapplication est constitue de plusieurs


activits
onCreate(): alloue les ressources
onStop() : sauvegarde si ncessaire
onDestroy() : dsalloue les ressources

Attention toujours crer ces mthodes, et appeler la


mthode correspondante sur super

12

Dans onStop(), appel super.stop()

Multi-tches

Plusieurs piles d'activits peuvent co-exister avec Android

L'utilisateur passe de l'une l'autre

Reprend l'activit
situe au sommet
de la pile

13

Dmarrer une activit

Pour pouvoir tre lance, toute activit doit tre


pralablement dclare dans le manifeste
Une activit est dsigne comme activit initiale de
l'application

Lancer une activit

Ceci est indiqu dans le fichier AndroidManifest.xml


Mthode startActivity()

Lancer une activit en vue d'obtenir un rsultat en retour

14

Mthode startActivityForResult(Intent)

Exemple

15
http://www.univ-orleans.fr/lifo/Members/Jean-Francois.Lalande/enseignement/android/cours-android.pdf

Intent

Les Intents permettent de grer l'envoi et la rception de


messages afin de faire cooprer les applications.

Classification des Intent

Le but des Intents est de dlguer une action un autre composant,


une autre application ou une autre activit de l'application courante.

Intent explicite : indique lidentifiant du composant destinataire


Intent implicite : indique le type daction demande et
optionnellement lURI correspondante

URI : Uniform Resource Identifier

16

Gnralise la notion dURL


Schma gnrique = scheme://host:port/path
schemes usuels : http, mailto, tel, mms, geo, file, ...

Intent

Un objet Intent contient les information suivantes:

17

le nom du composant cibl (facultatif)


l'action raliser, sous forme de chaine de caractres
les donnes: contenu MIME et URI
des donnes supplmentaires sous forme de paires de
clef/valeur
une catgorie pour cibler un type d'application
des drapeaux (information supplmentaire)

Intent Explicite

Intent explicite : indique lidentifiant du composant


destinataire
Demande la cration dune nouvelle activit en lui passant
le nom de la classe en paramtre. Le systme dmarre
une nouvelle instance de la classe
startActivity(this, ActivityTwo.class);
Intent login = new Intent(this, GiveLogin.class);
startActivity(login);

18

Intent Implicite

Intent implicite : nindique pas directement lidentifiant du


composant destinataire; indique le type daction
demande et optionnellement lURI correspondante
Demande la cration dune activit capable deffectuer
laction demande.

Le systme cherche une application ayant la capacit


effectuer laction demande
Le systme dmarre une nouvelle instance de la classe
Intent intent=new Intent(ACTION, [uri]);
startActivity(intent);

19

Intent Implicite
Button b = (Button)findViewById(R.id.Button01);
b.setOnClickListener(new OnClickListener() {
@Override

public void onClick(View v) {


Uri telnumber = Uri.parse("tel:0248484000");
Intent call = new Intent(Intent.ACTION_DIAL,
telnumber);
startActivity(call);
}
});

20

Demande louverture dun service capable de


composer un numro de tlphone et lui
passe lURI correspondant au schema reconnu
tel:<numerodetel>

Liste des actions possibles

Plusieurs actions natives existent par dfaut sur Android.


La plus courante est l'action Intent.ACTION_VIEW qui
permet d'appeler une application pour visualiser un
contenu dont on donne l'URI.
Les autres actions sont:

21

ACTION_CALL (ANSWER, DIAL):


passer/rceptionner/afficher un appel
ACTION_EDIT (DELETE): diter/supprimer une donne
ACTION_SEND: envoyer des donnes par SMS ou E-mail
ACTION_WEB_SEARCH: rechercher sur internet

Intent Implicite
Intent emailIntent = new
Intent(android.content.Intent.ACTION_SEND);
String[] recipients = new String[]{"my@email.com", "",};
emailIntent.putExtra(android.content.Intent.EXTRA_EMAIL,
recipients);
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();

22

Lactivit peut forcer le


systme la dpiler avec
finish()

Retour dune activit

Lorsque le bouton retour est press, l'activit courante prend


fin et revient l'activit prcdente.

Cela permet par exemple de terminer son appel tlphonique et de


revenir l'interface ayant initi l'appel.

Au sein d'une application, une activit peut vouloir rcuprer


un code de retour de l'activit "enfant".
On utilise pour cela la mthode
startActivityForResult(Intent i,int requestCode) qui
envoie un code de retour l'activit enfant.
Lorsque l'activit parent reprend la main, il devient possible de
filtrer le code de retour dans la mthode
onActivityResul(int requestCode, int resultCode,
Intent data) pour savoir si l'on revient ou pas de l'activit

enfant.
23

Retour dune activit

Code dappel dans lactivit appelante


Intent login = new Intent(this,
GivePhoneNumber.class);
startActivityForResult(login,48);

Code de traitement par lactivit appelante


protected void onActivityResult(int requestCode, int
resultCode, Intent data){
Filtre sur le numero de requete
if (requestCode == 48){
Toast.makeText(this,
"Coup de tel termin",
Toast.LENGTH_LONG).show();
}
}
24

Code excut au retour de lactivit


appele

Transfert de donnes

Les Intent peuvent aussi transporter des donnes quune


application veut transmettre une autre application
Activit appelante : intent.putExtra(key,value);
Intent login = new Intent(this, GivePhoneNumber.class);
login.putExtra("nom", "toto");
login.putExtra("pwd", "$$toto31");
startActivityForResult(login,48);

Activit appele:

intent.getExtras().getXXX(key);

Bundle extra = intent.getExtras();


String nom = extra.getString("nom");
String pwd = extra.getString("pwd");
25

Transfert de donnes

Les types de base (+array) sont grs

putExtra(String key String val)


putStringArrayListExtra(String key,
ArrayList<String> value)

Les types complexes (c-a-d les classes) doivent implmenter


Parcelable, ou Serializable

Rcupration du donnes via

Bundle bundle = getIntent().getExtras();


Rcupration par la mthode bundle.getXXX() propre

chaque type

26

bundle.getDouble()
bundle.getString()
bundle.getArray()

Retour dune activit

Lactivit appele peut :

transmettre un code de retour via setResult(codeRetour)


transmettre des donnes supplmentaires
1. Construire un nouvel Intent via new Intent()
2. Ajouter des donnes dans lIntent via putExtra(String)
3. Envoyer le resultat via setResult (int
resultCode, Intent data)
4.
5.

27

Le code de la requte est ajoute automatiquement


Le nouvel Intent est envoy lapplication appelante

Retour dune activit

Lactivit appele fabrique un nouvel Intent


Intent intent = new Intent();
intent.putExtra("resultat", ""+result);
setResult(Activity.RESULT_OK, resultIntent);

RESULT_OK
= constante
prdfinie

Lactivit appelante rcupre les donnes


public void onActivityResult(int requestCode,
int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
switch(requestCode) {
case (48) : {
if (resultCode == Activity.RESULT_OK) {
// TODO Extract the data } break; }
}
}
28

Retour dune activit

Lactivit appele peut forcer le retour en appelant


finish()
// mthode onCreate de lactivite pour implmenter
// un bouton qui referme lactivit
Button finish = (Button)findViewById(R.id.finish);
finish.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
setResult(50);
finish();
}});
Code diffrent de RESULT_OK pour
signaler un cas particulier

29

Interfaces graphiques avances

30

ListView

Certains composants graphiques permettent d'afficher


beaucoup d'items par des mcanismes de dfilement.

les Gallery (liste centre dfilement horizontal)


les Spinner (boutons de dfilement)
les ListView (liste dfilantes)

Pour fournir les items ces composants graphiques, on


utilise des AdapterView
Les AdapterView grent aussi les vnements (i.e. les
interactions) sur le composant graphique avec lequel ils
sont associs

31

Le composant ListView

Il permet d'afficher une


"norme" liste d'items,

accessible par dfilement


accessible par filtre : l'utilisateur
tape les premires lettres, le
ListView n'affiche plus que les
items qui commencent par ces
lettres

En gnral les items


proviennent d'un accs
ventuellement distant des
donnes
32

MenuItem

On commence par indiquer comment seront afficher chaque


item du ListView dans un fichier XML part du rpertoire
/res/layout
Ici chaque item est un TextView.
On construit le fichier res/layout/list_item.xml :

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


<TextView
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:padding="10dp"
android:textSize="16sp" >
</TextView>

33
http://developer.android.com/resources/tutorials/views/hellolistview.html

ListView : ihm

On construit linterface graphique de la ListView dans


un fichier XML du rpertoire /res/layout

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


<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="fill_parent"
android:layout_height="fill_parent">
<ListView android:layout_height="wrap_content"
android:layout_width="match_parent"
android:id="@+id/listMenu">
</ListView>
</LinearLayout>
34

Lactivit ListActivity

Une ListView occupe tout l'cran. Elle peut tre


construite partir d'une android.app.ListActivity (qui
hrite de android.app.Activity)
Lorsque on construit une classe qui hrite de ListActivity,
on peut alors utiliser plusieurs mthodes de la classe
ListActivity :

public ListView getListView() qui retourne le composant


graphique ListView associ cette activit
public void setListAdapter(ListAdapter adapter) positionne le
ListAdapter associ cette activit

On spcialise la mthode onCreate()


35

Etendre la classe ListActivity

Dans le code Java, on rcupre cette ListView (par la


mthode findViewById()) et on l'alimente d'items :

ListView laListe = (ListView) findViewById(R.id.listMenu);


Resources res = getResources();
String [] lesItems = new String[] {
Dfinis dans
res.getString(R.string.country),
/res/strings.xml
res.getString(R.string.society)
};
laListe.setAdapter(new ArrayAdapter<String>(this,
R.layout.list_item, lesItems));
Affiche la liste des items qui ne
sont pas cliquables
36

ListView : gestion des vnements

La gestion des vnements est assur par le listener


public void setOnItemClickListener
(AdapterView.OnItemClickListener listener)

Il faut implmenter la mthode

public void onItemClick(AdapterView<?> parent,


View view, int position, long id)

La mthode est appele lorsque l'utilisateur slectionne


un item de la ListView

37

parent est la ListView qui a t utilise lors de l'vnement


view est la View (c'est dire l'item a l'intrieur de la ListView)

qui a t utilis
position est le numro de l'item dans cette ListView
id est l'identificateur de l'item slectionn

ListView : gestion des vnements


Public class HelloListViewActivity extends ListActivity {
// les items a afficher sont dans un tableau
static final String[] COUNTRIES = new String[] { ... }

}
38

@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setListAdapter(new ArrayAdapter<String>(this,
getListView
R.layout.list_item, COUNTRIES));
seulement dans
ListView lv = getListView();
ListActivity
lv.setTextFilterEnabled(true);
lv.setOnItemClickListener(new OnItemClickListener() {
public void onItemClick(AdapterView<?> parent, View view,
int position, long id) {
// le code lanc lors de la slection d'un item
}
});
}
setTextFilterEnabled permet dactiver/de
dsactiver la slection par prfixe

Menu

Saffiche quand on accde au


bouton menu du mobile
Le principe est le mme que
celui des ListView
Il faut mettre le fichier
menu.xml dans /res/menu
On peut avoir des sousmenus
source du tutorial sur les
menus

39

Clic sur options

Menu : IHM

<!- fichier /res/menu/menu.xm -->


<menu
xmlns:android="http://schemas.android.com/apk/res/android">
<item android:id="@+id/option" android:title="Options" >
<menu android:id="@+id/sousmenu">
<item android:id="@+id/favoris"
android:title="Favoris" />
<item android:id="@+id/stats"
android:title="Stats" />
</menu>
</item>
<item android:id="@+id/quitter"/>
</menu>

40

public class MonMenu extends Activity {


@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.menu.menu);
}
//Mthode qui se dclenchera lorsque vous appuierez sur le bouton menu du tlphone
public boolean onCreateOptionsMenu(Menu menu) {}

Menu : IHM

//Mthode qui se dclenchera au clic sur un item


public boolean onOptionsItemSelected(MenuItem item) { /
//On regarde quel item a t cliqu grce son id et on dclenche une action
switch (item.getItemId()) {
case R.id.option: Toast.makeText(this, "Option", Toast.LENGTH_SHORT).show();
return true;
case R.id.favoris: Toast.makeText(this, "Favoris", Toast.LENGTH_SHORT).show();
return true;
case R.id.stats: Toast.makeText(this, "Stats", Toast.LENGTH_SHORT).show();
return true;
case R.id.quitter: finish(); return true;
}
return false;
} 41}

Programmation rseau

42

WebView

Les WebView permettent dobtenir


une page Web partir dune
application Android

A lintrieur du layout de lactivit.


Ninclue pas toutes les fonctionnalits
dun niavigateur

Usages

43

Afficher un document hberg sur un


serveur Web
Ouvrir une application Web

Webview : IHM, manifeste et javascript

Fichier /res/layout/webview.xml

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


<WebView
xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/webview"
android:layout_width="fill_parent"
android:layout_height="fill_parent" />

Ajout des permissions dans le manifest

<uses-permission android:name="android.permission.INTERNET" />

Chargement dune page web avec loadURL(String url)


Autoriser javascript avec
webSettings.setJavaScriptEnabled(true);
44

Webview : Activity
toto android.app.Activity;
import
import android.os.Bundle;
import android.view.KeyEvent;
import android.webkit.WebView;
import android.webkit.WebViewClient;
public class HelloWebView extends Activity {
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.google.com");
}
45

Socket

Utiliser les Socket java.net


avec Android comme avec
une application Java
classique filaire.
Masque la couche 2 (Wifi,
Ethernet)
Ncessite la permission
INTERNET

<uses-permission android:name=
"android.permission.INTERNET" />

46

TCPServer
try {
Boolean end = false;
ServerSocket ss = new ServerSocket(12345); //port TCP
while(!end){
//Server is waiting for client here, if needed
Socket s = ss.accept();
BufferedReader input = new BufferedReader(
newInputStreamReader(s.getInputStream()));
PrintWriter output = newPrintWriter(
s.getOutputStream(),true); //Autoflush
String st = input.readLine();
Log.d("TcpServer",st);
output.println("salut");
s.close();
}
ss.close();
}catch(Exception e){e.printStackTrace();}

47

TCPClient
try {

Socket s = new Socket("localhost",12345);


//Ecrire dans la socket
OutputStream out = s.getOutputStream();
PrintWriter output = new PrintWriter(out);
output.println("Hello Android!");
//Lire dans la socket
BufferedReader input = new BufferedReader(
newInputStreamReader(s.getInputStream()));
String st = input.readLine();
//Referme la connexion
s.close();

} catch (UnknownHostException e) {

48

e.printStackTrace();}