[转] [Flash/Flex] Flex框架上的RIA开发现场-第3回 Adobe AIR 2的15项新功能

[转] [Flash/Flex] Flex框架下的RIA开发现场--第3回 Adobe AIR 2的15项新功能
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%的提速。


[转] [Flash/Flex] Flex框架上的RIA开发现场-第3回 Adobe AIR 2的15项新功能



【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

[转] [Flash/Flex] Flex框架上的RIA开发现场-第3回 Adobe AIR 2的15项新功能




□ 【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。

[转] [Flash/Flex] Flex框架上的RIA开发现场-第3回 Adobe AIR 2的15项新功能


图 样例程序的截屏
□ 选出网络接口

    接收数据的服务端实现。服务器为检测收到的数据包,需要监视特定的端口或地址。在此由于使用广播发送消息,将监视特定的网络。因此,首先选出对象网络。
    通过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怎么样?