http://bbs.9ria.com/thread-75934-1-1.html
第3回
改变了桌面应用程序的Adobe AIR 2的15项新功能
Adobe AIR 2、以及Flex 4.1/Flash Builder 4.0.1
Adobe AIR(以下简称AIR)是一个在Windows、Mac OS X、Linux乃至Android系统上跨平台运行的应用程序的运行时环境。 AIR包含了能够构建基于Flash和基于Ajax的应用程序的SDK。运用Flex开发,通过Flash Player能使用从Web浏览器端到独立应用程序的众多对象,更进一步地增加了可实现的功能。
□ AIR 2的新功能介绍
Flash Player 10.1增加了许多功能,使我们能开发出形式多样的应用程序。本文将按照以下主题来介绍一下AIR2.0的主要的新功能。
・Web渲染引擎WebKit的增强
【1】HTML5/CSS3的支持
【2】JavaScript处理高速化
・【3】全局错误处理
・系统原生功能的增强使用
【4】原生安装程序
【5】原生进程API
【6】原生文件处理
【7】拖拽远程文件实现文件拷贝
・デバイス連携が強化
【8】大容量存储设备操作
【9】打印机操作
【10】从本地麦克风获取WAVE音频数据
【11】多点触控与触摸手势
・网络功能增强
【12】UDP Socket
【13】TLS/SSL的支持
【14】TCP服务端Socket的支持
【15】DNS客户端
在众多的新功能中,选取了第12点使用UDP广播为例开发简单通讯软件。
□ Flash Builder 4的Eclipse Plugin版和独立安装版
Flash Builder 4的Eclipse Plugin版,不能升级,必须先卸载旧版本再安装新版本。
Flash Builder 4的独立安装版,可以升级。
Web渲染引擎WebKit的增强
□【1】HTML5/CSS3的支持
苹果公司的Safari浏览器(4.0.3版)与WebKit(531.9版)渲染引擎捆绑在了一起。因此,加入了HTML5/CSS3的支持。
使用HTML5开发桌面和iPad的公用库,在PC上利用AIR包装便可无需关心运行环境地进行部署。
□ 【2】JavaScript处理高速化
JavaScript代码的运行速度因SquirrelFish Extreme引擎的升级获得50%的提速。
【3】全局错误处理
获益于全局错误处理功能,在发生未捕获的错误时也能捕捉到它。由此,在发生预期不到的错误时,就能实现显示警告或输出日志等处理了。
该功能也在Flash Player 10.1中获得支持。
对于WindowedApplication(下例中的app)的实例,由于能够获得applicationComplete事件中的loaderInfo信息,在这时就能捕捉到UncaughtErrorEvent的UNCAUGHT_ERROR事件了。
app.addEventListener(FlexEvent.APPLICATION_COMPLETE, applicationCompleteHandler);
private function applicationCompleteHandler(event:FlexEvent):void
{
WindowedApplication(event.target).loaderInfo.uncaughtErrorEvents
.addEventListener(UncaughtErrorEvent.UNCAUGHT_ERROR, unCaughtErrorHandler);
}
private function unCaughtErrorHandler(event:UncaughtErrorEvent):void
{
Alert.show(event.toString(), "Error");
}
系统原生功能的增强使用
□【4】原生安装程序
每个系统都能生成自己的文件安装程序。例如Windows的.exe,Max OS的.dmg以及Linux的.rpm/.deb文件。AIR的运行时环境能根据需要自动安装程序,使我们不必关心运行时的部署问题。
另外,与使用.air文件安装有所不同,增强了在使用原生进程和原生安装文件进行安装的功能。
□ 【5】原生进程API
原生进程API能够启动外部应用程序及进行相应标准输入输出操作。它能连协Windows的Windows Script Hosting、Mac OS X的appleScript,乃至其他能通过命令行启动的应用程序。要使用原生进程API,必须通过原生安装程序来安装。 在NativeProcessStartupInfo类中设置好要启动的应用程序,将它传给NativePross的start方法就能开始运行了。在ProgressEvent、IOErrorEvent的各个事件中,能实现标准输入输出错误处理。 应用程序的退出也能通过NativeProcessExitEvent的EXIT方法获知,因此也可以反映出外部应用程序的运行结果。
□ 【6】原生文件处理
能够打开与应用程序关联的文件。即模拟在Windows等系统中双击打开文件的操作。
调用File类中新增的openWithDefaultApplication方法。在非原生安装程序(即以.air文件)安装的情况下,有些文件类型有运行限制。
□ 【7】拖拽远程文件实现文件拷贝
通过将远程资源文件的URL传递到系统剪贴板,将文件从AIR应用程序中拖拽到桌面等本地文件夹,从而实现简单的文件下载功能。拖拽功能中,使用到了air.desktop包中新增的URLFilePromise方法。
private function fileLabel_mouseDown(event:MouseEvent):void
{
var clipboard:Clipboard = new Clipboard();
if (clipboard.supportsFilePromise)
{
var filePromise:URLFilePromise = new URLFilePromise();
filePromise.request = new URLRequest(http://www.tilfin.com/example.swc);
filePromise.relativePath = "example.swc";
var fileList:Array = new Array(filePromise);
clipboard.setData(ClipboardFormats.FILE_PROMISE_LIST_FORMAT, fileList);
NativeDragManager.doDrag(InteractiveObject(event.target), clipboard);
}
}
该功能因各个系统的支持不同,需要确认Clipboard的supportsFilePromise属性。
□ 【8】大容量存储设备的操作
能够对USB存储卡和闪存盘等外部连接设备进行文件系统操作,并能识别连入和拔出状态。
使用flash.filesystem包中新增的StorageVolumeInfo类(StorageVolumeInfo属性提供单例)。
通过StorageVolumeChangeEvent的STORAGE_VOLUME_MOUNT和STORAGE_VOLUME_UNMOUNT两个事件能识别设备的连入和拔出状态。由StorageVolume对象提供各个设备的信息。
□ 【9】打印机操作
能够分门别类地设置打印相关的各种细节。如PaperSize类设置纸张尺寸,PrintUIOption类设置打印区域,PrintMethod类设置打印形式(Bitmap或Vector形式)。这些新增的类都包含在了flash.pringing包中。
□ 【10】从本地麦克风获取WAVE音频数据
能够实现从连接电脑的麦克风中获取WAVE音频输入,进而进行音效处理、显示均衡器、音谱等非常广泛的功能。 在Microphone类中添加SampleDataEvent的SAMPLE_DATA事件,就能使用event.data.readFloat()方法捕捉到该时点的Sample值。
□ 【11】多点触控与触摸手势
能够在Windows7上处理多点触控,在Windows7和Mac OS X 10.5.3上处理触摸手势。 在Multitouch类中,能够确认运行环境中输入设备的支持状态。在TouchEvent、GestureEvent、PressAndTapGestureEvent、TransformGestureEvent这些事件中,能捕捉到用户的输入。
网络功能增强
□ 【12】UDP Socket
socket一直以来只能通过TCP实现客户端,而这次得到了大幅扩充。通过DatagramSocket类,能使用UDP进行单播、广播(能收能发)和多播(只发不收)。(详情请看下文中的例子)
□ 【13】TLS/SSL的支持
在SecureSocket类中,可与支持TLS/SSL并有可靠有效证书的服务器进行连接和密文通信。
□ 【14】TCP服务端Socket的支持
与UDP相同,TCP也能通过ServerSocket类实现服务端。这是“服务端开发可以用ActionScript来实现”的极其重大的升级。构建成为一个覆盖了从含有SQLite的AIR到服务端逻辑和数据库的基盘。
补充 通过ServerSocket实现了HTTP服务器的“airhttpd”
或许有些自卖自夸,公布了使用ServerSocket实现的HTTP服务器库“airhttpd”。可以参考例子中的Web应用程序。
airhttpd - Project Hosting on Google Code via kwout
□ 【15】DNS客户端
使用新的flash.net.dns包中的DNSResolver类,能实现DNS域名解析。
ARecord:主机的IPv4地址
AAAARecord:主机的IPv6地址
MXRecord:主机的邮件交换记录
PTRRecord:IP地址的主机名
SRVRecord:服务的服务记录
实际练习做一下AIR2的通讯程序
从这里开始,在众多新功能中,我们选择通过使用UDP的广播功能来尝试开发一个简单的通讯程序。开发环境为Flash Builder 4.0.1,SDK是Flex 4.1 + AIR 2.0.2。
图 样例程序的截屏
□ 选出网络接口
接收数据的服务端实现。服务器为检测收到的数据包,需要监视特定的端口或地址。在此由于使用广播发送消息,将监视特定的网络。因此,首先选出对象网络。
通过networkInfo属性能够取得NetworkInfo类的单例。而在findInterfaces方法中,能通过NetworkInterface对象列表取得电脑拥有的所有网络接口。
通过address属性的InterfaceAddress对象列表能够取得NetworkInterface的地址信息。在此,我们从中选出在IPv4中具有广播地址的数据。
public static function getInterfaceAddressesForBind():Array
{
var addresses:Array = new Array();
var netinfo:NetworkInfo = NetworkInfo.networkInfo;
var netifs:Vector.<NetworkInterface> = netinfo.findInterfaces();
for each (var netif:NetworkInterface in netifs) {
for each (var addr:InterfaceAddress in netif.addresses) {
if (addr.ipVersion == IPVersion.IPV4 && addr.broadcast) {
addresses.push(addr);
}
}
}
return addresses;
}
□ 服务端处理和收发数据
接收数据的实现是通过将端口、IP地址传递给bind方法,再调用receive方法。在收到数据时会触发DatagramSocketDataEvent.DATA事件,下例中在socket_dataReceived中改变字符串。
发送数据的实现是对于相同的数据包,在send方法中设定发送数据、对象、长度、目标地址、目标端口并调用。在下例中,为了便于理解广播数据,将其定义在了Byte中。
_socket = new DatagramSocket();
_socket.addEventListener(DatagramSocketDataEvent.DATA, socket_dataReceived);
_socket.bind(_port, "192.168.1.223");
_socket.receive(); …【略】
private function socket_dataReceived(event: DatagramSocketDataEvent):void {
String msg = event.data.readUTFBytes(event.data.bytesAvailable);
…
}
public function sendMessage(msg:String):void {
var data:ByteArray = new ByteArray();
data.writeUTFBytes(msg);
_socket.send(data, 0, 0, "192.168.1.255", _port);
}
具体处理请查看代码。 MessePeer.zip (7.76 KB)
在Flex/AIR上也能开发Android/移动应用程序!
在新功能众多的AIR2中,已能实现绝大多数的桌面应用程序了。更进一步的使用,则是准备好包装了应用程序的各个系统的脚本,从原生进程进行操作等高级应用。
Android用的AIR(Adobe AIR for Android)已经发布了beta版。使用Flex开发面向移动终端的应用程序,将在支持多屏的下一个版本(开发代号:Hero)中获得实现。那就借这个机会接触一下Flex/AIR怎么样?