Flex 与 Flash Player (转载)

http://www.jb51.net/article/18369.htm

1、Flex应用程序的生命周期
Flex应用就其根本上讲就是Flash应用,只不过其是基于Flex Framework(由ActionScript写就)开发的。Flex应用程序的根对象的是SystemManager(不是我们在flex应用上看到的Application根元素),继承自flash.dispaly.MovieClip-flash player display type,MovieClip是一种支持timeline基本元素帧frame的对象,在Flex Framework中SystemManager是特殊的,含有两帧(其他component都是一帧的),分别是preloader和真正的 Application,preloader帧可以迅速下载下来并用于显示应用下载进度,一旦Flex应用的SystemManager实例进入第二帧,将创建Flex主应用application实例并赋予本身的属性application(在进入第二帧之前是null),自此 application(flex主应用)的内部生命周期、事件开始运作:
preinitialize:application已经实例化但尚未创建任何child component
initialize:已经创建child component但对其进行布局(lay out)
creationComplete:application已经完成实例化并完成所有child component的布局
SystemManager 有一个topLevelSystemManager对象,指向一个SystemManager实例,是所有当前在flash player运行的任何东西的根(root),如果flex被作为主应用加载到flash player则上述属性将指向其本身(self-refrencing),但当flex应用是被另一flex应用载入的,其自身的 SystmenManager的topLevelSystemManager属性则不是自引用了,而是指向其父应用的SystemManager实例。所有UIComponent的子类都有一个systemManager属性指向应用的SystemManager实例,在被SystemManger实例监听的component的事件发生冒泡时,其将拥有事件处理链上最后的处理权。
2、Flash palyer和Framwork的区别
Flash player是Flex应用和flash应用的运行环境,两应用对其拥有完全平等的操作权(通过Flash player提供的API),两应用形成的.swf文件在flash player中是同样的表现,不同的不是应用的内容而是其各自的创建方式。Flex的Framework在开发和运行之间为应用提供了一层抽象,Flex 应用编译时会将必要的framwork library编译进.swf文件(同样影响应用文件的大小等),主要的flash player class当然不会被编译到.swf中,因为他们已经存在于flash player中了,最终形成与flash应用同样的flash player可以理解的指令。
关于flash player class和flex framework的区分很方便,前者的class以flash开头,如flash.net.URLLoader,而后者则以mx开头,如mx.controls.Button
3、动态载入另外的flex应用
<mx:SWFLoader source="src/*.swf"/>
Swfloader 的content属性指向被载入的flex应用的SystemManager实例(其application属性指向被载入felx应用的 Application实例),swfloader加载、初始化被载入flex应用时会dispatch出init事件,可与其中监听被载入flex应用的SystemManager实例的ApplicationComplete事件,事件发生时被载入content的Application对象方可以引用
与inithandler中event.target.content.addEventListener(FlexEvent.APPLICATION_COMPLETE,func);
与applicationCompleteHandler中event.target.application.method…
4、理解应用程序域(application domain)
一个应用程序domain(类似于.net的appdoamin)中有flex应用的相关类定义、资源等,被载入的新flex应用可以存在于一个全新的、隔离的domain中(占额外的内存资源)、可以存在于当前domain的子doamin中(共享父domain的资源、类定义,须注意类定义被取代的情况)、也可以直接存在与当前doamin中(同样须注意类定义冲突),如runtime shared library。
代码中实现这三种方式的应用(主要应用到flash.system.LoaderContext、flash.display.Loader或flash.net.URLLoader、flash.system.ApplicationDomain)
var context:LoaderContext = new LoaderContext( );
context.applicationDomain = new ApplicationDomain(ApplicationDomain.currentDomain);//载入作为子domain
context.applicationDomain = new ApplicationDomain();//载入作为全新domain
context.applicationDomain = ApplicationDomain.currentDomain;//载入当前domain
var request:URLRequest = new URLRequest("RuntimeLoadingExample.swf");
var loader:Loader = new Loader( );
loader.load(request, context);
5、关于preloader
Preloader 是一个轻量级的类,在systemManager的第一帧被实例化,preloader会dispatch出一系列的事件,由progress bar监听实现loading界面,一旦应用进入第二帧待application初始化后会借由system manager通知preloader初始化进度,preloader通知system manager其准备待删除
Preloader的事件dispatch:
progress
Indicates download progress
complete
Indicates that the download is complete
rslError
Indicates that a runtime shared library could not load
rslProgress
Indicates the download progress for a runtime shared library
rslComplete
Indicates that the download is complete for runtime shared libraries
initProgress
Indicates that the application is initializing
initComplete
Indicates that the application has initialized
如此,preloader可以定制化了。

posted on 2009-06-08 22:20  jerry data  阅读(226)  评论(0编辑  收藏  举报