- 浏览: 706527 次
- 性别:
- 来自: 深圳
文章分类
- 全部博客 (389)
- flex (150)
- java (55)
- flex_sharedObject (4)
- iphone/android (7)
- red5 (4)
- blazeds (19)
- ajax (3)
- flex&java (9)
- 聊天室 (2)
- flex的问题 (1)
- game (8)
- flex_xml (1)
- flex组件学习 (2)
- JGroups (1)
- 中转站 (2)
- ruby (7)
- flex_js (5)
- C/C++ (14)
- perl (2)
- db (13)
- air (10)
- hibernate (8)
- flash_flex_as_3d (2)
- struts (4)
- dwr (8)
- freemarker (2)
- AS (22)
- 工具 (6)
- js_jquery_ext_yui (4)
- .net (1)
- C# (1)
- 前端 (1)
最新评论
-
136900923:
您好,您的代码我不是很懂,我想跟您交流一下,我的qq邮箱:13 ...
hibernate做无限极菜单树如此简单 -
fykyx521:
两个同一个功能
flex_flush_Socket 安全沙箱解决 -
ustb:
你上下两个代码类之间没关系
flex_flush_Socket 安全沙箱解决 -
u010656335:
...
flex发送QQ表情 -
u010656335:
flex发送QQ表情
AS3应用程序模块化开发与ApplicationDomain
模块(Module)
按照程序逻辑,可以拆分出多个“功能模块”,如“注册”、“管理”等等;按照游戏或社区类程序的关卡或场景,可以拆分出不同的“场景模块”。
这些模块不是主程序运行必须的,只在需要的时候加载
主场景或者多个模块通用的资源 ,比如位图、声音、设计好的页面元素等,可作为“库”在主程序运行前加载。可以整套更换的皮肤(skin)只需先加载一套。
public var applicationDomain:ApplicationDomain
= null
指定用于 Loader.load()
或 Loader.loadBytes()
方法的应用程序域。 只应在加载使用 ActionScript 3.0 编写的 SWF 文件(不是图像或使用 ActionScript 1.0 或 ActionScript 2.0 编写的 SWF 文件)时才使用此属性。
每 个安全域被分成一个或多个由 ApplicationDomain 对象表示的应用程序域。 应用程序域并不是用于安全目的;它们用于管理 ActionScript 代码的协作单元。 如果是从其它域加载 SWF 文件,并允许将它放置到另外一个安全域中,则您将无法控制所加载的 SWF 文件被放置到哪个应用程序域中;即使您指定应选择某个应用程序域,也会忽略。 但是,如果是将 SWF 文件加载到您自己的安全域中(因为此 SWF 文件来自您自己的域,或者您正在将它导入到您的安全域中),您就可以控制为所加载的 SWF 文件选择哪个应用程序域。
在 LoaderContext.applicationDomain
中,您只可以传递您自己的安全域中的应用程序域。 如果试图传递任何其它安全域中的应用程序域,则会引发 SecurityError
异常。
有四种 ApplicationDomain
属性可供您选择使用:
加载器的 ApplicationDomain 的子级(模块)
。
默认值。 可以使用语法 new ApplicationDomain(ApplicationDomain.currentDomain)
显式表示这种选择。 这将允许所加载的 SWF 文件直接使用父级的类
,例如,可通过编写 new MyClassDefinedInParent()
来使用。 但是父级则不能使用此语法;如果父级要使用子级的类,它必须调用 ApplicationDomain.getDefinition()
来检索它们。
这种选择的优点是:
1、如果子级定义的类与父级已经定义的类同名,不会出现错误结果;
2、子级只会继承父级对该类的定义,除非子级或父级调用 ApplicationDomain.getDefinition()
方法来检索子级的冲突定义,否则将不使用此定义。
加载器自己的 ApplicationDomain (共享库)
。
使用 ApplicationDomain.currentDomain
时请使用此应用程序域。 加载完成后,父级和子级可以直接使用对方的类。
如果子级试图定义的类与父级已经定义的类同名,将出现错误并放弃加载。
系统 ApplicationDomain 的子级(独立运行的程序或模块
) 。
使用 new ApplicationDomain(null)
时请使用此应用程序域。 这将完全分离加载方和被加载方,从而允许它们使用相同的名称定义各自版本的类并且不会产生冲突或隐藏。
一方查看另一方的类的唯一方式是调用 ApplicationDomain.getDefinition()
方法。
其它 ApplicationDomain 的子级。
有时可能会有更复杂的 ApplicationDomain 层次结构。 可以将 SWF 文件从您自己的 SecurityDomain 加载到任何 ApplicationDomain 中
。 例如,new ApplicationDomain(ApplicationDomain.currentDomain.parentDomain.parentDomain)
将 SWF 文件加载到当前域父级的父级的新子级中。
加载完成后,为调用 ApplicationDomain.getDefinition()
,任一方(加载方或被加载方)都可能需要找到它自己的 ApplicationDomain 或另一方的 ApplicationDomain。 任一方都可以通过使用 ApplicationDomain.currentDomain
来检索对它自己的应用程序域的引用。 执行加载的 SWF 文件可以通过 Loader.contentLoaderInfo.applicationDomain
来检索对被加载的 SWF 文件的 ApplicationDomain 的引用。 如果被加载的 SWF
文件知道自己的加载方式,则它可以找到执行加载的 SWF 文件的 ApplicationDomain 对象。
例如,如果子级是以默认方式被加载的,则它可以通过使用 ApplicationDomain.currentDomain.parentDomain
找到执行加载的 SWF 文件的应用程序域。
使用Loader类加载swf时可以通过指定ApplicationDomain 参数将swf加载到不同的域(Domain):
var context : LoaderContext = new LoaderContext () ;
/* 加载到子域(模块) */
context . applicationDomain = new ApplicationDomain ( ApplicationDomain . currentDomain ) ;
/* 加载到同域(共享库) */
context . applicationDomain = ApplicationDomain . currentDomain ;
/* 加载到新域(独立运行的程序或模块) */
context . applicationDomain = new ApplicationDomain () ;
loader . load ( new URLRequest ( " loaded.swf " ) , context ) ;
ApplicationDomain使用类似于显示列表(DisplayList)的树形结构。 相对于舞台(Stage) ,可以认为
ApplicationDomain 最根部的是系统域(system domain),包含 Flash Player
核心类定义。主程序所在的域(以下简称主域)就是它唯一的子域,类似于Stage下的文档类(Document Class)。
一个fla文档类里代码:
this
.
stage
.
addChild
(
mySprite
)
;
this
.
addChild
(
myMC
)
;
this
.
addChild
(
myShape
)
;
运行后的显示列表:
ApplicationDomain 的类似结构:
加载到子域(模块)
类似于“继承”,子域可以直接获得父域所有的类定义,反之父域得不到子域的。和继承关系不同的是,如果子域中有和父域同名的类,子域定义会被忽略而使用父域的定义。
加载到同域(运行时共享库)
类似集合里的合并关系。被加载swf里的所有类定义被合并到当前域中可以直接使用。和加载到子域相同,和当前域同名的定义也会被忽略。
加载到新域(独立运行的程序或模块)
swf载入指定域之前,先要检查该域及其父域中是否存在同名类,重复定义一概忽略。如果加载别人写的程序,或者使用旧版本的主程序加载新版本的模块,为避免类名冲突就要加载到新域独立运行以使用自己的类。
模块加载到同域不是一样可以吗?为何要加载到子域呢?好处就在于,卸载一个加载到子域的模块时,只要确保清除所有到该模块的引用,模块的所有类定义将被垃圾回收(Garbage Collection)。
有两种方式可以访问 ApplicationDomain :
-
ApplicationDomain.currentDomain
currentDomain是ApplicationDomain的静态变量,表示当前代码 所 在的域。该变量很奇特,在主程序里指向主域,在加载到子域的模块里则指向该模块所在的子域。虽然 ApplicationDomain 有个 parentDomain 属性,但子域已经自动获得了父域的类定义,所以通过 ApplicationDomain.currentDomain 就可以获取父域定义了——包括主程序和加载到主域的共享库。(注:系统域不可直接访问,主域和所有新域即系统域子域的parentDomain属性为 null) -
LoaderInfo类的applicationDomain属性
此方式可以访问任何方式加载的swf的 ApplicationDomain。对于主程序来说,加载到同域的库定义已经存在于 ApplicationDomain.currentDomain ,而模块的类主程序一般用不到。所以这种方式个人不推荐使用。
ApplicationDomain 的 hasDefinition() 方法判断某定义是否存在,getDefinition() 方法获取指定的定义。下面以一个例子来介绍 ApplicationDomain 的具体用法和应用程序的拆分。
本利有四个swf,shell.swf是主程序,lib.swf是共享库,login.swf和result.swf分别是“登录”和“结果”模块
,所有的视图元件都在共享库中。
实际开发时可能有很多库,比如“位图库”、“音效库”、“模型通用库”等。“通用库”里存放多个模块共用的资源,比如此例中的背景元素。
而各个模块独有的资源还是放在各自的swf中。
主程序首先将共享库加载到同域,完成后将“登录模块”加载到子域。主程序可以像操作普通的视觉对象(DisplayObject)一样操作加载的模块:
监听事件、调用方法。因为编译器不会识别未定义的类,为使用强类型,建议为主类和模型定义相应的接口,使用少量的重复代码协助编程。
{
if ( this . m_moduleList [ 0 ] == " login.swf " )
{
p_module . show ( this ) ;
p_module . addEventListener ( " login " , this . onLogin ) ;
} else
{
p_module . show ( this , this . m_userName ) ;
}
}
模块“继承”了主程序和共享库的所有类和资源,可以通过 ApplicationDomain.currentDomain.getDefinition() 来获取相应的类。注意获取不存在的类会抛出一个 ReferenceError。
{
try
{
return ApplicationDomain . currentDomain . getDefinition ( p_name ) as Class ;
} catch ( p_e : ReferenceError )
{
trace ( " 定义 " + p_name + " 不存在 " ) ;
return null ;
}
return null ;
}
登录模块获取库中的界面元素,并在点击按钮后抛出事件。Event类不允许带参数,必须使用继承Event的自定义事件抛出参数。 主程序可以把模块的自定义事件也编译进去(这样就增大了整个程序的文件尺寸),或者让监听模块事件的函数接受一个Objcet参数,以获取其动态属性。
{
this . m_userName = p_e . userName ;
var login : IModule = p_e . currentTarget ;
login . removeEventListener ( " login " , this . onLogin ) ;
login . dispose () ;
this . loadSwf () ;
}
主程序收到事件之后卸载注册模块,加载“结果模块”到子域,并将登录模块传出的”userName”参数传给结果模块。
{
var libClass : Class = this . getClass ( " net.eidiot.appDomainDemo.Libaray " ) ;
if ( libClass != null ) this . initUi ( libClass , rest ) ;
}
override protected function initUi ( p_libClass : Class , p_rest : Array = null ) : void
{
this . addUi ( this . getClass ( p_libClass . BG_NAME ) , " 结果 " ) ;
var resultFunc : Function = p_libClass . getResult ;
var userName : String = p_rest [ 0 ] ;
this . addChild ( resultFunc ( userName )) ;
}
注意initUi()方法分别使用了共享库中Libaray类的静态属性BG_NAME和静态方法getResult()。但是直接调用此静态方法会报错,可以先用 resultFunc 变量取出此方法。详细内容请参考 源代码 。
发表评论
-
转深入理解Flash的沙箱 – Security Domains
2014-01-22 09:35 797一篇很经典的进阶文章,国外牛人的分享,清晰明了,图文并茂,适 ... -
[IE6 only]关于Flash/Flex,返回数据产生流错误Error #2032的解决方式
2010-11-19 14:04 2364转自:http://www.xintend.com/Artic ... -
as3_Matrix3d
2010-09-10 15:45 2293Matrix3D 类使用一个 4x4 正方形矩阵,即一个由 ... -
as3中matrix 解释,终于找到了
2010-09-10 14:57 4796转自:http://blog.sina.com.cn/ ... -
flash安全沙箱_解决测试时安全沙箱的问题
2010-07-18 18:15 1190自己测试的swf 老报安全沙箱 以前看到帖子 设置一个安全文件 ... -
flashlog.txt配置
2010-04-08 15:34 2473本工具特点:1、简单又 ... -
flex as3 元数据标签综合
2010-01-04 13:50 1315http://www.cnblogs.com/chocol ... -
Flex实际复杂项目中RSL(运行时共享库)的使用方法
2010-01-04 13:37 2692http://flash.9ria.com/thread-42 ... -
AS3 event flow 事件冒泡机制 以及 stopImmediatePropagation() stopPropagation()用法
2009-12-28 19:03 3184http://yzzelliot.spaces.live. ... -
event.preventDefault() 取消事件的默认行为
2009-12-28 18:53 6021http://blog.csdn.net/xiang08/ar ... -
gTween:轻便的as3缓动类库分享
2009-12-25 13:25 2219前不久做一个作品,想加入一些复杂点的缓动效果,想到gTween ... -
用Flex的编译参数实现AS3程序的自身预加载(Self Preloading)
2009-12-17 19:03 1774http://www.riaidea.com/blog/arc ... -
as3运行时加载字体
2009-12-16 11:20 1648http://nochump.com/blog/?p=20。还 ... -
minibuilder 启动命令
2009-12-03 03:50 671http://code.google.com/p/minibu ... -
AS3 Alert
2009-12-02 16:37 1492package { import flash.displ ... -
最新火爆游戏巨献——谈Flash Player的安全机制
2009-11-23 16:30 706最新火爆游戏巨献——谈Flash Player的安全机制 ... -
as3编译器错误中文说明
2009-11-19 13:38 1236http://www.eb163.com/club/threa ... -
aswing进度条改变显示进度条方式
2009-11-11 16:53 1007package org.aswing.plaf.basic.b ... -
aswing布局管理器
2009-11-11 02:23 1817http://hereson.iteye.com/blog/1 ... -
as绘制渐变颜色皮肤
2009-11-10 13:57 897这段代码画了一个球型 var myMatrix:Matrix ...
相关推荐
深入理解ApplicationDomain和SecurityDomain
applicationDomain学习资料
本书是一本教授ActionScript 2.0及开发丰富网络应用程序(Rich Internet Application, RIA)的指导书。内容围绕编程概念、ActionScript 2.0语法、使用组件快速创建应用程序、Flash与服务器连接、提取及更新数据库等...
ApplicationDomain的误解,安全沙箱有关内容
欢迎使用Excel和Visual Basic for Application开发应用程序!作为已经能够熟练使用Excell的用户,你一定对Excell强大的功能感到满意。现在,你将逐步提高到更高的水平。即使你以前从来没有编写过程序,也能够使用...
详细介绍ApplicationDomain和SecurityDomain的原理,想对这方面的知识做深入研究的可以看下
这个框架的初衷,是为了方便让程序模块化、插件化,将一个apk应用拆分为多个apk。 不明白这个插件化、模块化是怎么回事的话,可以看看腾讯微信的安卓客户端中的插件配置。 在这里我会以腾讯微信为例,如何使用这个...
AS400上的开发工具简介_硬件操作简介 本文将对AS400上的开发工具进行简介,并对其硬件操作进行介绍。...AS400上的开发工具可以帮助开发人员快速开发和维护应用程序,使得开发工作更加便捷、高效。
教学提示: 掌握编写 Java Applet 程序和 Java Application 程序的基本方法; 了解程序的结构和 Java 语言的语法规则;理解事件驱动的工作原理;了解 DOS 界面程序和 J2ME 程序的特点和 设计方法。
教读者如何在Linux上设计,开发和部署实际的Java业务应用程序。
Linux Application Development(Linux应用程序开发)第二版和它的源代码
在HIS Demo中,我们使用了三个Microsoft Application Blocks,数据访问应用程序模块(Data Access Application Block, DAAB)、更新应用程序模块(Updater Application Block, UAB)以及异常管理应用程序模块...
VC6.0开发Win32Application程序,非常简单!
从MATLAB中创建出一个独立的应用程序有多种方法,可以用MATLAB提供的现有函数或者现有App,本文介绍的是利用MATLAB的Application Compiler工具创建一个独立的应用程序。
advanced-express-application-development, 高级 express web应用程序开发 高级 Express Web应用程序开发这里模块包含 above 图书的源代码。 请查看每个章节的自述文件以获得更多信息。第 1章:基础第 2章:构建 ...
的 Android SDK 提供了在 Android 平台上使用 JaVa 语言进行 Android 应用开发必须的工具和 API 接口。 特性 • 应用程序框架 支持组件的重用与替换 • Dalvik Dalvik Dalvik Dalvik 虚拟机 专为移动设备优化 • ...
应用程序调试技术 光盘 John Robbins Debugging Application
EXCEL VBA应用开发与实例精讲 作 者: 夏强 编著. 出 版 社: 科学出版社 出版时间: 2006-3-1 内容简介 VBA(Visual Basic for Applications)是Office 系列软件的内置编程语言,在Excel中使用VBA编程将会开发出...
和做事情一样,应用程序也需要有来有去。进来了,给用户提供良好的运用感受,帮用户顺利的解决问题。当然走的时候更需要带走自己遗留的“垃圾”,为再次使用或下一个用户提供干净的安全的系统环境。 如果应用程序走...
综合 Google App Engine 和 iPhone 开发的强大之处在于可以使用 Python 快速原型化应用程序的某些部分,在这之前用 Objective-C 进行编码十分繁琐,另外这种综合也增强了(在线和离线)数据存储的灵活性。...