我有一个现有的AIR应用,其主要内容是App.swf。我想有另一个托管和运行App.swf的AIR应用程序。当我说运行它时,我的意思是显示它的WindowedApplication。
以下是2个AIR项目的代码(为简洁起见,省略了导入):
// App AIR Project -> App.mxml -> App.swf (it's just a window)
<?xml version="1.0" encoding="utf-8"?>
<mx:WindowedApplication xmlns:mx="http://www.adobe.com/2006/mxml">
<mx:Script>
<![CDATA[
public function doSomething():void {
trace("doSomething called");
}
]]>
</mx:Script>
</mx:WindowedApplication>
// AirAppHostApplication AIR Project -> AirAppHostApplication.mxml -> AirAppHostApplication.swf
<?xml version="1.0" encoding="utf-8"?>
<custom:AirAppHostApplication xmlns:custom="components.*" />
// components/AirAppHostApplication.as
public class AirAppHostApplication extends WindowedApplication
{
private var ldr:Loader;
public function AirAppHostApplication()
{
addEventListener (FlexEvent.CREATION_COMPLETE, handleComplete);
}
private function handleComplete( event : FlexEvent ) : void
{
loadSwf("App.swf");
}
private function loadSwf(swf:String):void {
ldr = new Loader();
var req:URLRequest = new URLRequest(swf);
var ldrContext:LoaderContext = new LoaderContext(false, ApplicationDomain.currentDomain);
ldr.contentLoaderInfo.addEventListener(Event.COMPLETE, completeHandler);
ldr.load(req, ldrContext);
}
private function completeHandler(event:Event):void {
var appSystemManagerCls:* = ApplicationDomain.currentDomain.getDefinition("_app_mx_managers_SystemManager") as Class;
var appSystemManagerInstance:* = new appSystemManagerCls(Application.application);
var appInstance:WindowedApplication = appSystemManagerInstance.create();
appInstance.activate();
appInstance.doSomething();
}
}
加载App.swf时出现以下错误:
TypeError: Error #1009: Cannot access a property or method of a null object reference.
at mx.managers::SystemManager/initHandler()[C:\autobuild\galaga\frameworks\projects\framework\src\mx\managers\SystemManager.as:3001]
我认为这个问题与AirAppHostApplication的SystemManager与App的SystemManager冲突有关,因为它们都存在于同一个app域中。可以在静态定义WindowedApplication类的情况下编写AIR应用程序,但是在运行时通过加载swf并实例化swf中包含的WindowedApplication子类来加载。
我想这样做的原因是为了一个自动化场景,我必须假设我没有自动化的应用程序的源代码,但我可以访问公共类的名称和他们的暴露自动化的公共方法。我完全控制环境,不必处理任何限制,所以我可以将2个AIR应用程序放在同一个目录中等。
这可能吗?
答案 0 :(得分:2)
是的,这是可能的。看看http://blog.everythingflex.com/2009/06/08/open-an-air-application-from-a-2nd-air-application/
它被称为从第二个AIR应用程序打开AIR应用程序。
它说:
两者都需要的一件事是,您尝试启动的应用程序将AIR配置文件中的allowBrowserInvocation属性设置为true,并在您的系统上安装该应用程序。
和
您还必须知道应用程序的ID和发布者ID。例如,在我的LauncherSample中,AIR配置文件中定义的应用程序ID是:
plus告诉如何做到这一点。
以下是Adobe对错误的描述。
错误1009无法访问空对象引用的属性或方法。
计算结果为null的对象不能具有任何属性。在某些意外(尽管有效)情况下可能会发生此错误。例如,请考虑以下代码,该代码创建Sprite对象。由于此Sprite对象永远不会添加到显示列表中(通过DisplayObjectContainer对象的addChild()方法),因此其stage属性设置为null。因此,该示例生成此错误,因为Sprite对象的stage属性不能具有任何属性:
import flash.display.Sprite;
var sprite1:Sprite = new Sprite();
var q:String = sprite1.stage.quality;
答案 1 :(得分:0)
不,这是不可能的。每个AIR应用程序都有一个唯一的应用程序目录和一个唯一的存储目录。由于安全沙箱模型,应用程序无法访问其自己的存储目录之外的内容。