Flex应用程序生命周期

 

理解Flex应用程序的生命周期
Flex应用的根是SystemManger,它是flash.display.MovieClip的子 类,一个Flash Player显示对象类型。SystemManager有两个帧,第一帧是用来显示应用载入的进度指示,这个帧是轻量的,所以它几乎能立即下载和运行。第 二帧便是应用本身。
当一个Flex应用的SystemManager实例进入到第二帧,它创建一个主应用的实例。SystemManager实例 有一个application属性,在它第二帧创建应用对象之前,它是null的。在那个点,应用实例被初始化并运行它自己的启动处理。意指所有的应用对 象内部的生命周期事件发生。内部的生命周期事件为:
preinitialize应用被初始化,但仍没创建任何子组件。
initialize应用已创建子组件,但极布局这些组件。
creationComplete应用已被初始实例化完成,并已布局所有的组件。
一旦应用完成它的内部启动处理,它通过分发applicationComplete事件通知SystemManager。从这个点之后,应用准备运行了。
SystemManager也管理所以被在前台显示的内容,即所有的pop ups,光标,工具提示。
SystmeManager 有一个toplevelSystemManager的属性,引用到当时在FlashPlayer里运行的根级的SystemManager实例。当一个应 用是作为FlashPlayer的主应用被载入的,这个属性总是自引用的,然而,当一个应用是被另一个应用载入的,这个被载入应用的 SystemManager对象的topLevelSystemManager则是引用到父应用。
虽然你不常要引用SystemManager, 但需要时可以做。所有的UIComponents(包括Application)的子类都有一个systemManager属性引用到 application的SystemManager。开发者常喜欢使用SystemManager来监听应用中任何显示对象分发的事件。当事件冒泡时, 有机会操控(handle)事件的最后的对象便是SystemManager.
FlashPlayer和框架的不同
FlasyPlayer 是Flash和Flex应用的运行环境。它能运行.swf文件。该文件包含这些字节代码:能与FlashPlayer通信,命令它执行载入图像,画图,发 起http请求等等操作。Flash和Flex应用只能做那些FlashPlayer允许他们做的,FlashPlayer提供可执行的API.
应用只包含命令,而FlashPlayer则负责运行这些命令,所以Flash和Flex应用的不同不是内容,而是怎样创建内容。
使 用框架的代价是.swf文件尺寸的增长,这与用纯AS写的项目形成反差。因为当你不用Flex框架,你是直接引用FlashPlayer的主类,这些类已 经在FlashPlayer中了,他们不需被编译进.swf文件。在用Flex框架时,简单的增加一个组件也会增加很多的文件尺寸,因为它需要编译的一个 类或一个类库并不是FlashPlayer的一部分。

若类的包是以flash.开头,它是FlashPlayer的一部分;
若类的包是以mx.开关,它是Flex框架的一部分;
MXML标签几乎总是(少数的例外)对应Flex框架类。

Bootstarapping Flex Applications
一个Flex应用的根并不是一个Application对象,实际上一个Application标签创建的是一个mx.managers.SystemManager对象。
flash.display.MovieClip是一个显示对象,允许你对时间轴编程。但在Flex应用中并不怎用时间轴,因为没有编程方法增加一个帧到到个时间轴。但时间轴和帧仍是SystmeManager的基本部分之一。
因 为没有方法编程的增加帧,几乎Flex应用中的所有显示对象只由一个帧组成,但SystemManager是个例外,它有两个帧,一个用于预装载,主应用 对象存在第二帧中。一般情况下,你不需知道这些,但在至少两个情况下你需了解它:在一个Flex应用中载入另一个Flex应用;定制预装载器。
Loading One Flex Application into Another Flex Application
当 一个SWFLoader载入一个Flex 应用,这个SWFLoader对象的contern属性提供了对被载入应用的根的引用,也即是被载入应用的SystemManager对象。这个 SystemManagr类定义一个application属性可引用Application对象。但这个属性在Flex 应用被载入时还是null,在第二帧之前,它是不会被创建的。那要怎样引用它呢?有个优雅的方法可以解决这个问题:
当一个SWFLoader载入 和初始化了内容,它分发init事件,在init的事件处理里,你能够引用被载入内容的SystemManager了,此时你就增加一个事件侦听器,监听 这个SystemManager的applicationComplete事件。而在这个applicationComplete的事件触发之后,在它的 处理里,你就可以引用被进入内容的Application对象了。
例子:
要被载入的应用:B.MXML
<?xml version="1.0" encoding="utf-8"?>
     <mx:Application xmlns:mx="http://www.adobe.com/2006/mxml " layout="absolute">
         <mx:Script>
             <![CDATA[
                 public function setBackground(color:Number):void {
                     canvas.setStyle("backgroundColor", color);
                 }
             ]]>
         </mx:Script>
         <mx:Canvas id="canvas" backgroundColor="#FFFFFF" width="100" height="100" />
     </mx:Application>
父应用:
<?xml version="1.0" encoding="utf-8"?>
     <mx:Application xmlns:mx="http://www.adobe.com/2006/mxml " layout="absolute">
         <mx:Script>
             <![CDATA[
                 import mx.managers.SystemManager;
                 import mx.events.FlexEvent;
                 private function initHandler(event:Event):void {
                        event.target.content.addEventListener(FlexEvent.APPLICATION_COMPLETE,
     applicationCompleteHandler);
                 }
                 private function applicationCompleteHandler(event:Event):void {
                     event.target.application.setBackground(0xFFFF00);
                 }
             ]]>
         </mx:Script>
         <mx:SWFLoader source="B.swf" init="initHandler(event)" />
     </mx:Application>

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值