加载并运行现有AIR swf的AIR应用程序

时间:2010-02-19 04:35:08

标签: flex actionscript-3 air

我有一个现有的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应用程序放在同一个目录中等。

这可能吗?

2 个答案:

答案 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应用程序都有一个唯一的应用程序目录和一个唯一的存储目录。由于安全沙箱模型,应用程序无法访问其自己的存储目录之外的内容。