4 October 2011
对AIR和ActionScript 3具有中等或深入的理解,熟悉Flash Builder和Java。
中级
备注:Adobe建议使用下一版Flash Builder来为Adobe AIR开发原生扩展。立即注册 访问Flash Builder 4.6的预发行版
本教程向您使用简单的代码为Adobe AIR创建您自己的原生扩展。除了向您展示在所有原生扩展(AIR、ActionScript 3和Flash Builder)中通用的代码和技能,本教程还介绍了在Android平台上编译原生代码。您可能对使用Objective-C、C#、C++、C或其他某种语言进行开发感兴趣,本文的Java代码应该会帮助您牢固理解与原生扩展的原生交互。
要充分掌握本教程中的知识,请确保您安装了以下软件:
您还需要以下工具:
您可以选择使用另一种平台,但本指南的原生代码部分中的步骤将要求您维护您自己的原生构建环境。
其他资源
Adobe AIR允许应用程序开发人员使用一组称为Adobe AIR原生扩展的工具扩展运行时的功能。从2.5版开始,此功能已为AIR for TV启用,它现在已扩展到移动和桌面平台。通过使用原生扩展,您的应用程序可访问目标平台的所有功能,即使运行时本身没有内置的支持。
为了演示这一点,想象您在Android设备上创建一个应用程序,并希望在应用程序完成下载时震动电话。没有原生扩展支持,您要么必须使用Java编写整个程序,要么使用AIR并接受此任务不可实现的事实。但是,使用原生扩展,您可以创建一个横跨原生代码和您自己的应用程序逻辑的桥梁,允许您来回传递指令,使您的应用程序能够控制震动马达。您然后可以利用AIR的多平台支持将相同的应用程序部署到iOS,通过包含Objective-C代码来扩展您的原生扩展。您甚至可以将原生代码更改为可感知平台,以便更改震动持续时间和模式,无论应用程序是在Android上还是在iOS上运行。
原生扩展允许您利用您设备的独特和特定于平台的功能,它们还允许您在ActionScript应用程序中使用原生代码,重用现有的平台代码,在线程中执行操作来提高您应用程序的处理能力,以及提供对原生平台库的访问。原生扩展的封装和分发就像所有其他ActionScript库一样:您可以分发您自己的库,以及使用其他开发人员发布的原生扩展,可以将功能插入到您自己的应用程序中。
Adobe还提供了多个经过良好备案的原生扩展示例,将帮助开发人员开始使用上述功能。
本教程将指导您开始自行创建一个原生扩展。它将介绍创建用于Android的原生Java代码、ActionScript 3代码和一个原生扩展文件所需的步骤,您还将学习如何创建一个使用您的原生扩展的Flex移动应用程序,最后您将在您的设备上测试它。尽管这是一个 “Hello, World!”教程,但我们会避免通过原生代码打印这条常见的消息,而选择控制Android智能电话的震动马达。如果您感觉这有点冒险(或者希望针对不 同的平台),您可以选择调整本指南的原生代码部分来适应非Android平台。
以下是以下页面中将采取的总体步骤:
证明您的原生扩展有效!
原生扩展的核心是原生代码,它充当着您的应用程序与您希望控制的功能之间的第一层。在本示例中,原生代码将控制震动马达,使用 ActionScript 3发送和接受信息。您将自行编写功能来控制震动马达,还将使用Adobe AIR提供的Java API来向ActionScript 3发送和从其接受数据。
但是,在开始编码和使用库之前,您必须设置您的构建环境。
因为您将编写原生Android代码,您需要一个可操作Android SDK的开发环境。如果您还没有,请依照本指南开头包含的链接安装和配置Android SDK。完成此过程后,您将修改Flash Builder以创建和编译Android项目:
您可能急于了解编写代码的具体细节,但如果现在确认您的电话能够连接并经过了Android SDK的识别,将在以后省掉不少麻烦。
我们现在必须在Flash Builder中创建一个新Android项目,要求链接器查找随AIR SDK提供的Java API JAR文件。
您还有一项项目配置任务:设置应用程序,以拥有使用设备的震动控件的权限。
您已执行了这一步,所以如果您决定创建原生测试案例,您的原生代码将拥有运行所需的必要权限。尽管本教程没有介绍它,在继续编写ActionScript 3之前测试原生代码可能很有帮助——尤其是对于更高级的原生扩展。
现在您的Android项目已正确配置,您必须开始添加在ActionScript和您的原生Java代码之间建立桥梁的结构。这些结构中的第一个是一个扩展上下文。扩展上下文负责包含最多3个基于原生扩展的项目(另请参见Oliver Goldman的文章Extending Adobe AIR)):
现在您的原生扩展可以拥有多个扩展上下文,您应该基于功能将它们分开。在本例中,您仅需要一个上下文,它将提供一个映射来访问Android震动功能。
接下来您将创建一个新VibrationExtensionContext类。
您将看到已为您创建了两个函数:public void dispose()和public Map<String, FREFunction> getFunctions()。您可能已猜到,getFunctions()必须返回字符串(在您的ActionScript 3代码中引用和任何FREFunction类(您接下来将定义)之间的一个键值对映射。Adobe提供的API为您提供了以缩写词FRE(表示Flash 运行时扩展)开头的类和函数。
在您的原生扩展中定义函数的第一步是创建一个新Map用于返回。在getFunctions()类中,添加:
@Override
public Map<String,FREFunction> getFunctions()
{
Map<String, FREFunction> functionMap = new HashMap<String, FREFunction>();
return functionMap;
}
这创建一个空HashMap,但它如果是空,显然不是很有用。您将映射3个键值对,每个键值对将定义一个实现FREFunction接口的类:
isSupported映射到一个VibrationSupportedFunction。这将运行某种逻辑,将一个FREObject传递到包含true或false注意: 一种最佳实践是在使用您的原生扩展的其他功能之前,始终允许ActionScript 3代码执行兼容性检查。
vibrateMe映射到一个VibrationVibrateFunction。这个FREFunction接受一个来自ActionScript 3的参数,以控制震动的持续时间,然后在您的设备上执行实际的震动。initMe映射到一个VibrationInitFunction。在其他函数准备好被使用之前,此函数允许原生代码执行和初始化任务。在本例中,您将创建Android的VIBRATOR_SERVICE的引用,它将用在VibrationVibrateFunction(在 ActionScript 3中也称为"vibrateMe")中。getFunctions()类中,在您的functionMap对象上调用put()函数。第一个参数将是一个字符串,表示上述函数名称,第二个函数是该函数(还未创建)的一个新实例:functionMap.put("initMe", new VibrationInitFunction());
functionMap.put("isSupported", new VibrationSupportedFunction());
functionMap.put("vibrateMe", new VibrationVibrateFunction());
您已定义了三个函数。接下来,您将它们编写为实现FREFunction接口的类。您将从VibrationInitFunction开始,它被调用时将在您的VibrationExtensionContext中设置一个将在以后用于震动设备的类。
请注意,你可以通过使用Eclipse的代码生成功能完成以上的步骤:点击你希望创建的类(本例中是VibrationInitFunction),敲击Ctrl –1打开代码提示窗口,然后选择 "创建VibrationInitFunction类 "。这样编辑器就可以自动帮你创建类代码了。
您将看到,已在您的VibrationInitFunction中为您定义了一个函数:call(),它接受两个参数:一个FREContext和一个 FREObject[]数组。默认情况下,这两个参数定义为arg0和arg1,但您可以为它们提供更具描述性的名称。将call()函数定义更改为类似以下形式:
public FREObject call(FREContext context, FREObject[] passedArgs)
当调用此函数时,第一个参数将是您的VibrationExtensionContext的引用,第二个参数将是ActionScript 3代码传递的所有参数(如果有)的数组。这将对您的VibrationVibrateFunction很重要,它将基于该数组中的第一个参数设置持续时间。
现在,您的init函数将使用传入的FREContext对象来获取VibrationExtensionContext,然后获取它所属的 Android活动。使用此活动引用,它然后将能够检索名为Context.VIBRATOR_SERVICE的全局Android系统服务,该服务将允许您控制震动马达。您将此系统服务存储在您的VibrationExtensionContext中包含的一个新变量中,您稍后将创建它:
VibrationInitFunction的call()函数中,添加以下代码来从传入的FREContext获取VibrationExtensionContext:VibrationExtensionContext vbc = (VibrationExtensionContext)context;
getActivity()函数抓取活动。在FREContext类中包含此函数的目的是为了支持常见任务,比如您需要抓取上下文的活动,进而拥有我们需要的SystemService的路径。Activity a = vbc.getActivity();
a.getSystemService(),传入全局Context.VIBRATOR_SERVICE的引用。这将返回一个类型为 Vibrator的对象。您需要一个可用于整个扩展上下文的位置来存储此引用,所以将它放在一个位于VibrationExtensionContext 内的新变量vb中:vbc.vb = (Vibrator)a.getSystemService(Context.VIBRATOR_SERVICE);
vb的公共变量:public Vibrator vb = null;
现在,您已创建了一个原生代码结构的引用vb Vibrator类,它可供可引用您的VibrationExtensionContext的任何类访问。
您完成的VibrationInitFunction看起来应该类似于:
public class VibrationInitFunction implements FREFunction
{
@Override
public FREObject call(FREContext context, FREObject[] passedArgs)
{
VibrationExtensionContext vbc = (VibrationExtensionContext)context;
Activity a = vbc.getActivity();
vbc.vb = (Vibrator)a.getSystemService(Context.VIBRATOR_SERVICE);
return null;
}
}
您已学习了如何:创建一个实现FREFunction的类,理解从ActionSscript 3传入的参数,通过FREContext参数传入您的扩展上下文,而且您已看到扩展的一种常见的初始化任务。
接下来您必须实现在Map<String, FREFunction> getFunctions()函数中实现的其他两个FREFunction。
您前面定义的第二个函数是VibrationSupportedFunction。您在getFunctions()返回的HashMap中已表明,此函数可使用ActionScript 3字符串isSupported调用。此函数的创建非常类似于VibrationInitFunction,但它将向您展示如何在一个FREObject 内返回一个布尔值。
arg0和arg1更改为context和passedArgs。call()函数中的结果,现在创建并返回该结果。您还想要您的VibrationExtensionContext的引用,所以通过转换上下文参数来创建它:FREObject result = null;
VibrationExtensionContext vbc = (VibrationExtensionContext)context;
// ...
return result;
vbc.vc。vbc.vc是否非空?如果非空,结果应该为true。vbc.vc为空,我们可以合理地推断初始化失败,以及此平台不支持震动。结果应该设置为false。创建以下if语句:
if (vbc.vb == null)
{
result = FREObject.newObject(false);
}
else
{
result = FREObject.newObject(true);
}
newObject()可能导致抛出一个FREWrongThreadException异常。您会将您的if 语句放在一个try catch代码块中,以处理此不测事件。您完成的call()函数现在看起来应该类似于:
@Override
public FREObject call(FREContext context, FREObject[] passedArgs)
{
FREObject result = null;
VibrationExtensionContext vbc = (VibrationExtensionContext)context;
try
{
if (vbc.vb == null)
{
// Not supported
result = FREObject.newObject(false);
}
else
{
// Supported
result = FREObject.newObject(true);
}
}
catch (FREWrongThreadException fwte)
{
fwte.printStackTrace();
}
return result;
}
您现在有了3个原生扩展函数中的第二个:VibrationSupportedFunction。当被ActionScript 3字符串isSupported调用时,此函数将检查VibrationExtensionContext"context"中的变量vb是否为非空。它将基于此条件返回值为true或false的FREObject,将捕获一个可能由FREObject的静态newObject()函数抛出的 FREWrongThreadException。
您必须实现的最后一个原生扩展函数执行您的原生扩展的核心职责:它允许AIR应用程序震动设备的马达指定的持续时间。
arg0重命名为context,将arg1重命名为passedArgs。result的空FREObject。vbc.vb。我们现在已准备好访问第一个传入的参数FREObject,尝试将它设置为一个整数。如果数据格式奇怪,可能会抛出一个异常并且您将获取该异常。您的call()函数现在看起来应该类似于:
@Override
public FREObject call(FREContext context, FREObject[] passedArgs)
{
FREObject result = null;
VibrationExtensionContext vbc = (VibrationExtensionContext)context;
try
{
// Vibrate the device
}
catch (Exception e)
{
e.printStackTrace();
}
return result;
}
try { // ... }代码块内,我们将尝试抓取passedArgs数组中的第一个元素作为FREObject:FREObject fro = passedArgs[0];
getAsInt();来创建一个int:int duration = fro.getAsInt();
vb Vibrator变量上调用Android原生震动函数,传入持续时间:vbc.vb.vibrate(duration);
您现在已成功创建了3个原生函数,将它们映射到了getFunctions()提供的HashMap中的字符串,创建执行您的原生扩展所需的所有操作所必要的原生逻辑。这样就完成了VibrationExtensionContext的创建,它是您的原生扩展需要的唯一的扩展上下文。
您已创建了您的原生扩展需要的一个且是唯一一个扩展上下文,但您还未创建我们的扩展的主要类。幸运的是,添加此类很简单,我们所需做的就是创建一个名为VibrationExtension的类,它实现FREExtension接口。
FREExtesion接口定义initialize、dispose和createContext函数,它们允许挂钩到一个原生扩展的生命周期中。尽管为我们提供了3个函数,我们仅需要自定义一个:createContext函数。此函数必须返回一个FREContext。幸运的是,您已创建了您自己的 VibrationExtensionContext,可以简单地返回此类的一个实例。
createContext()函数中定义的字符串参数将显示为arg0。此参数实际上是一个ID,定义要创建的上下文类型(它仅在您拥有多种上下文类型时才有用)。将arg0更改为contextType。createContext()函数,我们仅需要返回VibrationExtensionContext的一个新实例。将return null;代码替换为以下代码:return new VibrationExtensionContext();
这将初始化并创建您的扩展上下文,允许您使用放在您的原生扩展内的原生代码。
在本教程的以下各节中,我们将介绍如何编写原生扩展的ActionScript 3部分代码,以及封装和测试完成的原生扩展文件和示例应用程序。这些步骤将涉及以JAR文件的形式引用您的原生代码。在Flash Builder中创建一个JAR文件很简单:
您已完成了在创建原生扩展过程中大部分必要的编码工作,创建了可使用其他函数、逻辑以及(如果有必要)甚至其他扩展上下文进行扩展的Java代码,以扩大您的原生扩展的范围。
相对而言,创建完成此平台桥所需的ActionScript 3代码比较简单。您的任务包括:
您的ActionScript 3库代码将包括一个类,该类将导入flash.external.ExtensionContext API,提供以下函数:
initMe原生函数。isSupported的函数,它将调用我们的isSupported原生函数,还将依据来自我们的原生代码的响应而返回true或false。vibrateMe函数。您的ActionScript 3 代码将位于一个Flex库项目中:
您现在必须创建与我们的扩展上下文的连接,这将允许您访问您使用Java创建的initMe、isSupported和vibrateMe。
private static var extContext:ExtensionContext = null;
extContext变量是否已初始化。如果没有,您将调用静态函数 ExtensionContext.createExtensionContext(),传入两个标识符。第一个是一个ID,您稍后将在一个 extension.xml文件中设置。第二个是一个参数,传递到VibrationExtension的createContext()函数。您应该记得,它允许您创建不同的扩展上下文,因为您只有一个,所以在原生代码中忽略了此阐述。如果您拥有多个扩展上下文,您应该让原生代码使用if或switch 语句分析您传入的值,基于可用的共享字符串值创建合适的值。编写以下代码: if ( !extContext )
{
extContext = ExtensionContext.createExtensionContext("com.yourDomain.Vibrate","vibrate");
extContext.call("initMe");
}
extContext.call()调用了initMe,没有传入其他参数。这将这将使用您使用Java编写的VibrationInitFunction完成,将为您初始化震动设备所必要的内部数据结构。现在,只要任何使用您的新ActionScript 3库的应用程序调用Vibrate()构造函数,就会创建和初始化您的扩展上下文。但是,您还有两个函数要实现。首先创建isSupported()函数,它将连接到原生isSupported()函数,并检查您的应用程序逻辑所返回的布尔值。
isSupported()的静态getter,它返回一个布尔值:public static function get isSupported():Boolean
{
var supported:Boolean = false;
// ...
return supported;
}
extContext.call()的调用,传入isSupported作为一个字符串参数,这会将您的isSupported变量设置为返回的布尔值:supported = extContext.call("isSupported") as Boolean;
重复此过程以创建vibrateMe函数,它将接受一个Number作为持续时间。此函数的创建很简单:
public function vibrate(duration:Number):void
{
extContext.call("vibrateMe",duration);
}
请注意,Flash Builder会自动将您的库编译为一个SWC文件(位于项目的bin文件夹中。SWC文件是一个包含library.swf的压缩文件。只要您使用 ADT封装一个ANE文件,就必须手动引用SWC和SWF。因此,您现在应该在压缩文件管理工具中打开SWC文件,提取library.swf,将它放在 HelloANELibrary的bin/目录中:
library.swf文件需要放在您针对的每个平台的原生代码目录内。例如,可以将此文件放在了iOS/、android/、x86/等目录内,具体取决于您的项目的目标平台。(对于更高级的ANE,您可以指定不同的library.swf的文件,只要您需要您的AS3库对于不同平台而言不同。但是,这与定义一个通用接口的最佳实践不符,建议您坚持使用单一版本的library.swf。)
通过提取library.swf,您现在拥有创建原生扩展所需的所有文件。请注意,只要更改了您的库代码,就必须重复步骤1到4,否则library.swf将过期。
现在您编写了使用原生扩展所需的所有库代码。
您创建了必要的代码,但还未将所有内容链接到一个ANE文件中。首先在您的Flex库文件内创建一个extension.xml文件。对于每个原生目标,此文件指向原生代码(您的JAR文件),并描述初始化器函数(以及可选地,一个终结器函数,本示例中不需要它)的包位置。在创建您的ANE文件(后面将在一个示例应用程序中使用它)时,将此文件传递给封装程序。
在您的Flex库项目中创建extension.xml文件:
<extension xmlns="http://ns.adobe.com/air/extension/2.5">
<id>com.yourDomain.Vibrate</id>
<versionNumber>1</versionNumber>
<platforms>
<platform name="Android-ARM">
<!-- ... -->
</platform>
</platforms>
</extension>
在<platform> 标记内,现在将设置JAR文件在一个<nativeLibrary>标记中的位置,将初始化器的位置设置为我们在原生代码中设置的位置(回想一下,您在VibrationExtension类中创建了initialize()函数):
<applicationDeployment>
<nativeLibrary>HelloANENative.jar</nativeLibrary>
<initializer>com.yourDomain.example.android.helloANE.extensions.VibrationExtension </initializer>
</applicationDeployment>
您现在已成功创建了您的extension.xml文件,拥有了创建ANE文件所需的所有组件。
目前,封装一个原生扩展需要使用命令行工具adt,向它传递一些参数。我建议在Windows中创建一个批处理脚本(.bat文件),或者在OS X中创建一个bash脚本(通常为.sh文件),您将创建的脚本将允许您在脚本的顶部设置您自己的变量,支持针对您的其他原生扩展项目轻松调整它。
您需要将许多信息插入到脚本中。我将列出这些信息,给出我在我自己的系统上使用的值:
您应该为您自己的系统创建一个类似的值列表。您然后可以使用以下ADT命令引用变量来插入它们:
"%adt_directory%"\adt -package %signing_options% -target ane "%dest_ANE%" "%extension_XML%" -swc "%library_SWC%" -platform Android-ARM bin/library.swf -C "%native_directory%" .
此命令可能看起来很复杂,但只是运行adt并传入签名选项,指定ane作为目标,提供extension.xml文件,指定HelloANELibrary.swc文件,以Android-ARM作为目标平台,以及高速ADT在何处查找原生库文件。
Windows上的compile_ane.bat文件看起来可能类似于:
set adt_directory=C:\Program Files\Adobe Flash Builder 4.5\sdks\4.5.2\bin
set root_directory=C:\Users\dan\Programs
set library_directory=%root_directory%\HelloANELibrary
set native_directory=%root_directory%\HelloANENative
set signing_options=-storetype pkcs12 -keystore "c:\Users\dan\Programs\cert.p12"
set dest_ANE=HelloANE.ane
set extension_XML=%library_directory%\src\extension.xml
set library_SWC=%library_directory%\bin\HelloANELibrary.swc
"%adt_directory%"/adt -package %signing_options% -target ane "%dest_ANE%" "%extension_XML%" -swc "%library_SWC%" -platform Android-ARM -C "%native_directory%" .
在Mac OS X上,该脚本可能类似于:
#!/bin/bash
adt_directory="/Users/Applications/Adobe Flash Builder 4.5/sdks/4.5.2/bin" root_directory=/Users/dan/Programs library_directory=${root_directory}/HelloANELibrary
native_directory=${root_directory}/HelloANENative
signing_options="-storetype pkcs12 -keystore /Users/dan/Programs/cert.p12"
dest_ANE=HelloANE.ane
extension_XML=${library_directory}/src/extension.xml
library_SWC=${library_directory}/bin/HelloANELibrary.swc
"${adt_directory}"/adt -package ${signing_options} -target ane "${dest_ANE}" "${extension_XML}" -swc "${library_SWC}" -platform Android-ARM -C "${native_directory}" .
请注意,我使用了一个p12文件作为签名证书。您可以使用您通常用于签名AIR文件的文件代替。如果您需要创建一个,最简单的方式是在Flash Builder中打开一个Flex或AIR项目,转到Project > Export Release Build。在第二步,您将可以选择使用GUI创建一个证书。
从命令行运行您的脚本,输入您证书的密码,应该还会创建%dest_ANE%文件,它可用于示例应用程序中!
在Flex示例应用程序中使用原生扩展
要完成您项目的设置,需要指定您的应用程序需要使用Android震动控件。在利用设备的其他功能时,请特别注意这个方面——很容易忘记某些功能需要其他权限。AIR应用程序描述符不会使这些条目可用于注释掉的部分中,因为正在使用运行时的功能。如果您忘记了指定合适的权限,原生代码将无法工作,可能将抛出一个与权限相关的异常。(在Android上,此输出可在adb shell中使用logcat轻松看到。
要向AIR应用程序描述符添加权限:
<android>
<manifestAdditions><![CDATA[
<manifest android:installLocation="auto">
<uses-permission android:name="android.permission.VIBRATE"/>
现在项目已配置,您可以向主视图添加一个震动按钮:
s:View标记(类的主体中)之间,添加一个新s:Button。为它提供一个标签 Vibrate using ANE,创建一个新的单击处理函数。Flash Builder应该自动为您创建一个fx:Script标记和ActionScript 3单击处理函数。var v:Vibrate = new Vibrate();
v.isSupported的值,然后调用您的主要震动函数,传入硬编码的值100作为马达应该运行的毫秒数: trace("Is this ANE supported on this platform? " + Vibrate.isSupported);
v.vibrate(100);
Flex应用程序现在应该启动设备,使用ANE提供一个标为Vibrate的按钮。点击此按钮应该会产生来自您的Android设备中的马达的持续100ms的震动!您还将在Flash Builder的控制台视图中注意到以下输出:
[SWF] com.yourDomain.Vibrate - 2,916 bytes after decompression
[SWF] HelloANESample.swf - 2,702,220 bytes after decompression
Is this ANE supported on this platform? True
如果您希望控制震动持续时间,可以添加一个TextInput或数字输入表。只需将我们硬编码的参数100替换为一个全局范围的变量,使用一个控件来设置此变量。现在,编写应用程序的ActionScript 3代码与其他Flex应用程序开发没什么两样。
在本指南中,您了解到AIR原生扩展允许扩展Adobe AIR的功能,为您的应用程序提供访问设备和硬件功能的能力,这些功能无法单独通过运行时API访问。您学习了如何为Android创建原生扩展,可以将这些技能用于其他目标平台。在本例中,您重点学习了使Android设备的震动马达激活指定的持续时间的简单任务,这个示例演示了如何创建并初始化一个原生扩展,以及在您的原生代码和AIR应用程序之间来回传递数据。
为了完成此任务,您:
我们的示例不需要除已编译代码外的任何资产,但是您可能希望您的原生扩展能够访问图像、文件、数据库或配置存储等。这很可能发生,并且需要注意一些移动方面的考虑因素:
FREContext.getResourceId(),传入想要的资源ID(另请参见Oliver Goldman的文章“扩展Adobe AIR”)。您可能将会发现,您的原生扩展必须在原生代码中执行异步任务,您将需要一种方式来在任务完成时将通知传递给您的AIR应用程序。这通过函数 FREContext类中的函数dispatchStatusEventAsync(String code, String level);来完成。例如,以下Java代码告诉一个虚构的原生扩展库,有一个编码为"DATA_CHANGED"的状态事件:
context.dispatchStatusEventAsync("DATA_CHANGED", stringData);
context.addEventListener(StatusEvent.STATUS, onStatus);
...
private function onStatus(e:StatusEvent):void
{
if (e.code == "DATA_CHANGED")
{
var stringData:String = e.level;
// ...
}
}
状态事件提供了一种方便的方式来在原生代码任务的状态上更新您的原生扩展库(进而更新您最终的AIR和Flex应用程序)。
您可以阅读本指南开头的"其他资源"一节中的内容,继续了解原生扩展的知识。这些资源包括Adobe已创建和分发的原生扩展的链接,允许您通过将原生扩展文件放在您的Flex和ActionScript 3应用程序中而扩展AIR的功能。
另外,一定要查阅Adobe AIR开发人员中心中的原生扩展示例。
Tutorials and samples |
AIR blogs |
More |
AIR Cookbooks |
More |