浅析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