Home » Blog do Daniel

Xlets

8 dezembro 2010 505 views 2 Comentários

Os programas desenvolvidos utilizando a API JavaTV são chamados de Xlets. Assim como as applets e midlets, temos hoje as Xlets.

As applets e as Xlets possuem algumas características em comum. Como nas classes applets, a Xlet possui métodos que permitem o gerenciador de aplicação inicializar, executar e parar. Mas existem diferenças também. A maior diferença é que a Xlet possue um estado a mais: a Xlet pode ser pausada e resumida posteriormente. a Razão para este estado a mais é respondida pelo ambiente em que uma Xlet executa: a TV Digital. Neste tipo de ambiente, muitas aplicações podem estar executando ao mesmo tempo, mas por restrições de hardware, apenas uma aplicação pode estar visível a um dado momento. Sendo assim, aplicações não visíveis devem ser pausadas para liberar recursos para as aplicações que estão visíveis.

Ciclo de Vida da Xlet

As Xlets possuem 4 estados principais: Carregado (Loaded), Executado (Started), Pausado (Paused) e Destruído (Destroyed). A figura abaixo ilustra o ciclo de vida de uma Xlet:

Ciclo de Vida de uma Xlet

Assim como as applets, a interface Xlet possui um gerenciador de aplicação, o qual pode executar e parar uma aplicação, assim como ter o controle sobre o seu ciclo de vida. A interface Xlet é encontrada no pacote javax.tv.xlet.

Primeiramente o gerenciador de aplicação carrega o arquivo da classe principal da Xlet (sinalizado pela emissora) e cria uma instância da Xlet chamando o seu construtor padrão. Isto pode acontecer em qualquer ponto depois que a aplicação é sinalizada. Uma vez acontecido, a Xlet entra no estado Carregado (Loaded). No código abaixo vemos uma classe com o seu construtor padrão:

public Class ExemploXlet implements Xlet{ // Classe java que implementa a interface Xlet

public ExemploXlet(){ // Construtor da classe

}

}

Quando o usuário escolhe executar (start) a Xlet (ou outra aplicação sinaliza indicando que a Xlet deve executar automaticamente), o gerenciador de aplicação no receptor chama o método initXlet(), passando um novo objeto do tipo XletContext para a Xlet. Quando a inicialização estiver completa, a Xlet entra no estado pausado (Paused) e está pronta para executar (start) a qualquer momento. Abaixo segue o código do método initXlet()pauseXlet():

public void initXlet(XletContext contexto) throws XletStateChangeException;
public void pauseXlet();

Uma vez retornado o método initXlet(), o gerenciador de aplicação chama o método startXlet(). Assim, a Xlet passará do estado pausado (Paused) para o estado executado (Started). A Xlet então estará apta a interagir com o usuário. Abaixo segue o código do método startXlet():

public void startXlet()  throws XletStateChangeException;

Durante a execução da Xlet, o gerenciador de aplicação pode chamar o método pauseXlet(). Isto fará com que a aplicação mude do estado executado (Started) para o estado pausado (Paused). Posteriormente a aplicação voltará ao estado executado chamando o método startXlet() novamente. Isto pode acontecer dezenas ou centenas de vezes durante o ciclo de vida da Xlet.

No fim do ciclo de vida da Xlet, o gerenciador de aplicação charmará o método destroyXlet(), o que moverá a Xlet ao estado destruído (Destroyed) e liberará todos os seus recursos. Depois disto, a instância da Xlet não poderá ser executada novamente. Abaixo segue o código do método destroyXlet():

public void destroyXlet(boolean unconditional) throws XletStateChangeException;

Esqueleto da Xlet

Tendo em vista as afirmações acima podemos exemplificar o esqueleto de uma Xlet:

import javax.tv.Xlet; // pacote que contém a interface Xlet

public class ExemploXlet implementes Xlet{ // interface Xlet sendo implementada na classe

public ExemploXlet(){ // construtor da Xlet

}

// métodos que compões o ciclo de vida da Xlet

public void initXlet(XletContext contexto) throws XletStateChangeException{

}

public void startXlet()  throws XletStateChangeException{

}

public void pauseXlet{

}

public void destroyXlet(boolean unconditional) throws XletStateChangeException{

}

Xlet Contexts

Como mencionado anteriormente, cada Xlet possui um context, uma instância da classe javax.tv.xlet.XletContext. É similar ao AppletContext. Em ambos os casos, o contexto é usado para prover uma maneira para a aplicação obter maiores informações sobre o ambiente em que executa e para comunicar qualquer mudança de seu estado ao gerenciador da aplicação.

A interface XletContext possui alguns métodos que devem ser apresentados. Os métodos notifyDestroyed() e notifyPaused(), permitem uma Xlet notificar ao receptor que está prestes a terminar ou a ser pausada. A Xlet pode usar estes métodos para ter certeza que o receptor saberá o estado de cada aplicação, podendo assim, tomar a ação apropriada. Estes métodos devem ser chamados imediatamente antes da Xlet entrar nos estados pausado ou destruido.

Uma aplicação pode requisitar ser movida do estado pausado de volta para o estado executado, usando o método resumeRequest().

Os diagramas abaixo mostram exatamente o que acontece quando uma Xlet requisita uma mudança de estado via XletContext. Neste caso, a Xlet será pausada e entao requisitará ser resumida.

A Xlet chama o método notifyPaused() no contexto da Xlet

O context da Xlet notifica ao gerenciador de aplicação que a Xlet foi pausada

O gerenciador de aplicação faz um update de seu estado interno

A Xlet chama o método requestResume() quando quer ser resumida

O objeto context passa a requisição para o gerenciador de aplicações

O gerenciador de aplicação notifica a Xlet que ela pode ser resumida

A Xlet é executada

Finalizo aqui este post sobre Xlets, espero que tenha ficado claro o funcinamento e o ciclo de vida de uma Xlet. No próximo post  voltarei a falar sobre os estados da Xlet e desenvolverei uma xlet básica utilizando a IDE Eclipse e o Emulador XletView.

Obrigado !!

Referências: http://www.interactivetvweb.org/

@DanielCruz733

Contei minha história pra um carroceiro, até a mula chorou.
(Autor Desconhecido)

1 Star2 Stars3 Stars4 Stars5 Stars (No Ratings Yet)
Loading ... Loading ...
  • Fernando Pereira

    Muito bom o artigo!!

    [Reply]

  • Cacau

    Ótimo post, parabéns!
    Mas eu não entendi uma coisa, se a aplicação está em pausa, como ela requisita essa mudança de estado? É preciso definir um tempo para que ela faça isso ou pode-se usar uma thread nela mesmo estando pausada?

    Abraço!

    [Reply]