zoukankan      html  css  js  c++  java
  • 在移动设备应用程序中启用持久化机制

    移动设备设备应用程序的运行经常被其它操作(例如短信、电话或其它移动设备应用程序)中断。通常,当重新启动被打断的应用程序时,用户希望应用程序恢复先前的状态。通过持久化机制,设备可以将应用程序恢复为先前的状态。

    Flex 框架为移动设备应用程序提供两种持久化机制。内存持久化机制用于在用户进行应用程序导航时保存视图数据。会话持久化机制用于在用户退出应用程序后重新启动时恢复数据。由于移动操作系统随时都可能退出应用程序(例如当内存不足时),因此会话持久化机制在移动设备应用程序中非常重要。

    内存持久化

    View 容器通过使用 View.data 属性来支持内存持久化机制。当切换所选部分或者将新视图推送到 ViewNavigator 堆栈而导致现有视图被破坏时,将自动保存现有视图的 data 属性。当控制权返回给该视图并重新实例化和激活该视图时,将恢复该视图的 data 属性。因此,通过内存持久化机制可以在运行时维护视图的状态信息。

    会话持久化

    会话持久化机制在应用程序执行各种操作时保留应用程序状态信息。ViewNavigatorApplication 和 TabbedViewNavigatorApplication 容器通过定义 persistNavigatorState 属性来实现会话持久化机制。将 persistNavigatorState 设置为 true 以启用会话持久化机制。默认情况下,persistNavigatorState 设置为false

    如果启用,会话持久化机制将使用名为 FxAppCache 的本地共享对象将应用程序的状态写入磁盘。应用程序还可以使用 spark.managers.PersistenceManager 的方法将其它信息写入本地共享对象。

    ViewNavigator 会话持久化

    在退出应用程序时,ViewNavigator 容器将其视图堆栈的状态保存到磁盘,以支持会话持久化机制。同时会保存当前视图的 data 属性。

    当重新启动应用程序时,将重新初始化 ViewNavigator 的堆栈,且用户将看到与退出应用程序时相同的视图与内容。由于堆栈中包含每个视图的 data 属性的副本,因此在激活视图时,可以重新创建堆栈中的上一个视图。

    TabbedViewNavigator 会话持久化

    对于 TabbedViewNavigator 容器,在退出应用程序时,会话持久化机制将保存选项卡栏上当前选定的选项卡。选项卡对应于 ViewNavigator 和定义该选项卡的视图堆栈。同时保存的还有当前视图的 data 属性。因此,重新启动应用程序时,活动选项卡和相关联的 ViewNavigator 设置为退出应用程序时的状态。

    注: 对于使用 TabbedViewNavigatorApplication 容器定义的应用程序,仅保存当前 ViewNavigator 的堆栈。因此,重新启动应用程序时,仅恢复当前 ViewNavigator 的状态。

    会话持久化机制数据表示

    Flex 采用的持久化机制没有加密或保护措施。因此,其它程序或用户可以解读持久化数据的存储格式。不要使用此机制持久保存用户凭据等敏感信息。可以选择自行编写可提供更好保护的持久化管理器。有关更多信息,请参阅自定义持久化机制

    使用会话持久化机制

    在以下示例中,将应用程序的 persistNavigatorState 属性设置为 true,以启用会话持久化机制:

    <?xml version="1.0" encoding="utf-8"?>
    <!-- containersmobileSparkSingleSectionPersist.mxml -->
    <s:ViewNavigatorApplication xmlns:fx="http://ns.adobe.com/mxml/2009"
        xmlns:s="library://ns.adobe.com/flex/spark"
        firstView="views.EmployeeMainView"
        persistNavigatorState="true">
        
        <fx:Script>
            <![CDATA[
                protected function button1_clickHandler(event:MouseEvent):void {
                    // Switch to the first view in the section.
                    navigator.popToFirstView();
                }
            ]]>
        </fx:Script>
        
        <s:navigationContent>
            <s:Button icon="@Embed(source='assets/Home.png')" 
                      click="button1_clickHandler(event)"/>
        </s:navigationContent>
    </s:ViewNavigatorApplication>

    此应用程序使用 EmployeeMainView.mxml 作为其第一个视图。EmployeeMainView.mxml 定义 List 控件,您可以使用该控件选择用户名:

    <?xml version="1.0" encoding="utf-8"?>
    <!-- containersmobileviewsEmployeeMainView.mxml -->
    <s:View xmlns:fx="http://ns.adobe.com/mxml/2009" 
        xmlns:s="library://ns.adobe.com/flex/spark" 
        title="Employees">
        <s:layout>
            <s:VerticalLayout paddingTop="10"/>
        </s:layout>
            
        <fx:Script>
            <![CDATA[
                import spark.events.IndexChangeEvent;
    
                protected function myList_changeHandler(event:IndexChangeEvent):void {
                    navigator.pushView(views.EmployeeView,myList.selectedItem);
                }
    
            ]]>
        </fx:Script>
        
        <s:Label text="Select an employee name"/>
        <s:List id="myList"
            width="100%" height="100%"
            labelField="firstName"
            change="myList_changeHandler(event)">
            <s:ArrayCollection>
                <fx:Object firstName="Bill" lastName="Smith" companyID="11233"/>
                <fx:Object firstName="Dave" lastName="Jones" companyID="13455"/>
                <fx:Object firstName="Mary" lastName="Davis" companyID="11543"/>
                <fx:Object firstName="Debbie" lastName="Cooper" companyID="14266"/>
            </s:ArrayCollection>
        </s:List>
    </s:View>

    要查看会话持久化机制,请打开应用程序,然后在 List 控件中选择“Dave”,以导航至 EmployeeView.mxml 视图:

    <?xml version="1.0" encoding="utf-8"?>
    <!-- containersmobileviewsEmployeeView.mxml -->
    <s:View xmlns:fx="http://ns.adobe.com/mxml/2009" 
        xmlns:s="library://ns.adobe.com/flex/spark" 
        title="Employee View">
        <s:layout>
            <s:VerticalLayout paddingTop="10"/>
        </s:layout>
        
        <s:VGroup>
            <s:Label text="{data.firstName}"/>
            <s:Label text="{data.lastName}"/>
            <s:Label text="{data.companyID}"/>
        </s:VGroup>
    </s:View>

    EmployeeView.mxml 视图中将显示有关“Dave”的数据。然后,退出应用程序。重新启动应用程序时,您将再次看到 EmployeeView.mxml 视图中显示与退出应用程序时相同的数据。

    访问本地共享对象中的数据

    本地共享对象中的信息以键:值对的格式保存。PeristenceManager 的方法(如 setPropery() 和 getProperty())根据键在本地共享对象中访问相关联的值。

    您可以使用 setProperty() 方法将自己的键:值对写入本地共享对象。setProperty() 方法具有如下签名:

    setProperty(key:String, value:Object):void

    使用 getProperty() 方法可以访问特定键的值。getProperty() 方法具有如下签名:

    getProperty(key:String):Object

    如果 persistNavigatorState 属性为 true,则在退出应用程序时,持久化管理器自动将两个键:值对保存到本地共享对象:

    • applicationVersion

      应用程序版本,如 application.xml 文件中所述。

    • navigatorState

      导航器的视图状态,对应于当前 ViewNavigator 的堆栈。

    执行手动持久化

    当 persistNavigatorState 属性为 true 时,Flex 将自动执行会话持久化机制。当 persistNavigatorState 属性为 false 时,也仍可以持久保存应用程序数据。在此情况下,请使用 PeristenceManager 的方法来实现自己的持久化机制。

    使用 setProperty() 和 getProperty() 方法,在本地共享对象中写入和读取信息。调用 load() 方法以初始化 PeristenceManager。调用 save() 方法以将任何数据写入磁盘。

    注: 如果 persistNavigatorState 属性为 false,Flex 将不会在退出应用程序时自动保存当前 ViewNavigator 的视图堆栈,也不会在启动应用程序时恢复视图堆栈。

    处理持久化事件

    可以使用移动设备应用程序容器的以下事件来开发自定义的持久化机制:
    • navigatorStateSaving

    • navigatorStateLoading

    您可以通过在 navigatorStateSaving 事件的处理函数中调用 preventDefault() 方法,来取消将应用程序状态保存至磁盘的操作。在 navigatorStateLoading 事件的处理函数中调用 preventDefault() 方法可以取消在重新启动应用程序时加载状态。

    自定义持久化机制

    如果启用会话持久化机制,打开应用程序时,将显示退出该应用程序时所显示的视图。必须在视图的 data 属性或共享对象等其它位置中存储足够多的信息,才能完全恢复应用程序状态。

    例如,恢复的视图可能需要根据视图的 data 属性来进行计算。然后,应用程序必须在重新启动应用程序时进行识别,并执行必要的计算。一种方法是在退出和重新启动应用程序时重写 View 的 serializeData() 和 deserializePersistedData() 方法,以执行自己的操作。

    会话持久化机制支持的内置数据类型

    持久化机制自动支持所有内置数据类型,包括:Number、String、Vector、Object、uint、int 和 Boolean。持久化机制会自动保存这些数据类型。

    会话持久化机制支持的自定义类

    许多应用程序使用自定义类来定义数据。如果自定义类中包含由内置数据类型定义的属性,则持久化机制可以自动保存和加载这些类。但是,必须首先调用 flash.net.registerClassAlias() 方法,向持久化机制注册这些类。通常,您可以在应用程序的 preinitialize 事件中调用此方法,然后初始化持久化存储或将任意数据保存到持久化存储中。

    如果定义复杂的类(即使用非内置数据类型的数据类型的类),则必须将数据转换为受支持的类型,如 String。此外,如果类定义了任何私有变量,则不会自动持久保存这些变量。要在持久化机制中支持复杂的类,该类必须实现 flash.utils.IExternalizable 接口。此接口要求类实现 writeExternal() 和 readExternal() 方法以保存和恢复类的实例。

  • 相关阅读:
    line-height:150%和line-height:1.5的区别
    javascript: with 表单验证
    CSS实现背景透明,文字不透明,兼容所有浏览器
    关于伪类元素:before和:after
    图片预览实例分享
    微信浏览器取消缓存的方法
    学习笔记(四):jQuery之动画效果
    学习笔记(三):jQuery之DOM
    Git 常用命令
    开发规范(三)数据库 By 阿里
  • 原文地址:https://www.cnblogs.com/fuland/p/3629350.html
Copyright © 2011-2022 走看看