
高级技术文档撰写工程师
Adobe
图 1 中所示的 StartupOptions 范例应用程序演示了启动 AIR 应用程序时的以下选项:

图 1. 本范例应用程序展示如何使用各个应用程序启动选项。
注意: 本范例应用程序按原样提供, 仅供教学之用。
若要充分利用本篇文章, 您需要以下软件和文件:
如果您使用 Flex Builder, 则必须使用 Flex Builder 3.0.2 或更高版本, 且必须将 Flex Builder 配置为使用 Flex SDK 3.3 或更高版本。
本范例应用程序包括以下文件:
应具备使用 Flex Builder 或 Flex SDK 构建应用程序的一般经验。有关使用此快速入门指南的详细信息, 请参阅用 Flex 构建快速入门范例应用程序。
若要测试此应用程序, 请按照以下步骤操作:
每次调用应用程序时, InvokeEvent 日志都会提供 InvokeEvent 事件的详细信息 (本文稍后介绍)。
此应用程序将“foo”文件扩展名作为注册文件类型。
这样便保存了类型为“foo”的文件。
系统登录时启动应用程序。
注意: 本文没有逐一介绍文件的 MXML 代码中用到的所有 Flex 组件。有关详细信息, 请参阅《Flex 3 语言参考》。
该应用程序的应用程序描述符文件 StartupOptionsFlex-app.xml 中包括 fileType 元素。此元素用于为可与本应用程序关联的文件类型定义各种选项:
<fileType> <name>AIR.sample.file</name> <extension>foo</extension> <description>AIR start-up sample application file</description> <contentType>text/plain</contentType> <icon> <image16x16>icons/TestDocument_16.png</image16x16> <image32x32>icons/TestDocument_32.png</image32x32> <image48x48>icons/TestDocument_48.png</image48x48> <image128x128>icons/TestDocument_128.png</image128x128> </icon> </fileType>
这样便将应用程序注册为打开具有“foo”文件扩展名的文件的默认应用程序。操作系统使用 description 文本来描述“foo”文件 (如果将 AIR 应用程序设置为默认应用程序)。contentType 元素定义文件的 MIME 类型。(在本应用程序中, 所用文件是一个纯文本文件。)icon 元素定义用作“foo”文件图标的 PNG 文件。 (这些 PNG 文件包括在源目录中, 必须打包到 AIR 文件中。)
该应用程序的用户界面包括“Register application to open foo files” (注册应用程序以打开 foo 文件) 复选框。MXML 主文件的 init() 方法用于检查应用程序是否已注册为 foo 扩展名的默认应用程序。 如果是, 它会选中并禁用该复选框:
if (nativeApplication.isSetAsDefaultApplication("foo"))
{
cbFileReg.selected = true;
cbFileReg.enabled = false;
}
如果该应用程序不是 foo 文件的默认处理程序, 则 setFileRegistration() 方法会设置 (或删除) 该应用程序, 防止其成为 foo 文件处理程序, 以此响应用户单击“Register application to open "foo" files” (注册应用程序以打开“foo”文件)复选框:
if (cbFileReg.selected)
{
nativeApplication.setAsDefaultApplication("foo");
}
else
{
nativeApplication.removeAsDefaultApplication("foo");
}
用户安装 AIR 应用程序时, 如果没有其他文件注册为处理具有“foo”扩展名的文件, AIR 应用程序将自动成为默认的“foo”文件处理程序。
setStartup() 方法用于处理“Start at login” (登录时启动)(cbStartAtLogin) 复选框的更改事件。 它会根据复选框设置来设置 NativeApplication 对象的 startAtLogin 属性。
nativeApplication.startAtLogin = cbStartAtLogin.selected;
将 startAtLogin 属性设置为 true 时, 应用程序将在用户登录操作系统时自动启动。我们建议为用户提供一个选项, 由用户决定是否让您的应用程序在他们登录时启动 (如果应用程序有这种功能)。
就其本质而言, foo 文件格式是使用“foo”文件扩展名的文本文件。newFile() 方法让用户为文件选择路径:
private function newFile():void
{
file.browseForSave("Save a document.");
file.addEventListener(Event.SELECT, saveFile);
}
用户选择文件路径后, saveFile() 方法便将文件保存到所选位置。文件数据作为 UTF 编码的文本文件写入。文件内容基于 fileContents TextInput 对象内的文本。
private function saveFile(event:Event):void
{
if (file.extension != "foo")
{
file = file.parent.resolvePath(file.name + ".foo");
}
var stream:FileStream = new FileStream();
stream.open(file, FileMode.WRITE);
stream.writeUTFBytes(fileContents.text);
stream.close();
currentFile.text = file.nativePath;
}
init() 函数负责设置 InvokeEvent 事件的事件处理函数:
nativeApplication.addEventListener(InvokeEvent.INVOKE, invokeHandler);
InvokeEvent 处理函数 (invokeHandler()) 在发生应用程序调用时, 根据 InvokeEvent 对象的属性写入信息。
log.text += new Date().toTimeString() + ": InvokeEvent.reason == " + event.reason + "\n";
log.text += " InvokeEvent.arguments.length == " + event.arguments.length + "\n";
for (var i:int = 0; i < event.arguments.length; i++)
{
log.text += " InvokeEvent.arguments[" + i + "] == " + event.arguments[i] + "\n";
}
if (event.arguments.length > 0)
{
openFile(event.arguments[0]);
}
数据显示在 log 文本字段中。如果应用程序是在用户双击 AIR 应用程序图标时启动的, InvokeEvent 日志将显示以下信息:
InvokeEvent.reason == standard InvokeEvent.arguments.length == 0
如果应用程序是在用户登录操作系统时自动启动的, InvokeEvent 日志将显示以下信息:
InvokeEvent.reason == login InvokeEvent.arguments.length == 0
如果应用程序是在用户双击 foo 文件 (文件扩展名为“foo”的文件)时启动的, InvokeEvent 日志将显示以下信息:
InvokeEvent.reason == standard
InvokeEvent.arguments.length == 1
InvokeEvent.arguments[0] == [file path]
在最后一种情形中, 即如果应用程序是由用户的双击文件操作调用的, 操作系统会将文件路径以参数形式传递给 AIR 应用程序。NativeApplication 对象中 arguments 数组的第一个元素即是文件路径。openFile() 方法使用此信息打开文件, 并显示 fileContents 对象中的文件内容:
itemFileOpened.enabled = true; currentFile.text = path; file = new File(path); var stream:FileStream = new FileStream(); stream.open(file, FileMode.READ); fileContents.text = stream.readUTFBytes(stream.bytesAvailable); stream.close();