淺析Flex啓動過程
每個 SWF 文件都有一個關聯的 ActionScript 類,稱爲"SWF 文件的主類"。當 Flash Player 打開 SWF 文件時,Flash Player 將調用主類的構造函數,並創建主類的實例,將其添加爲 Stage 對象的子級。(注:在主類的構造函數裏面 訪問 stage 不爲空,非主類在構造函數裏面 訪問 stage 時stage == null)
假設我們的Flex工程的主文件爲Main.mxml,當Flex3編譯時會生成一個 _Main_mx_managers_SystemManager extends mx.managers.SystemManager 的類(提示:mx.managers.SystemManager extends MovieClip) ,該類即爲主類。當使用 flash player播放main.swf文件時首先載入_Main_mx_managers_SystemManager類,執行該類的構造函數。
在構造函數中 首先會設置
stage.scaleMode = StageScaleMode.NO_SCALE; stage.align = StageAlign.TOP_LEFT; 並停在第一楨(默認情況下SystemManager 一共有兩楨,如果你使用了frame編譯器指令的話就會比兩楨要多)
stop(); if (root && root.loaderInfo) root.loaderInfo.addEventListener(Event.INIT, initHandler);
因爲是swf的主類文件,所以這裏的 root即爲自己
(註釋:對於加載的 SWF 文件中的顯示對象,root 屬性是此 SWF 文件所表示的顯示列表樹結構部分中的頂級顯示對象。 對於代表已加載圖像文件的位圖對象,root 屬性就是位圖對象本身。 對於第一個加載的 SWF 文件的主類的實例,root 屬性就是顯示對象本身。 Stage 對象的 root 屬性是 Stage 對象本身。 對於任何未添加到顯示列表的顯示對象,root 屬性設置爲 null,除非它已添加到符合以下條件的顯示對象容器:不在顯示列表中,但屬於已加載 SWF 文件中頂級顯示對象的子級。)
構造函數結束,等待initHandler的執行。
在 initHandler中作了如下事情:
1,定義 當播放頭到達第二楨的時候 運行函數docFrameHandler
addFrameScript(docFrame, docFrameHandler);
2,設置preloader
preloader = new Preloader(); preloader.addEventListener(FlexEvent.INIT_PROGRESS, preloader_initProgressHandler); preloader.addEventListener(FlexEvent.PRELOADER_DONE, preloader_preloaderDoneHandler); 並將 preloader 增加爲該類的一個 child,接着獲得 rsls(運行時共享庫)和 resource
modules 信息,並執行
preloader.initialize( usePreloader, preloaderDisplayClass, preloaderBackgroundColor, preloaderBackgroundAlpha, preloaderBackgroundImage, preloaderBackgroundSize, isStageRoot ? Stage.stageWidth : loaderInfo.width, isStageRoot ? Stage.stageHeight : loaderInfo.height, null, null, rslList, resourceModuleURLs); } usePreloader和preloaderDisplayClass是你在你的Main.mxml文件<mx:Application> 標籤裏設置的preloader和usePreloader的值。
Preloader 開始運行,你可以看到進度條,當所有的文件從網絡上下載完成後preloader
dispatchEvent(new Event(Event.COMPLETE)); dispatchEvent(new FlexEvent(FlexEvent.INIT_PROGRESS)); preloader發佈FlexEvent.INIT_PROGRESS事件後,在主類中定義的 preloader_initProgressHandler函數開始執行
private function preloader_initProgressHandler(event:Event):void { // Advance the next frame preloader.removeEventListener(FlexEvent.INIT_PROGRESS, preloader_initProgressHandler); deferredNextFrame(); } 執行完後,播放頭前進到第二楨,如前所述,docFrameHandler 函數開始執行。
首先會執行很多Singleton.registerClass方法,然後執行有[Mixin]元標籤的類的
public static function init(fbs:IFlexModuleFactory):void 方法,接下來將編譯的ResourceBundles增加到resourceManager,這樣我們在程序中可以訪問。下面開始執行 Main.mxml的構造函數
document = app = topLevelWindow = IUIComponent(create());
然後設置 Main.mxml的寬高爲舞臺的寬高,並執行preloader.registerApplication(app);函數,接着
addingChild(DisplayObject(app)); // calls app.createChildren() childAdded(DisplayObject(app));
下面就是 大家都挺熟悉的flex初始化過程
1,觸發preinitialize事件
2,執行初始化
3,觸發initialize事件
4,執行創建過程
5,觸發creationComplete事件
觸發creationComplete事件後preloader發佈FlexEvent.INIT_COMPLETE事件,進度條(DownloadProgressBar.as)接收後會發佈event.COMPLETE事件,preloader偵聽後會發佈FlexEvent.PRELOADER_DONE事件並執行主類中定義preloader_preloaderDoneHandler函數。在preloader_preloaderDoneHandler函數裏面首先會移除進度條removeChild(preloader);這樣我們才能看到我們的flash內容,然後
// Add the mouseCatcher as child 0. mouseCatcher = new FlexSprite(); mouseCatcher.name = "mouseCatcher"; // Must use addChildAt because a creationComplete handler can create a // dialog and insert it at 0. //noTopMostIndex++; super.addChildAt(mouseCatcher,
0);
將Main.mxml 類的實例增加到顯示列表
super.addChildAt(DisplayObject(app), 1);
發佈FlexEvent.APPLICATION_COMPLETE事情
[CODE_LITE]app.dispatchEvent(new FlexEvent(FlexEvent.APPLICATION_COMPLETE));
dispatchEvent(new FlexEvent(FlexEvent.APPLICATION_COMPLETE));[/CODE]
至此啓動過程完美結束:)
文章來源: 我要學flash網(www.51xflash.com) 原文地址:http://www.51xflash.com/article/flex/201106/24-14371.html