Sei sulla pagina 1di 36

Corso Java ME

Sviluppo di applicazioni per telefoni


cellulari e computer palmari

http://www.gerdavax.it/corsojavame

Stefano Sanna
Versione 1.0.1 gerdavax@gerdavax.it
3 Giugno 2006

1
Corso Java ME – http://www.gerdavax.it/corsojavame
Licenza
Copyright e marchi citati

2
Corso Java ME – http://www.gerdavax.it/corsojavame
Licenza
● Il materiale prodotto per questo corso (slide,
codice sorgente, immagini originali) è stato
rilasciata sotto la licenza
Creative Commons
Attribuzione-NonCommerciale-StessaLicenza2.5

● Per leggere una copia della licenza visita il sito


web:
– http://creativecommons.org/licenses/publicdomain/

o spedisci una lettera a Creative Commons, 559


Nathan Abbott Way, Stanford, California 94305,
USA

3
Corso Java ME – http://www.gerdavax.it/corsojavame
Licenza... in pratica :-)
● E' consentito:
– utilizzare le slide per autoistruzione
– utilizzare le slide per corsi all'interno di scuole
pubbliche o università
– stampare le slide per uso personale
– ridistribuire copia delle slide senza modifiche
● Non è consentito:
– utilizzare le slide per tenere un corso a pagamento
– utilizzare le slide per un qualsiasi scopo
nascondendo le informazioni sull'autore
– modificare il contenuto delle slide

4
Corso Java ME – http://www.gerdavax.it/corsojavame
Limitazione di responsabilità

Malgrado l'impegno e la buona volontà a fornire


contenuti tecnicamente corretti, è possibile che ci
siano errori. Per questo motivo e data la gratuità
della licenza, il materiale è fornito “COSI' COM'E'”,
“AS IS”, e non si fornisce alcuna garanzia sulle
informazioni contenute in questa presentazione né ci
si assume alcuna responsabilità da eventuali danni
causati dall'uso proprio o improprio delle suddette.

5
Corso Java ME – http://www.gerdavax.it/corsojavame
Marchi citati
● I marchi dei prodotti citati in questa presentazione
sono di proprietà dei rispettivi titolari
● Java e tutti i marchi e simboli ad esso correlati
sono di proprietà di Sun Microsystems

● L'autore non ha alcun legame con Sun


Microsystems e con i produttori dei dispositivi e
dei software citati in questa presentazione. Le
considerazioni esposte hanno carattere di
disquisizione tecnica e non esprimono giudizi
positivi o negativi su nessun prodotto

6
Corso Java ME – http://www.gerdavax.it/corsojavame
Java ME
MIDlet

7
Corso Java ME – http://www.gerdavax.it/corsojavame
MIDlet
● Le applicazioni scritte per il Mobile Information
Device Profile sono chiamate MIDlet

● Le MIDlet sono distribuite all'interno di MIDlet


Suite, contenenti una o più applicazioni che
possono condividere lo stesso bytecode e la
stessa area di memoria persistente del dispositivo

● Le MIDlet sono applicazioni managed: la gestione


del loro ciclo di vita è affidata all'Application
Manager, che è responsabile della installazione,
esecuzione e rimozione del software nonché
dell'accesso alle API soggette a restrizione di
sicurezza
8
Corso Java ME – http://www.gerdavax.it/corsojavame
MIDlet Suite
● Le MIDlet all'interno di una Suite fanno parte dello
stesso deployment:
– condividono lo stesso bytecode e stesse risorse
– possono avere accesso alla stessa area riservata ai
servizi di persistenza

● MIDP 2.0 permette di definire delle aree dello


storage che possono essere condivise tra diverse
Suite

9
Corso Java ME – http://www.gerdavax.it/corsojavame
Package
● I package specifici della piattaforma Java ME
hanno (generalmente) prefisso javax.microedition:
– javax.microedition.midlet
● contiene la main class MIDlet
– javax.microedition.lcdui
javax.microedition.lcdui.game
● contengono i componenti per le interfacce grafiche 2D
– javax.microedition.io
● contiene le classi del Generic Connection Framework
– javax.microedition.rms
● contiene le classi del Record Management System
– javax.microedition.media
● contiene le classi per le funzioni multimediali (base)
10
Corso Java ME – http://www.gerdavax.it/corsojavame
Processo di sviluppo
● Il processo di sviluppo include una fase di
preverifica del bytecode prima della packaging:

Java Java library


sources compiler bytecode

preverifier

JAD
preverified
packaging Java
tool bytecode
JAR

● Gli IDE rendono automatico l'intero processo di


sviluppo, dall'editing al packaging
11
Corso Java ME – http://www.gerdavax.it/corsojavame
JAD & JAR
● Le MIDlet Suite sono distribuite dalla coppia di file
JAD & JAR:
– JAD, Java Application Description: contiene tutte le
informazioni che descrivono le applicazioni, i
requisiti per l'installazione, property e parametri
per l'esecuzione, permessi richiesti sulle API
– JAR, Java Archive: contiene le classi
dell'applicazione, le eventuali librerie di terze parti,
risorse (file di testo, immagini, suoni, dati binari)
necessari all'esecuzione dell'applicazione

● La coppia è generata automaticamente dal tool di


sviluppo

12
Corso Java ME – http://www.gerdavax.it/corsojavame
Esempio file JAD
MIDlet-Version: 1.0.2
MIDlet-Vendor: Stefano Sanna
MIDlet-Jar-URL: http://www.gerdavax.it/corsojavame.jar
MicroEdition-Configuration: CLDC-1.1
MicroEdition-Profile: MIDP-2.0
MIDlet-1: Demo1, , it.gerdavax.corsojavame.Demo1
MIDlet-Jar-Size: 10819
MIDlet-Name: Demo1
...
...

13
Corso Java ME – http://www.gerdavax.it/corsojavame
JAD
● Contiene le informazioni sull'applicazione,
mostrate all'utente prima che si proceda con il
download e l'installazione del software
● L'Application Manager è in grado di
determinare se il dispositivo è grado di eseguire
l'applicazione (configurazione, profilo...) e se il
bytecode proviene da un dominio autorizzato ad
utilizzare certe funzionalità
● Attenzione: l'indicazione della dimensione del file
JAR deve essere esatta; in caso contrario alcuni
dispositivi rifiutano il caricamento dell'archivio
● E' consigliabile che l'URL del JAR sia assoluto

14
Corso Java ME – http://www.gerdavax.it/corsojavame
JAR
● Svolge lo stesso ruolo che ha nella Standard
Edition, con alcune differenze:
– deve contenere l'indispensabile per l'esecuzione
dell'applicazione: il dispositivo potrebbe non essere
in grado di salvare l'archivio e il costo di
trasferimento potrebbe essere troppo oneroso
– non è possibile caricare classi e risorse da JAR file
diverso da quello di avvio
● Specificità dei dispositivi:
– i terminali possono avere una limitazione sulla
dimensione massima del JAR (ad esempio: 64K)
– alcuni terminali richiedono esplicitamente che il file
JAR sia compresso

15
Corso Java ME – http://www.gerdavax.it/corsojavame
Deployment
● Il rilascio dell'applicazione per l'installazione su
dispositivo può avvenire in tre modalità principali:
– Over-The-Air: l'applicazione è resa disponibile su
un server WAP o WEB pubblico, attraverso il quale il
terminale JME può scaricarla e procedere con
l'installazione
– PC-based: si procede all'installazione attraverso
software dedicato fornito dal produttore del
dispositivo
– OBEX: il terminale JME riceve il file jar attraverso
trasferimento OBEX (Push o FTP a seconda delle
funzionalità del terminale e del PC di appoggio) e
provvedere all'installazione in maniera autonoma

16
Corso Java ME – http://www.gerdavax.it/corsojavame
JAD, JAR & Manifest...
● Alcuni terminali permettono l'installazione
dell'applicazione a partire dal solo file JAR:
quest'ultimo, infatti, contiene le medesime
informazioni del JAD all'interno del Manifest (ad
eccezione dell'URL e della dimensione del JAR
stesso!)

● Durante una installazione OTA, in caso di


discordanza tra le informazioni contenute nel JAD
e nel Manifest, l'Application Manager può
rifiutare l'installazione per motivi di sicurezza! I
parametri custom possono differire (il web service,
ad esempio, potrebbe inserire dinamicamente
delle informazioni nel JAD)
17
Corso Java ME – http://www.gerdavax.it/corsojavame
Deployment
● In caso di installazione OTA, il web server dovrà
esporre opportuni MIME-TYPE per descriptor e
archivio (su Apache: /etc/apache/mime.types):

application/java-archive jar

text/vnd.sun.j2me.app-descriptor jad

● Senza la corretta impostazione


sul web service, l'Application JAD
Manager può interrompere
l'installazione dell'applicazione JAR
segnalando un errore di formato Web Server

18
Corso Java ME – http://www.gerdavax.it/corsojavame
Ciclo di vita delle MIDlet

destroyApp()

Paused Active Destroyed


startApp() destroyApp()

pauseApp()

caricamento

19
Corso Java ME – http://www.gerdavax.it/corsojavame
MIDlet skeleton
import javax.microedition.midlet.*;

public class MyMIDlet extends MIDlet {

public MyMIDlet() { }

public void startApp() { }

public void pauseApp() { }

public void destroyApp(boolean unconditional) { }

}
20
Corso Java ME – http://www.gerdavax.it/corsojavame
Inizializzazione e avvio
● L'inizializzazione della MIDlet deve avvenire nel
costruttore:
– creazione dell'interfaccia grafica (consigliata lazy
initialization)
– allocazione delle strutture dati principali
– lettura parametri di piattaforma

● Il metodo startApp() può essere invocato più


volte: esso, dunque, non inizializza alcun oggetto
ma si occupa di:
– visualizzare l'interfaccia grafica
– avviare eventuali Thread

21
Corso Java ME – http://www.gerdavax.it/corsojavame
Sospensione
● Il metodo pauseApp() è invocato al
sopraggiungere di una chiamata o altro evento
per il quale è richiesto di sospendere
l'applicazione

● Sospendere non significa andare in


background! L'applicazione deve congelare il
proprio stato (così da riprendere l'esecuzione alla
successiva invocazione di startApp()), fermare i
thread e chiudere eventuali connessioni di rete.
Per sicurezza meglio salvare qualche dato sulla
flash del dispositivo! :-(

22
Corso Java ME – http://www.gerdavax.it/corsojavame
MIDlet: cominciano i problemi...!
● L'ambiente di sviluppo ci invita a implementare i
metodi principali della MIDlet, ma è facile
constatare che non tutti funzionano...:
pauseApp(), ad esempio, non è invocato quasi
mai! I produttori dei dispositivi... l'hanno ignorato!
:-(

23
Corso Java ME – http://www.gerdavax.it/corsojavame
Interazione con l'Application Manager
● L'applicazione notifica all'Application Manager
eventuali variazioni nel suo stato, attraverso i
metodi definiti nella classe MIDlet:

– notifyPaused(): l'applicazione ha rilasciato le


risorse ed è in stand-by

– resumeRequest(): l'applicazione chiede


all'Application Manager di essere riavviata

24
Corso Java ME – http://www.gerdavax.it/corsojavame
Chiusura di una applicazione
● Il ciclo di vita di una MIDlet è gestito
dall'Application Manager: per questo motivo,
l'applicazione non conclude la sua esecuzione con
il classico

System.exit(EXIT_CODE)

bensì notificando all'Application Manager che tutte


le risorse sono state deallocate e l'applicazione è
pronta per essere terminata:

notifyDestroyed()

25
Corso Java ME – http://www.gerdavax.it/corsojavame
Property
● La MIDlet può accedere a due set di property:
– System property
● dipendono dal dispositivo in uso
● forniscono informazioni sul runtime, la configurazione, il
profilo e la versione di tutte le API opzioni disponibili
● si leggono attraverso il metodo System.getProperty()

– MIDlet property
● sono contenute all'interno del file JAD
● fanno parte del packaging dell'applicazione
● eventuali property dinamiche (generate in fase di OTA
deployment) possono essere aggiunte
● si leggono con il metodo getAppProperty() della classe
MIDlet

26
Corso Java ME – http://www.gerdavax.it/corsojavame
System.getProperty() keys

microedition.platform microedition.smartcardslots
microedition.encoding microedition.location.version
microedition.configuration microedition.sip.version
microedition.profiles microedition.m3g.version
microedition.io.file.FileConn microedition.jtwi.version
ection.version
wireless.messaging.sms.smsc
file.separator
wireless.messaging.mms.mmsc
microedition.pim.version
CHAPI-Version
microedition.locale
microedition.commports
microedition.hostname

27
Corso Java ME – http://www.gerdavax.it/corsojavame
Hello World!
● Prima di procedere con la descrizione dettagliata
della libreria e delle tecniche di sviluppo su Java
ME... il classico Hello World!

● Sciviamo una semplice MIDlet che mostra un'area


di testo con i saluti al mondo...

28
Corso Java ME – http://www.gerdavax.it/corsojavame
Hello World!
import javax.microedition.midlet.*;

import javax.microedition.lcdui.*;

public class HelloWorld extends MIDlet {

private TextBox gui;

public HelloWorld() {

gui = new TextBox("Hello World!", "Benvenuti al corso Java ME! :-)",


200, TextField.ANY);

public void startApp() { Display.getDisplay(this).setCurrent(gui); }

public void pauseApp() { }

public void destroyApp(boolean unconditional) { }

}
29
Corso Java ME – http://www.gerdavax.it/corsojavame
Una MIDlet un po' più complessa...
● La MIDlet HelloWorld può essere facilmente
arricchita, cosi' da mostrare il valore delle
property di sistema relative al dispositivo in cui e'
in esecuzione

● Per semplificare al massimo l'interfaccia si utilizza


una TextBox, una semplice classe che visualizza
un campo di testo editabile (simile alla TextArea di
AWT): un ciclo for() scandirà il vettore delle
System key alla ricerca delle property...

30
Corso Java ME – http://www.gerdavax.it/corsojavame
System Properties Scanner
● Il telaio della MIDlet è pressoché simile:

import javax.microedition.midlet.*;

import javax.microedition.lcdui.*;

public class PropertiesScanner extends MIDlet {

private static String[] KEYS; // prossima slide...

private TextBox gui;

public PropertiesScanner() { initApp(); }

public void startApp() { Display.getDisplay(this).setCurrent(gui); }

public void pauseApp() { }

public void destroyApp(boolean unconditional) { }

}
31
Corso Java ME – http://www.gerdavax.it/corsojavame
System Properties Scanner
● La classe definisce un vettore di chiavi:
private static String[] KEYS = {"microedition.platform", "microedition.encoding",

"microedition.configuration", "microedition.profiles",

"microedition.io.file.FileConnection.version",

"file.separator",

"microedition.pim.version",

"microedition.locale",

"microedition.commports",

"microedition.hostname",

"microedition.smartcardslots",

"microedition.location.version",

"microedition.sip.version",

"microedition.m3g.version",

"microedition.jtwi.version",

"wireless.messaging.sms.smsc",

"wireless.messaging.mms.mmsc",

"CHAPI-Version"};

32
Corso Java ME – http://www.gerdavax.it/corsojavame
System Properties Scanner
● Il metodo initApp() inizializza l'applicazione,
istanziando l'interfaccia grafica e popolandola con
i valori delle property:

public void initApp() {

// tutte le inizializzazioni

gui = new TextBox ("Properties", "", 800, TextField.ANY);

String property;

for (int i = 0; i < KEYS.length; i++) {

property = System.getProperty(KEYS[i]);

gui.insert(KEYS[i] + ": " + property + "\n", gui.size() -1);

33
Corso Java ME – http://www.gerdavax.it/corsojavame
L'applicazione sugli emulatori

L'emulatore non restituisce


un anonimo J2ME!

34
Corso Java ME – http://www.gerdavax.it/corsojavame
L'applicazione sui dispositivi

35
Corso Java ME – http://www.gerdavax.it/corsojavame
Corso Java ME
http://www.gerdavax.it/corsojavame

36
Corso Java ME – http://www.gerdavax.it/corsojavame

Potrebbero piacerti anche