打印
[华禹工控]

MidletSuite、Midlet、Schedule、Display、MidletState代码解析

[复制链接]
1717|0
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
xingyangqing|  楼主 | 2010-3-2 11:44 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
com.sun.midp.main.Main.java文件是midp的起点;里面有main、manage、runLocalClass等函数;在runLocalClass中,创建了MIDletSuite,并创建MIDlet:
  • MIDletSuite midletSuite;
  •         try {
  •             // assume a class name of a MIDlet in the classpath
  •             midletSuite = DevMIDletSuiteImpl.create(internalSecurityToken,
  •                                                  state.descriptorName,
  •                                                  state.midletClassName,
  •                                                  DEV_STORAGE_NAME,
  •                                                  state.securityDomain);
  •             // if no class name was specified than repeat the selector
  •             do {
  •                 if (!Scheduler.getScheduler().schedule(midletSuite)) {
  •                     // shutdown
  •                     break;
  •                 }
  •             } while (state.midletClassName == null);
  •         } catch (Throwable e) {
  •             e.printStackTrace();
  •         }

复制代码
DevMIDletSuiteImpl是MIDletSuiteImpl的子类,而MIDletSuiteImpl实现了MIDletSuite接口;

Scheduler类实现了MIDletEventListener和SystemEventListener接口;其中MIDletEventListener接口定义了方法startMIDlet、pauseMIDlet、destroyMIDlet;SystemEventListener接口定义了方法shutdown;此外,Scheduler还实现了方法schedule和getScheduler方法;getScheduler静态方法创建了Scheduler实例;schedule方法从MIDletSuite中取出MIDlet的名称,并调用MIDletState类的静态方法createMIDlet创建一个MIDlet的对象;

MIDletState类用于管理MIDlet的状态;这是一个抽象类,主要的抽象方法有:
  • protected abstract void startApp() throws MIDletStateChangeException;
  • protected abstract void pauseApp();
  • protected abstract void destroyApp(boolean unconditional)
  •     throws MIDletStateChangeException;

复制代码
createMIDlet方法根据传入的MIDlet名称,创建了一个MIDlet:
  • static MIDlet createMIDlet(String classname) throws
  •            ClassNotFoundException, InstantiationException,
  •            IllegalAccessException {
  •         Class midletClass;
  •         Object midlet;
  •         synchronized (createMIDletLock) {
  •             try {
  •                 allowedToCreateMIDlet = true;
  •                 midletClass = Class.forName(classname);
  •                 midlet = midletClass.newInstance();
  •                 if (midlet instanceof MIDlet) {
  •                     return (MIDlet)midlet;
  •                 }
  •                 throw new InstantiationException("Class not a MIDlet");
  •             } finally {
  •                 allowedToCreateMIDlet = false;
  •             }
  •         }
  •     }

复制代码
在MIDlet的构造中,创建了MIDletProxy对象;MIDletProxy类是MIDletState抽象类的子类;在它的静态构造中,创建了MIDletStateMapImpl的对象;

在MIDletState的构造中,做了Display初始化相关的大量工作:

首先调用Display类的静态构造函数,通过DeviceCaps读取设备相关的信息,然后创建了DisplayManager的实例,还创建了一个不断循环等待唤醒的事件监听器,这是MIDP程序事件驱动的根源;
  • static {
  •        /* done this way because native access to static fields is hard */
  •        DeviceCaps c = new DeviceCaps();
  •        WIDTH               = c.width;
  •        HEIGHT              = c.height;
  •        ADORNEDHEIGHT       = c.adornedHeight;
  •        ERASE_COLOR         = c.eraseColor;
  •        DISPLAY_DEPTH       = c.displayDepth;
  •        DISPLAY_IS_COLOR    = c.displayIsColor;
  •        POINTER_SUPPORTED   = c.pointerSupported;
  •        MOTION_SUPPORTED    = c.motionSupported;
  •        REPEAT_SUPPORTED    = c.repeatSupported;
  •        IS_DOUBLE_BUFFERED  = c.isDoubleBuffered;
  •        FG_COLOR            = 0;
  •        BG_H_COLOR          = FG_COLOR;
  •        FG_H_COLOR          = ERASE_COLOR;
  •        Text.FG_COLOR       = FG_COLOR;
  •        Text.FG_H_COLOR     = FG_H_COLOR;
  •        ALPHA_LEVELS        = c.numAlphaLevels;
  •        KEYCODE_UP          = c.keyCodeUp;
  •        KEYCODE_DOWN        = c.keyCodeDown;
  •        KEYCODE_LEFT        = c.keyCodeLeft;
  •        KEYCODE_RIGHT       = c.keyCodeRight;
  •        KEYCODE_SELECT      = c.keyCodeSelect;
  •        c = null; // let the DeviceCaps instance be garbage collected
  •        /* Let com.sun.midp classes call in to this class. */
  •        displayManagerImpl = new DisplayManagerImpl();
  •        DisplayManagerFactory.SetDisplayManagerImpl(displayManagerImpl);
  •        deviceAccess = new DisplayDeviceAccess();
  •        eventHandler = getEventHandler();
  •        screenGraphics = Graphics.getGraphics(null);
  •    }

复制代码
MIDletState的的构造还通过创建的DisplayManager的实例创建Display的构造:并创建Display类中另一个私有类DisplayAccess的对象;DisplayManager是MIDP中所有显示的控制器,DisplayAccess被DisplayManager驱动,这两个类都来自于DisplayEvent接口,却分工不同;
  • protected MIDletState(MIDlet m) {
  •        DisplayAccess accessor;
  • midlet = m;
  • state = PAUSED_RESUME;  // So it will be made active soon
  • scheduler = Scheduler.getScheduler();
  • mutex = scheduler.getMutex();
  •        synchronized (createMIDletLock) {
  •            if (!allowedToCreateMIDlet) {
  •                MIDletSuite suite = scheduler.getMIDletSuite();
  •                if (suite != null) {
  •                    suite.checkIfPermissionAllowed(Permissions.AMS);
  •                }
  •            }
  •        }
  • // Force the creation of the Display
  •        displayManager = DisplayManagerFactory.getDisplayManager();
  •        accessor = displayManager.createDisplay(classSecurityToken, midlet);
  •        display = accessor.getDisplay();
  •        if (scheduler.getMIDletSuite().isTrusted()) {
  •            accessor.setTrustedIcon(classSecurityToken, true);
  •        }
  •    }

复制代码
最后,对这一部分遇到的类及其关系做一个总结:

MIDlet相关:

MIDletSuite接口;MIDletSuiteImpl类实现了MIDletSuite接口;

MIDletState类:实现了startApp、pauseApp等改变MIDlet状态的函数,这是一个抽象类;MIDletProxy是该抽象类的实现类;

MIDletStateMap接口:MIDletStateMapImpl:根据MIDlet可在map中查找该MIDlet对应的状态;

MIDlet类:抽象类;实现了getAppPropery、platformRequest等方法;

Schedule类:调度类,决定使用midletsuite中的哪个midlet并改变其状态;

Display相关:

Display类:MIDPUI相关的根本类;DisplayAccess和DisplayManagerImpl是Display的私有类;DisplayManagerImpl在Display的静态构造中创建,并在DisplayManagerImpl的createDisplay中创建Display和DisplayAccess的对象;

相关帖子

发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

14

主题

23

帖子

1

粉丝