Flex Application & Sub-Application 深度解析

做Flex开发,特别是web开发,相信大家对长时间的loading一定非常讨厌,特别是当网络欠佳的时候,看一个flash全站简直是受刑,正应了那句笑话:大学澡堂洗澡--大部分时间在等。

还好Flex提供了Sub-Application技术,让我们可以创建一个个小的Swf文件,然后用一个主Swf来调用,根据程序的需要动态的加载Sub-Application,即Application & Sub-Application。

以下文字是从鸟语翻译而来,我不会逐字翻译,而是意译,来源pdf文件为:flash_as3_programming.pdf (http://livedocs.adobe.com/flex/gumbo/html/flex_4_help.pdf 其中的第二章第四节),原标题:Chapter1: developing and loading sub-applications

 

目录:

1加载子程序概述
    1.1程序域
        1.1.1系统域
        1.1.2同级程序域
        1.1.3子级程序与
        1.1.4当前域
    1.2安全域
    1.3几种可加载子程序的程序类型
        1.3.1沙箱程序
        1.3.2大型多版本程序
        1.3.3大型单版本程序
    1.4Flex管理类
    1.5系统管理类
    1.6将程序编译为多个Module
    1.7将SwfLoader编译为Loader控件
    1.8域通信
    1.9加载单域或交叉域程序
2创建和加载子程序
    2.1使用SwfLoader加载子程序
        2.1.1如果自定义SwfLoader内容
    2.2从SwfLoader中移除子程序
    2.3从子程序访问主程序
    2.4从主程序访问子程序
    2.5从已加载的子程序创建类实例
    2.6用已加载的子程序监听鼠标事件
    2.7在子程序中嵌入字体
    2.8子程序中的模型和单例
    2.9子程序优化
3开发沙箱程序
    3.1弹出类控件
    3.2消息提示控件
    3.3样式和样式组件
    3.4字体
    3.5焦点
    3.6光标样式
    3.7本地化
    3.8鼠标悬停提示
    3.9布局
    3.10深链接
    3.11拖放
    3.12监听鼠标事件
    3.13访问Flash中的变量 

 哦,貌似3已经就不属于本文的范围了,算了,先不管它了。

 

第一章开发和加载子程序

1加载子程序概述

 Flex允许你在一个主程序中加载多个子程序,这样做的好处有:
减小主程序的体积
将关系密切的组件封装在一个子程序中
创建可重用的子程序
一些精妙的第三方程序可以加入你的程序。
主程序和子程序间的互通程度取决于加载方式,一些影响通信的因素:
可信任程序  信任有哪些级别呢?已信任的程序拥有相当程度的互通性,而非信任程序,仍然可以和主程序通信,只是限制比较
多,而且需要一些特殊的方法。通常情况下,如果你不能完全掌控一个子程序(非你或你的小组开发,特别是第三方应用),那
么就将其作为一个非信任子程序加载。
版本 各个程序编译时的SDK版本是否相同?默认加载子程序需要各个程序的SDK版本一致,当然,flex允许我们加载不同SDK版本的子程序,我们称其为“multi-versioned applications”,“multi-versionalble applications”在与主程序通信方面有一些限制,但是,它更灵活。
三种可加载为子程序的Flex程序:
沙箱程序 沙箱程序拥有自己的安全域,并且可以是多版本,使用沙箱模式是加载第三方子程序的惯例。而且,如果你的子程序使用了RPC或DataServer等后台数据连接技术,那更应该使用沙箱模式。
多版本程序 可以使用与主程序不同版本的SDK,与主程序的互通性比起单版本限制更多。
单版本程序 与主程序最大限度的互通,全体是你对此子程序有相当的控制,并最好有源码。
Sub-Applications 与 Module 有很多相同的地方,详细信息参见章节:Comparing loaded applications to modules。

1.1 程序域

程序域即类容器,存放类的定义。在一个系统中,最顶端的、唯一个那个域称为 系统域,程序域是系统域的子域。
当你加载一个子程序到其他主程序中,可以使用这三种程序域:sibling同级域、child子级域和current当前域。使用sibling模式时,子程序和当前程序的父级都是系统域,而且,和其他子程序都是对等关系;使用child模式时,则子程序的父级是主程序域;
使用current模式时,子程序域等于主程序域,有点像继承,呵呵~
SwfLoader和Loader 加载子程序时默认为child模式,此时如果子程序和主程序的SDK版本不一致,则导致runtime错误,因为编译器在编译时拒绝相同类的不同定义。
你可以指定主程序加载一个多版本的子程序,前提是使用sibling模式,这将意味着,子程序定义自己的Class,但是这些Class没有父级定义,即他们的parent=null或undefined。当然,为了让两个不同SDK版本的程序相互协作,这点代价是值得的。
可以设置参数LoaderContent来指定程序域,如SwfLoader 控件的loaderContext属性。

1.1.1系统域

Flash Player自带的Class定义都属于系统域,是所有程序域的父级域。主程序域是系统域的一个子级域,以sibling模式加载的子程序也是系统域的子级域。系统域中的Class定义不允许在主程序或子程序中重新定义,以保证系统域的共享性,这些定义如:Display Object、Event和Sprite。这些定义位于plauerglobal.swc文件中。

1.1.2同级域Sibling

子程序的程序域决定了其Class的定义来源,如果使用Sibling模式,那么子程序自定义其Class,这也正是多版本程序采用的方式。
采用Sibling模式的子程序可以和主程序通信,子程序可以访问主程序的方法和属性,前提是满足如下条件:
    仅使用Flash Player规定的强类型变量
    子程序不能位于不同的安全域
采用Sibling模式的子程序和主程序通信的能力与采用child模式时是有差别的,例如在一个子程序中触发一个弹出(pop-up)控件,它将传递一个事件到主程序中,但是在事件传递时,将稍微限制他们的通信。详细信息参考39页的"Developing multi-versioned applications"。
在不同安全域下的程序将自动被设置为sibling模式,结果是,如果你加载一个非信任的子程序,此子程序将自己定义其Class,没有parent。详细信息参考39页的"Developing multi-versioned applications"。

1.1.3子级域Child

以Child模式加载的子程序,其类定义继承而当前主程序。这种默认方式在加载时可能因为SDK版本的不一致导致运行时错误,

因为类的定义被同时加载到不同的程序域,从而导致类的定义混乱,子程序之间的加载顺序此时失效。
以Child模式加载的子程序可以与主程序通信,他们具有最高级别的互操作能力,这种情况正是许多大程序不是多版本,而用

Child模式的原因,SWFLoader默认也是这种方式。

1.1.4当前程序域Current

如果以Current模式加载子程序(与sbiling和child模式不同),子程序中的类定义通常被忽略,这是因为类的定义已经被使用。

子程序间的加载顺序被忽略,如果有新的类,主程序可以使用新的类定义。
RSLs和一些特殊的编译资源使用Current模式,子程序的加载一般不使用这种模式。

1.2安全域

安全域定义程序之间的信任级别,程序之间的信任级别越高,实现互操作的程度就越高。一般情况下,如果一个子程序的信任域

与主程序相同,那么他们之间具有最高级别的可操作性。
如果子程序被加载到不同的安全域(如一些远程或多版本的程序),那么子程序只允许在有限的情况下与主程序通信。子程序之

间的安全域同样限制他们之间的通信,如常见的沙箱程序。
子程序的安全域在导入时由编程人员指定,通过设置属性trustContent=true来设置某个子程序与主程序拥有相同的安全域。 这种情况仅适用于从其他web站点或其他子级域导入的程序。如果同一站点,默认为安全域,即使设置属性loadForCompatibility也不影响属性trustContent。
当使用AIR时,无法设置trustContent为true。
如果未设置trustContent=true,那么远程服务加载子程序时会默认设置一个单独的安全域。
你同样可以使用LoaderContext来特定安全域,可以通过设置loaderContext来使用SWFLoader控件,此时子程序和主程序有相同的安全域。
沙箱程序在互通性方面有很多限制,包括如下:
Stage(舞台) 访问子程序的stage会限制于一些stage和方法。
Mouse(鼠标) 无法接收其他安全域内的鼠标事件。
Pixels(像素) 无法访问其他安全域内的像素画布。
Properties(属性) 主程序可以获取其他安全域内对象的实例,但是无法操作。

1.3几种可加载子程序的程序类型

大型程序或非多版本程序
聚合程序
入口程序
仪表盘程序

1.3.1沙箱程序

沙箱程序是加载子程序的常用程序,一般来说,沙箱程序通过第三方组件编译和加载子程序。主程序不信任子程序,甚至,不知道子程序是用哪一个版本的flexSDK开发并编译的,所以,沙箱程序的互操作能力最低,一个典型的沙箱程序是聚合程序。
沙箱程序只需写很少的代码,通过RPC和DataService来操作。被信任的多版本程序经常要求引导程序,而沙箱程序不需要。所以,如果有多版本子程序,那么强烈推荐用沙箱模式。
下图展示了沙箱程序的边界,子程序被封闭在不同的域内,这意味着子程序之间互补信任,很那通信。

 

----待续

posted on 2010-11-04 16:08  咖啡色  阅读(692)  评论(0编辑  收藏  举报