
高级技术文档撰写工程师
Adobe
本范例应用程序可读写与其位置和大小相关的数据以及保存日期。另外, 还会在应用程序打开时, 根据这些数据确定窗口位置。具体而言, 本范例应用程序将演示 Adobe AIR 的以下功能:

图 1。通过本范例应用程序可以指定 XML 首选参数。
注意: 本范例应用程序按原样提供, 用于教学目的。
若要充分利用本篇文章, 您需要以下软件和文件:
本范例应用程序包括以下文件:
应具备使用 Flex Builder 或 Flex SDK 构建应用程序的一般经验。有关使用此快速入门指南的详细信息, 请参阅用 Flex 构建快速入门范例应用程序。
本应用程序可读写与其位置和大小相关的数据以及保存日期。另外, 还会在应用程序打开时, 根据这些数据确定窗口位置。首选参数保存在包含 XML 数据的文本文件中。应用程序在读取时将这些数据转换为 XML 对象, 在写入时将 XML 数据转换为文本。若要测试此应用程序, 请按照以下步骤操作:
注意: 对于文件的 MXML 代码所使用的全部 Flex 组件, 本文将不一一介绍。有关详细信息, 请参阅《Flex 3 语言参考》*。
appCompleteHandler() 方法初始化 prefsFile File 对象, 将其指向预定义的路径, 然后调用 readXML() 方法, 该方法读取数据:
prefsFile = File.applicationStorageDirectory;
prefsFile = prefsFile.resolvePath("preferences.xml");
readXML();
File.applicationStorageDirectory 指向 AIR 应用程序的存储目录, 该目录的定义对于每个 AIR 应用程序都是独一无二的。
appCompleteHandler() 方法还设置事件处理函数, 用于响应窗口的关闭 (此时将首选参数数据保存至文件):
stage.nativeWindow.addEventListener(Event.CLOSING, windowClosingHandler);
readXML() 方法设置 File 对象和 FileStream 对象。调用 open() 方法时将 fileMode 参数设置为 FileMode.READ, 这样 FileStream 对象就可以从文件中读取数据:
stream = new FileStream(); stream.open(prefsFile, FileMode.READ);
stream 对象的 open() 方法同步打开文件, 并开始将数据读入读取缓冲区。
processXMLData() 事件方法处理 XML 数据, 然后关闭文件。FileStream 对象的 bytesAvailable 属性是读取缓冲区中的字节数, 即 (从同步读取文件开始) 来自文件的所有字节:
prefsXML = XML(stream.readUTFBytes(stream.bytesAvailable)); stream.close();
application.xml 文件定义应用程序的属性 (property), 其中将 initialWindow 属性 (property) 的 visible 属性 (attribute) 设置为 false。使窗口可见之前调整窗口大小并将其重新定位。
Stage 对象的 window 属性包含 AIR 窗口的属性。
processXMLData() 方法根据 (从首选参数文件读入的) XML 首选参数对象中的数据调整窗口大小并将其重新定位:
stage.nativeWindow.x = prefsXML.windowState.@x; stage.nativeWindow.y = prefsXML.windowState.@y; stage.nativeWindow.width = prefsXML.windowState.@width; stage.nativeWindow.height = prefsXML.windowState.@height;
注意: 此段代码示例使用 E4X 表示法, 该表示法是在 ActionScript 3.0 中引入的。例如, prefsXML.windowState.@x 是 prefsXML XML 对象的 windowState 属性 (property) 的 x 属性 (attribute) 值。有关详细信息, 请参阅《ActionScript 3.0 编程》一书的处理 XML* 一章。
readXML() 方法在 processXMLData() 方法返回之后使窗口可见:
stage.nativeWindow.visible = true;
writeXMLData() 将 XML 数据转换为字符串, 向字符串的开头添加 XML 声明, 并将每行结尾字符替换为特定于平台的每行结尾字符 (由 AIR File.lineEnding 常量表示):
var outputString:String = '<?xml version="1.0" encoding="utf-8"?>\n'; outputString += prefsXML.toXMLString(); outputString = outputString.replace(/\n/g, File.lineEnding);
然后设置 FileStream 对象, 并使用该对象写入数据。注意, 在 open() 方法中指定 FileMode.WRITE 作为 fileMode 参数。这指定 FileStream 对象可以写入文件 (并将在写入之前截断任何现有数据):
stream = new FileStream(); stream.open(prefsFile, FileMode.WRITE);
接下来, 调用 writeUTFBytes() 方法, 该方法 (以 UTF-8 数据的形式) 将 XML 数据的字符串版本写入文件:
stream.writeUTFBytes(outputString);
由于已经 (使用 open() 方法) 为同步操作打开过此文件, 并且 Window 对象的 closing 事件的事件处理函数内包括了 write 方法, 因此文件写入将在窗口 (和应用程序) 实际关闭之前完成。本应用程序使用同步读写操作, 因为 XML 首选参数文件相对较小。如果要异步写入文件, 则要取消 closing 事件, 并通过在 FileStream 对象所调度的 outputProgress 事件的事件处理函数中调用 NativeApplication.nativeapplication.exit() 方法, 显式关闭应用程序。