Introduzione
Dopo il primo articolo introduttivo al mondo della Televisione Digitale Terrestre[1] vediamo di approfondire come si costruiscono le applicazioni interattive nello standard MHP, le Xlet.
Una Xlet è una particolare applicazione Java concepita per essere scaricata ed eseguita su decoder interattivi nei quali un software specifico, l’Application Manager, è in grado di controllarne il ciclo di vita. Come vedremo le similitudini con le Applet, dove l’application manager è rappresentato dal browser, sono molteplici.
Come costruire una Xlet
Per iniziare a costruire una Xlet occorre innanzitutto capire cosa viene fornito da Sun nelle API Java TV[3]. Infatti è proprio in queste librerie che vengono definite le due interfacce fondamentali da utilizzare:
- javax.tv.xlet.Xlet, che definisce i seguenti metodi:
public void initXlet(XletContext ctx); public void startXlet(); public void pauseXlet(); public void destroyXlet(boolean unconditional);
- javax.tv.xlet.XletContext, che definisce i seguenti metodi:
public void notifyDestroyed(); public void notifyPaused(); public java.lang.Object getXletProperty(java.lang.String key); public void resumeRequest();
Entrambe le interfacce servono per interagire con l’application manager in merito al ciclo di vita e al contesto in cui la Xlet viene eseguita.
La classe principale di ogni Xlet deve sempre implementare javax.tv.xlet.Xlet per poter essere eseguita sui decoder interattivi MHP.
Il ciclo di vita di una Xlet
Come mostrato in Figura 1 il ciclo di vita di una Xlet è caratterizzato da 4 stati:
- Loaded: in questo stato la Xlet è stata creata ma non inizializzata; se durante questa fase viene rilevata un’eccezione allora si passa direttamente nello stato Destroyed. Da notare che la Xlet si può trovare in questo stato solo una volta durante tutto il suo ciclo di vita.
- Paused: la Xlet è inizializzata e può trovarsi in questo stato sia dopo che il metodo initXlet(XletContext) è ritornato con successo dallo stato Loaded, oppure dopo che il metodo pauseXlet() è ritornato con successo dallo stato Active. In entrambi i casi in questo stato la Xlet dovrebbe limitare al massimo l’utilizzo delle risorse condivise e soprattutto non impegnare la GUI televisiva.
- Active: in questo stato la Xlet è attiva e utilizza le risorse necessarie per fornire i suoi servizi; se dotata di GUI allora dovrebbe essere l’unica registrata per ricevere gli eventi del telecomando.
- Destroyed: in questo stato la Xlet deve rilasciare tutte le risorse in uso per predisporsi alla terminazione.
Una sequenza tipica di questo ciclo potrebbe essere:
- L’application manager crea una nuova istanza di una Xlet chiamando il suo costruttore(stato LOADED).
- La Xlet usa il context passatogli dall’application manager nel metodo initXlet(XletContext) e si inizializza(stato PAUSED).
- L’application manager chiama il metodo startXlet() e la Xlet inizia ad utilizzare le risorse necessarie per fornire i servizi per cui è stata costruita(stato ACTIVE).
- L’application manager chiama il metodo destroyXlet(true) e la Xlet rilascia le risorse, dopodiché viene terminata(stato DESTROYED).
Il primo esempio: HelloXlet.java
import javax.tv.xlet.Xlet;
import javax.tv.xlet.XletContext;
import javax.tv.xlet.XletStateChangeException;
public class HelloXlet implements Xlet {
// L’XletContext è un oggetto usato dalla Xlet per accedere alle properties
// del suo environment e per comunicare con l’application manager che glielo
// ha passato nella fase di inizializzazione.
private XletContext context;
private boolean alreadyActive = false;
// Il costruttore tipicamente viene lasciato vuoto visto che tutte le
// inizializzazioni dovrebbero stare nel metodo initXlet().
public HelloXlet() {}
// In questo metodo vengono fatte tutte le inizializzazioni; se in questa
// fase qualcosa fallisse verrebbe lanciata un’eccezione.
public void initXlet(XletContext context) throws XletStateChangeException {
// Si memorizza il context passato dall’Application Manager.
this.context = context;
System.out.println(this.getClass().getName() + " : Inizializzazione avvenuta!");
}
// Con questo metodo la Xlet è avviata e vengono richieste le risorse
// necessarie, come ad esempio lo schermo TV o gli eventi del telecomando.
public void startXlet() throws XletStateChangeException {
// Controlliamo se la Xlet era già stata messa in stato Active precedentemente.
if (alreadyActive) {
System.out.println(this.getClass().getName() + " : Hello Again TV World! ");
} else {
System.out.println(this.getClass().getName() + " : Hello TV World");
alreadyActive = true;
}
}
// Con questo metodo la Xlet viene messa in pausa e dovrebbe rilasciare
// tutte le risorse utilizzate.
public void pauseXlet() {
System.out.println(this.getClass().getName() + " : Xlet in pausa!");
// Notifichiamo al Context l’avvenuta pausa della Xlet.
context.notifyPaused();
}
// Con questo metodo la Xlet viene terminata. Tramite il parametro boolean
// la Xlet ha la facoltà di accettare tale richiesta; nel caso non accettasse
// di terminare dovrebbe lanciare un’eccezione.
public void destroyXlet(boolean unconditional) throws XletStateChangeException {
if (unconditional) {
System.out.println(this.getClass().getName() + " : la Xlet è stata terminata!");
} else {
System.out.println(this.getClass().getName() + " : la Xlet ha accettato di essere terminata!");
}
// Notifichiamo al Context l’avvenuta terminazione della Xlet.
context.notifyDestroyed();
}
}
Conclusioni
L’esempio proposto e quelli che seguiranno, come tutte le vostre future Xlet, possono essere eseguite su un ottimo software open source, XletView[4], che vi permette di emulare su PC un middleware MHP.
Nel prossimo articolo approfondiremo maggiormente le potenzialità delle Xlet, analizzando funzionalità più complesse come la gestione della grafica interattiva, gli eventi del telecomando e l’utilizzo del canale di ritorno.
Bibliografia
1. E. Brunelli, "Televisione Digitale Interattiva: Lo standard MHP", MokaByte, aprile 2004, http://www.mokabyte.it/2004/04/jtdi-1.htm. 2. Multimedia Home Platform - www.mhp.org. 3. Java TV - http://java.sun.com/products/javatv/. 4. XletView - http://sourceforge.net/projects/xletview/.
