我有一個現有的AIR應用程序,其主要內容爲App.swf。我想要另一個託管和運行App.swf的AIR應用程序。當我說運行它時,我的意思是顯示它是WindowedApplication。裝載並運行現有AIR的AIR應用程序swf
下面是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與應用程序的SystemManager衝突,因爲它們都生活在同一個應用程序域中。可以編寫AIR應用程序,其中WindowedApplication類不是靜態定義的,而是在運行時通過加載swf並實例化swf中包含的WindowedApplication子類來加載的。
我想這樣做的原因是自動化場景,我必須假設我沒有自動化應用程序的源代碼,但我可以訪問公共類的名稱和他們的公開方法暴露於自動化。我完全控制了環境,不必處理任何約束,所以我可以將2個AIR應用程序放在同一個目錄中,等等。
這可能嗎?
感謝您的回覆,但我不想簡單地從AIR應用啓動另一個AIR應用。我想在另一個AIR應用程序中託管現有的AIR應用程序。這意味着託管應用程序和託管應用程序所駐留的代碼只有一個過程。我更新了代碼以使其更清晰。 – pfeilbr 2010-02-19 12:46:31