您的位置:首页 > 其它

Flex应用程序生命周期

2009-11-25 11:20 211 查看
理解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>
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: