1.概述 flash.system.ApplicationDomain->Object,该类为final 类。
ApplicationDomain类常见属性
(1)currentDomain : ApplicationDomain [静态] [只读 (read-only)] 获取正在其中执行代码的当前应用程序域。
(2)parentDomain : ApplicationDomain [只读 (read-only)] 获取该应用程序域的父域。
当程序中牵涉到加载外部.swf程序时,了解程序作用域的概念是非常重要的。
SWF 文件中的所有代码被定义为存在于ApplicationDomain中。 主应用程序就在当前的应用程序域中运行。 系统域中包含所有应用程序域(包括当前域),这意味着它包含所有 Flash Player 类。
除系统域以外,每个应用程序域都有一个关联的父域。 主应用程序的应用程序域的父域是系统域。 已加载的类仅在其父级中没有相关定义时才进行定义。 不能用较新的定义覆盖已加载的类定义。
2.程序作用域的三种实现 所有的Flex/Flash程序都是由一系列类组合而成。这一系列类都维持在一个程序作用域中。当仅有一个程序在运行时,程序作用域的概念只是一个形式,因为不可能发生作用域冲突的事情。当加载额外的.swf程序后,情况就不一样了,此时,可能会发生3种情况:
(1)被加载的.swf在现有作用域的子作用域中运行 这种情况下,被加载.swf可以使用父作用域中的所有类,类似于“继承”,子域可以直接获得父域所有的类定义,反之父域得不到子域的。和继承关系不同的是,如果子域中有和父域同名的类,子域定义会被忽略而使用父域的定义。
这样子有3个好处:
减少内存的占用。
单态管理者(Singleton manager classes)可以访问父级程序,也可以访问子级程序。
从技术角度讲,在编译子级程序时,可以不用把重复的类编译进去,从而减少文件大小
但有时不能忽视子作用域的类。比如碰到类名虽然冲突,但功能却不相同时。
代码如下
- //------------------------------------------------------------
- // 被加载的.swf在现有作用域的子作用域中运行
- //------------------------------------------------------------
- var context:LoaderContext = new LoaderContext();
- context.applicationDomain = new ApplicationDomain(ApplicationDomain.currentDomain);
- var request:URLRequest = new URLRequest("RuntimeLoadingExample.swf");
- var loader:Loader = new Loader();
- loader.load(request, context);
- // 等同于
- var request:URLRequest = new URLRequest("RuntimeLoadingExample.swf");
- var loader:Loader = new Loader();
- loader.load(request);
(2)被加载的.swf在一个新的完全独立的作用域中运行 这种情况下,被加载.swf在一个不受任何约束的作用域中运行。虽然不会发生什么冲突,但这样会
加大内存的占用。和加载到子域相同,和当前域同名的定义也会被忽略。
代码如下
//------------------------------------------------------------- // 被加载的.swf在一个新的完全独立的作用域中运行
- //------------------------------------------------------------
- var context:LoaderContext = new LoaderContext();
- context.applicationDomain = new ApplicationDomain();
- var request:URLRequest = new URLRequest("RuntimeLoadingExample.swf");
- var loader:Loader = new Loader();
- loader.load(request, context);
(3)被加载的.swf在现有作用域中运行 这种情况下,被加载.swf在现有的作用域中运行,被看作现有内容的一部分。常常用于运行
共享库。
代码如下
- //------------------------------------------------------------
- // 被加载的.swf在现有作用域中运行
- //------------------------------------------------------------
- var context:LoaderContext = new LoaderContext();
- context.applicationDomain = ApplicationDomain.currentDomain;
- var request:URLRequest = new URLRequest("RuntimeLoadingExample.swf");
- var loader:Loader = new Loader();
- loader.load(request, context);
3.安全域/系统域的问题 安全域/系统域是flash的顶级沙箱。我们知道应用程序域只存在于安全域内,并且只能属于唯一的一个安全域。但是安全域可以包含多个应用程序域。
两个不同安全域下的SWF通常是不可以互相通信的(在没有信任授权的情况下)。
再看LoaderContent(checkPolicyFile:Boolean = false,,);
checkPolicyFile检查策略文件的,是否允许加载策略文件(也就是信任授权)。
如果两个SWF处于不同的安全域下,某个SWF中的数据(比如某个变量)是不可以被其他SWF获取的,当然,代码也不能执行。如果尝试获取其他域中的SWF文件的数据将会产生一个安全错误。
一般来说,我们常用的就是父域下的新建子域、子SWF和父SWF应用程序域的合并(运行时共享库)。
4.图例说明 一个窗体只能有一个安全域(系统域)
一个系统域可以包含多个应用程序域
application1.swf就是主应用程序,它的applicationdomain就是Application doamin1,是 system domain的子节点。
module3.swf将application1的域作为父域
module1.swf与application1使用同一个域
application2.swf使用了单独的域
参考文献1.Flex框架的基本原理 .http://blog.chinaunix.net/cp.php?ac=blog&blogid=3289689&op=edit
2.ApplicationDomain
. 3.Flex的ApplicationDomain .http://blog.csdn.net/skill1986/article/details/6777957
4.AS3应用程序模块化开发与ApplicationDomain . http://www.duzengqiang.com/blog/post/283.html
5.应用程序域ApplicationDomain和安全域Security Domains.
阅读(2410) | 评论(0) | 转发(0) |