com.sun.midp.main.Main.java檔案是midp的起點;裡面有main、manage、runLocalClass等函數;在runLocalClass中,建立了MIDletSuite,並建立MIDlet:
MIDletSuite midletSuite;</p><p> try {<br /> // assume a class name of a MIDlet in the classpath<br /> midletSuite = DevMIDletSuiteImpl.create(internalSecurityToken,<br /> state.descriptorName,<br /> state.midletClassName,<br /> DEV_STORAGE_NAME,<br /> state.securityDomain);</p><p> // if no class name was specified than repeat the selector<br /> do {<br /> if (!Scheduler.getScheduler().schedule(midletSuite)) {<br /> // shutdown<br /> break;<br /> }<br /> } while (state.midletClassName == null);<br /> } catch (Throwable e) {<br /> e.printStackTrace();<br /> }
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;<br />protected abstract void pauseApp();<br />protected abstract void destroyApp(boolean unconditional)<br />throws MIDletStateChangeException;
createMIDlet方法根據傳入的MIDlet名稱,建立了一個MIDlet:
static MIDlet createMIDlet(String classname) throws<br /> ClassNotFoundException, InstantiationException,<br /> IllegalAccessException {<br /> Class midletClass;<br /> Object midlet;</p><p> synchronized (createMIDletLock) {<br /> try {<br /> allowedToCreateMIDlet = true;</p><p> midletClass = Class.forName(classname);<br /> midlet = midletClass.newInstance();<br /> if (midlet instanceof MIDlet) {<br /> return (MIDlet)midlet;<br /> }</p><p> throw new InstantiationException("Class not a MIDlet");<br /> } finally {<br /> allowedToCreateMIDlet = false;<br /> }<br /> }<br /> }<br />
在MIDlet的構造中,建立了MIDletProxy對象;MIDletProxy類是MIDletState抽象類別的子類;在它的靜態構造中,建立了MIDletStateMapImpl的對象;
在MIDletState的構造中,做了Display初始化相關的大量工作:
首先調用Display類的靜態建構函式,通過DeviceCaps讀取裝置相關的資訊,然後建立了DisplayManager的執行個體,還建立了一個不斷迴圈等待喚醒的事件監聽器,這是MIDP程式事件驅動的根源;
static {</p><p> /* done this way because native access to static fields is hard */<br /> DeviceCaps c = new DeviceCaps();</p><p> WIDTH = c.width;<br /> HEIGHT = c.height;<br /> ADORNEDHEIGHT = c.adornedHeight;<br /> ERASE_COLOR = c.eraseColor;<br /> DISPLAY_DEPTH = c.displayDepth;<br /> DISPLAY_IS_COLOR = c.displayIsColor;<br /> POINTER_SUPPORTED = c.pointerSupported;<br /> MOTION_SUPPORTED = c.motionSupported;<br /> REPEAT_SUPPORTED = c.repeatSupported;<br /> IS_DOUBLE_BUFFERED = c.isDoubleBuffered;<br /> FG_COLOR = 0;<br /> BG_H_COLOR = FG_COLOR;<br /> FG_H_COLOR = ERASE_COLOR;</p><p> Text.FG_COLOR = FG_COLOR;<br /> Text.FG_H_COLOR = FG_H_COLOR;</p><p> ALPHA_LEVELS = c.numAlphaLevels;</p><p> KEYCODE_UP = c.keyCodeUp;<br /> KEYCODE_DOWN = c.keyCodeDown;<br /> KEYCODE_LEFT = c.keyCodeLeft;<br /> KEYCODE_RIGHT = c.keyCodeRight;<br /> KEYCODE_SELECT = c.keyCodeSelect;</p><p> c = null; // let the DeviceCaps instance be garbage collected</p><p> /* Let com.sun.midp classes call in to this class. */<br /> displayManagerImpl = new DisplayManagerImpl();<br /> DisplayManagerFactory.SetDisplayManagerImpl(displayManagerImpl);<br /> deviceAccess = new DisplayDeviceAccess();<br /> eventHandler = getEventHandler();</p><p> screenGraphics = Graphics.getGraphics(null);<br /> }<br />
MIDletState的的構造還通過建立的DisplayManager的執行個體建立Display的構造:並建立Display類中另一個私人類DisplayAccess的對象;DisplayManager是MIDP中所有顯示的控制器,DisplayAccess被DisplayManager驅動,這兩個類都來自於DisplayEvent介面,卻分工不同;
protected MIDletState(MIDlet m) {<br /> DisplayAccess accessor;</p><p>midlet = m;<br />state = PAUSED_RESUME;// So it will be made active soon<br />scheduler = Scheduler.getScheduler();<br />mutex = scheduler.getMutex();</p><p> synchronized (createMIDletLock) {<br /> if (!allowedToCreateMIDlet) {<br /> MIDletSuite suite = scheduler.getMIDletSuite();</p><p> if (suite != null) {<br /> suite.checkIfPermissionAllowed(Permissions.AMS);<br /> }<br /> }<br /> }</p><p>// Force the creation of the Display<br /> displayManager = DisplayManagerFactory.getDisplayManager();<br /> accessor = displayManager.createDisplay(classSecurityToken, midlet);<br /> display = accessor.getDisplay();</p><p> if (scheduler.getMIDletSuite().isTrusted()) {<br /> accessor.setTrustedIcon(classSecurityToken, true);<br /> }<br /> }<br />
最後,對這一部分遇到的類及其關係做一個總結:
MIDlet相關:
MIDletSuite介面;MIDletSuiteImpl類實現了MIDletSuite介面;
MIDletState類:實現了startApp、pauseApp等改變MIDlet狀態的函數,這是一個抽象類別;MIDletProxy是該抽象類別的實作類別;
MIDletStateMap介面:MIDletStateMapImpl:根據MIDlet可在map中尋找該MIDlet對應的狀態;
MIDlet類:抽象類別;實現了getAppPropery、platformRequest等方法;
Schedule類:調度類,決定使用midletsuite中的哪個midlet並改變其狀態;
Display相關:
Display類:MIDP UI相關的根本類;DisplayAccess和DisplayManagerImpl是Display的私人類;DisplayManagerImpl在Display的靜態構造中建立,並在DisplayManagerImpl的createDisplay中建立Display和DisplayAccess的對象;