Xletの自己終了

Xletを自己終了するサンプルコード。

 

本サンプルコードでは、被制御Xlet(Main)がnotifyDestroyed()を呼び出し自己終了し、制御Xlet(Monitor)はそれを検知し被制御Xletを再起動するため、被制御Xletの起動と終了が繰り返されることになる。
なお、BD-J Object fileの設定は同一Title内で別Xletを起動する場合の設定を使用。

 

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{
    XletContext xc = null;
    public void initXlet(XletContext context){
        try {
            xc = context;
        } catch (Throwable thr){
        }
    }
    public void startXlet(){
        try{
            Thread.sleep(1000);
        } catch(Throwable t){
        }
        xc.notifyDestroyed();
    }
    public void pauseXlet(){
    }
    public void destroyXlet(boolean unconditional){
    }
}

 

Monitor.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.dvb.application.AppID;
import org.dvb.application.AppProxy;
import org.dvb.application.AppStateChangeEvent;
import org.dvb.application.AppStateChangeEventListener;
import org.dvb.application.AppsDatabase;
import org.havi.ui.HScene;
import org.havi.ui.HSceneFactory;
import org.havi.ui.HScreen;
 
public class Monitor implements Xlet, AppStateChangeEventListener {
    int x=100, y=100;
    Graphics g = null;
    AppProxy ap = 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);
            AppsDatabase ad = AppsDatabase.getAppsDatabase();
            ap = ad.getAppProxy(new AppID(0x7fff0001, 0x4001));
            ap.addAppStateChangeEventListener(this);
            ap.start();
        } catch (Throwable thr){
        }
    }
    public void startXlet(){    }
    public void pauseXlet(){    }
    public void destroyXlet(boolean unconditional){}
    // AppStateChangeEventListnerを実装
    public void stateChange(AppStateChangeEvent arg0) {
        switch ( arg0.getToState() ){
        case AppProxy.STARTED:
            g.drawString("Started", x, y); y+=50;
            break;
        case AppProxy.DESTROYED:
            g.drawString("Destroyed", x, y); y+=50;
            ap.start();
            break;
        default:
        }
        y+=50;
    }
}

関連する項目

返信を残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です