Xletの制御とXlet状態遷移イベントの取得

他のXletを制御し、その状態遷移イベントを取得するサンプルコード。この機能を使用することで、所謂アプリケーションランチャーを作成することが可能となる。

 

本サンプルコードでは、制御Xlet(Monitor.java)が被制御Xlet(Main.java)制御用のProxy(AppProxy)を取得し、Proxyを通じて被制御Xletを制御している。
制御用メソッドは非同期呼び出しであるため、AppStateChangeEventListenerを実装し、被制御Xletの状態遷移を見届けた上で次の制御メソッドを呼び出している点に注意されたい。

 

 

Monitor.java(制御側)

import java.awt.Graphics;
 
import javax.tv.xlet.Xlet;
import javax.tv.xlet.XletContext;
 
import org.dvb.application.AppID;
import org.dvb.application.AppProxy;
import org.dvb.application.AppStateChangeEvent;
import org.dvb.application.AppStateChangeEventListener;
import org.dvb.application.AppsDatabase;
 
public class Monitor implements Xlet, AppStateChangeEventListener {
    int x=100, y=100;
    Graphics g = null;
    AppProxy ap = null;
    public void initXlet(XletContext context){
        try {
            // アプリケーションデータベースのインスタンスを取得
            AppsDatabase ad = AppsDatabase.getAppsDatabase();
            // 被制御Xletのproxyを取得
            ap = ad.getAppProxy(new AppID(0x7fff0001, 0x4001));
            // 非制御Xletの状態遷移イベントを取得するためのリスナーをセット
            ap.addAppStateChangeEventListener(this);
            // 被制御Xletを起動
            ap.start();
        } catch (Throwable thr){
        }
    }
    public void startXlet(){    }
    public void pauseXlet(){    }
    public void destroyXlet(boolean unconditional){}
    // AppStateChangeEventListnerを実装
    public void stateChange(AppStateChangeEvent arg0) {
        try{
            Thread.sleep(1000);
        } catch (Throwable thr){
        }
        switch ( arg0.getToState() ){
        case AppProxy.STARTED:
            if( arg0.getFromState() == AppProxy.PAUSED ) {
                ap.stop(true); // PAUSED->STARTEDの遷移の後はstop()
            } else {
                ap.pause(); // DESTROYED->STARTEDの遷移の後はpause()
            }
            break;
        case AppProxy.PAUSED:
            ap.resume();
            break;
        case AppProxy.DESTROYED:
            ap.start();
            break;
        default:
        }
        y+=50;
    }
 
}

Main.java(非制御側)

import java.awt.Color;
import java.awt.Font;
import java.awt.Graphics;
 
import javax.tv.xlet.Xlet;
import javax.tv.xlet.XletContext;
 
import org.havi.ui.HScene;
import org.havi.ui.HSceneFactory;
import org.havi.ui.HScreen;
 
public class Main implements Xlet{
    int x=100, y=100;
    Graphics g = null;
    public void initXlet(XletContext context){
        try {
            Font font = new Font(null, java.awt.Font.BOLD, 48);
            HScene hs= HSceneFactory.getInstance().getFullScreenScene(
                    HScreen.getDefaultHScreen().getDefaultHGraphicsDevice());
 
            hs.setFont(font);
            hs.setVisible(true);
            g = hs.getGraphics();
            g.setColor(Color.white);
            g.drawString("Initialized", x, y); y+=50;
        } catch (Throwable thr){
        }
    }
    public void startXlet(){
        g.drawString("Started", x, y);y+=50;
    }
    public void pauseXlet(){
        g.drawString("Paused", x, y);y+=50;
    }
    public void destroyXlet(boolean unconditional){
        g.drawString("Destroyed", x, y);y+=50;
    }

 

}

関連する項目

コメントを残す

メールアドレスが公開されることはありません。

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください