
Adobe
当应用程序需要显示通知性消息时, 如果不想打乱用户的工作流程, 片段式窗口可能是合适的解决方案。图 1 中显示的 WordUp 范例应用程序创建具有以下属性的片段窗口:
WordUp 范例演示如何使用以下 Adobe AIR API:

图 1。本范例应用程序显示包含随机消息的片段窗口。
注意: 本范例应用程序按原样提供, 用于教学目的。
若要充分利用本篇文章, 您需要以下软件和文件:
本范例应用程序包括以下文件:
应具备使用 Flex Builder 构建应用程序的一般经验。有关使用此快速入门指南的详细信息, 请参阅用 Flex 构建快速入门范例应用程序。
WordUp 范例应用程序在后台运行, 没有主窗口。当具有随机化间隔的计时器引发时, 应用程序将显示包含随机消息的片段窗口。大约 5 秒之后, 消息到期, 片段窗口自动关闭。
为了检测何时存在用户, 应用程序从 NativeApplication 对象侦听 userIdle 和 userPresent 事件。调度 userIdle 事件时, 消息的到期机制即暂停, 直到下一次 userPresent 事件为止。这会使消息保留在屏幕上, 直到用户有机会阅读这些消息为止。在 NativeApplication.idleThreshold 属性所确定的间隔之内如果没有检测到键盘或鼠标输入, 则调度 userIdle 事件。默认间隔是合理的 5 分钟, 但 WordUp 将该值重置为几秒, 因此可以更轻松地观察到应用程序行为的变化。
若要测试此应用程序, 请启动 WordUp 安装程序文件 (WordUp.air)。在 Windows 中, 此时将在任务栏的通知区域中显示一个系统任务栏图标。在 Mac OS X 中, 此时将在停靠栏图标下出现一个正常的三角形, 显示应用程序正在运行。大约 5 秒之后, 将从屏幕底部弹出第一条消息。随后不久, 这条消息就会消失。如果使计算机保持空闲几秒, 则消息将保持在屏幕上, 直到有鼠标或键盘输入为止, 然后消息还将再保持几秒, 让您有时间阅读消息。
若要退出应用程序, 在 Windows 中请右键单击系统任务栏图标, 并从菜单中选择 Exit WordUp (退出 WordUp)。在 Mac OS X 中请单击并按住停靠栏图标将菜单打开, 然后选择 Quit WordUp (退出 WordUp)。
WordUp 是 ActionScript 项目, 因此直接使用 NativeWindow 类。在 Flex 项目中, 通常使用 mx:Window 类创建窗口。在其它大部分方面, 此处演示的技术同等适用于 ActionScript 和 Flex 项目。
注意: 有关本范例中所使用的非 AIR 所特有的函数和 API 的详细信息, 请参阅《ActionScript 3.0 语言参考》*。
创建无窗口应用程序的第一步是确保由 AIR 自动创建的初始窗口从不可见。有两处可以控制此窗口的可见性。第一处是应用程序描述符文件的 <initialWindow> 元素内。如果在此元素内放置 <visible>true</visible>, 则应用程序启动时窗口可见。控制窗口可见性的另一处是窗口本身的 visible 属性。可以直接设置 visible 属性。在调用窗口的 activate() 方法时, 也会将该属性设置为 true。
注意: 如果要使用 Flex Framework 中的 mx:WindowedApplication 组件来定义初始窗口, 则还必须将该组件的 visible 属性设置为 false。
从不删除由 AIR 添加至初始窗口的主类, 也从不对其进行垃圾回收。如果对于应用程序不需要显示初始窗口, 则可以将该窗口关闭。也不会删除由主类的变量所引用的对象, 除非清除引用。在 WordUp 中, MessageCenter 和 DisplayManager 类由 WordUp 主类中的变量所引用, 因此对这些对象不进行垃圾回收, 即使关闭初始窗口也是如此。
一般最好以某种方式向用户指出有应用程序正在运行, 即使其没有可见窗口也是如此。在 Mac OS X 中, 应用程序的停靠栏图标充当此用途。在 Windows 中, 可以使用系统任务栏图标。当应用程序正在运行时, 停靠栏中会自动出现停靠栏图标, 该图标还提供一个默认菜单用于退出应用程序, 因此 WordUp 不需要更改停靠栏图标的属性。只有在分配了图像后才显示系统任务栏图标。
WordUp 使用静态 NativeApplication.supportsSystemTrayIcon 属性检测其是否正在运行于支持系统任务栏图标的操作系统中。如果是, 则它添加一个工具提示和一个包含退出命令的菜单:
NativeApplication.nativeApplication.icon.bitmaps = icon.bitmaps;
if(NativeApplication.supportsSystemTrayIcon){
var sysTray:SystemTrayIcon =
NativeApplication.nativeApplication.icon as SystemTrayIcon;
sysTray.tooltip = "WordUp";
sysTray.menu = new NativeMenu();
var exitCommand:NativeMenuItem =
sysTray.menu.addItem(new NativeMenuItem("Exit WordUp"));
exitCommand.addEventListener(Event.SELECT, function(event:Event):void{
NativeApplication.nativeApplication.exit();
});
}
在 Mac OS X 中退出命令并非必需, 因为停靠栏图标中自动包括退出应用程序的命令。
为了初始化应用程序逻辑, WordUp 创建一个 DisplayManager 对象 (管理弹出的片段窗口) 和一个新的 MessageCenter 对象 (定期生成包含随机消息的事件):
displayManager = new DisplayManager(); messageCenter = new MessageCenter(); messageCenter.addEventListener(MessageCenter.NEW_MESSAGE, onMessage);
onMessage() 事件处理函数将消息文本传递至显示管理器, 后者创建一个新的消息窗口。
由于不需要由 AIR 创建的初始窗口, 因此将其关闭。将 NativeApplication 对象的 autoExit 属性设置为 false 可以防止关闭最后一个窗口时应用程序终止。
NativeApplication.nativeApplication.autoExit = false; stage.nativeWindow.close();
MessageWindow 类扩展 NativeWindow。构造函数为窗口设置适当的 NativeWindowInitOptions。重要的选项有:
options.type = NativeWindowType.LIGHTWEIGHT; options.systemChrome = NativeWindowSystemChrome.NONE; options.transparent = true;
这些选项所定义的窗口没有系统镶边, 且不出现在 Windows 的任务栏或 Mac OS X 的窗口菜单中。此外, 还将窗口的 alwaysInFront 属性设置为 true, 以使消息出现在其它窗口之上。
为了调节消息窗口的存在期, 窗口从 DisplayManager 对象侦听自定义 lifeTick 事件:
public function lifeTick(event:Event):void{
timeToLive--;
if(timeToLive < 1){
close();
}
}
public override function close():void{
manager.removeEventListener(DisplayManager.LIFE_TICK,lifeTick);
super.close();
}
MessageWindow 类覆盖 close() 方法, 以便在窗口关闭时删除事件侦听器。
WordUp 使用 Screen API 查找用于显示新消息的点。findSpotForMessage() 函数从 Screen.screens 数组中第一个屏幕的右下角开始搜索开放区域。当函数找到开放的位置时, 它就将窗口以动画形式从屏幕底部移动至它所指定的目标。
为了检查在给定位置是否已显示了消息窗口, WordUp 将遍历 NativeApplication.nativeApplication.openedWindows 数组。并测试由所考虑区域定义的矩形是否与由现有消息窗口的边界所定义的矩形相交:
private function isOccupied(testRect:Rectangle):Boolean{
var occupied:Boolean = false;
for each (var window:NativeWindow in
NativeApplication.nativeApplication.openedWindows){
occupied = occupied || window.bounds.intersects(testRect);
}
return occupied;
}
WordUp 使用 NativeApplication 的 userIdle 和 userPresent 事件判断用户是否在主动使用计算机。
NativeApplication.nativeApplication.idleThreshold = idleTime; NativeApplication.nativeApplication.addEventListener(Event.USER_IDLE,onIdle); NativeApplication.nativeApplication.addEventListener(Event.USER_PRESENT,onPresence)
WordUp 根据这些事件暂停或重新启动 DisplayManager 计时器, 该计时器向消息窗口调度 lifeTick 事件:
//计算机空闲时不删除消息
private function onIdle(event:Event):void{
displayManager.pauseExpiration();
trace("Idling.");
}
//返回时让窗口恢复执行到期机制
private function onPresence(event:Event):void{
displayManager.resumeExpiration();
trace("Resuming.");
}
Charles Ward 是一名技术作者, 它喜欢钻研新技术。在之前的 (专业) 职业生涯中, 他曾参与创建开拓性的计算机游戏, 如 Falcon 3.0 和 4.0 以及 Star Trek: A Final Unity。在闲暇时间, Charles 喜欢自由潜水以及和他的孩子们玩耍。