wp8.1 Study6: App的生命周期管理

一、概述

  应用程序的生命周期详解可以参照Windows8.1开发中msdn文档http://msdn.microsoft.com/library/windows/apps/hh464925.aspx

应用程序生命周期中有三个状态:Running(运行中),Suspended(挂起,暂停),NotRunning(终止)。如图所示

  那么Suspended与NotRuning有什么不同呢?Suspended意味着当用户切换到另一个程序,你的应用程序很可能将被暂停一段时间,直到用户切换回您的应用程序。在此期间,应用程序处于休眠状态,换句话说,在你的应用程序中的代码不运行,但应用程序的对象和变量,包括框架和状态的BackStack保存在内存中。这允许用户快速并流体的应用程序之间切换。但是,手机的操作系统有可能将选择终止您的应用程序,这意味着系统将从内存中删除与应用程序的对象和变量。这意味着,下次用户启动应用程序,它不会有任何记忆的应用程序的状态,而是创建新的实例。

  什么情况下Phone会暂停应用程序,然后终止程序呢?多数发生在当系统需要应用程序占用的内存时。但如果手机耗尽电池或用户重新启动手机它也可能发生。您的应用程序被暂停或者挂起时,它可能在没有告知的情况下就终止了,进入NotRuning状态,所以我们需要在程序被暂停或者挂起,即Suspended之前,要迅速保存程序当前的状态(包括变量,对象等)。因此,我们需要运用技巧保存状态,下面是3种技巧。

二、掌握SuspensionManager

  这项保存状态工作的大部分将完成在App class。 App class是App.xaml.cs.里面的。你将要重写在App class中要处理您的应用程序的方法。最重要的是重写应用程序每次启动都会调用的OnLaunched()方法和在程序暂停的前一瞬间调用的OnSuspending()方法。(下面的代码因为需要Basic 模板中的一些类,需要添加Basic 模板)

  1、在App.xaml.cs里,找到OnLaunched()方法,在之间添加SuspensionManager的方法。

protected async override void OnLaunched(LaunchActivatedEventArgs e)
        {
#if DEBUG
            if (System.Diagnostics.Debugger.IsAttached)
            {
                this.DebugSettings.EnableFrameRateCounter = true;
            }
#endif

            Frame rootFrame = Window.Current.Content as Frame;

            // 不要在窗口已包含内容时重复应用程序初始化,
            // 只需确保窗口处于活动状态
            if (rootFrame == null)
            {
                // 创建要充当导航上下文的框架,并导航到第一页
                rootFrame = new Frame();
                SuspensionManager.RegisterFrame(rootFrame, "appFrame");//注册,SuspensionManager.RegisterFrame告诉SuspensionManager哪个对象(rootFrame,在我们的应用程序的唯一的框架)将被暂停

                // TODO: 将此值更改为适合您的应用程序的缓存大小
                rootFrame.CacheSize = 1;

                if (e.PreviousExecutionState == ApplicationExecutionState.Terminated)
                {
                    // TODO: 从之前挂起的应用程序加载状态
                    await SuspensionManager.RestoreAsync();
                }

                // 将框架放在当前窗口中
                Window.Current.Content = rootFrame;
            }

            if (rootFrame.Content == null)
            {
                // 删除用于启动的旋转门导航。
                if (rootFrame.ContentTransitions != null)
                {
                    this.transitions = new TransitionCollection();
                    foreach (var c in rootFrame.ContentTransitions)
                    {
                        this.transitions.Add(c);
                    }
                }

                rootFrame.ContentTransitions = null;
                rootFrame.Navigated += this.RootFrame_FirstNavigated;

                // 当导航堆栈尚未还原时,导航到第一页,
                // 并通过将所需信息作为导航参数传入来配置
                // 新页面
                if (!rootFrame.Navigate(typeof(Page1), e.Arguments))
                {
                    throw new Exception("Failed to create initial page");
                }
            }

            // 确保当前窗口处于活动状态
            Window.Current.Activate();
        }

  2、在在App.xaml.cs里,找到OnSuspending()方法,在之间添加SuspensionManager的方法

private async void OnSuspending(object sender, SuspendingEventArgs e)
        {
            var deferral = e.SuspendingOperation.GetDeferral();

            // TODO: 保存应用程序状态并停止任何后台活动
            await SuspensionManager.SaveAsync();//储存状态,应用被挂起时保存frame的当前状态。
            deferral.Complete();
        }

---------------------------------------------------------------------------------------下面的两种方法是利用数据储存方法来保存状态。

二、掌握Windows.Storage.ApplicationData.Current.LocalSettings

  LocalSettings是一个简单的字典,它被保存到应用程序分配的存储区域。还有被称为Windows.Storage.ApplicationData.Current.RoamingSettings,它将数据保存到和所有的设备同步的文件夹类似的存储区域。现在,下面使用LocalSettings。(LocalSetting使用很简单)

1、在valueTextBox_TextChanged事件处理方法,添加以下代码:

private void valueTextBox_TextChanged(object sender, TextChangedEventArgs e)
{
Windows.Storage.ApplicationDataContainer localSettings =
Windows.Storage.ApplicationData.Current.LocalSettings;//创建LocalSetting
localSettings.Values["value"] = valueTextBox.Text;
}

2、在NavigationHelper_LoadState()方法中,添加

private void NavigationHelper_LoadState(object sender, LoadStateEventArgs e)
{
    Windows.Storage.ApplicationDataContainer localSettings =
        Windows.Storage.ApplicationData.Current.LocalSettings;//创建LocalSetting
if (localSettings.Values.ContainsKey("value")) { valueTextBox.Text = localSettings.Values["value"].ToString(); } } 

三、掌握NavigationHelper

  类似LocalSetting,NavigationHelper类运用也同样简单。

1、在NavigationHelper_SaveState()添加

 private void NavigationHelper_SaveState(object sender, SaveStateEventArgs e)
        {
            e.PageState["testvalue"] = valueText.Text;
        }

2、在NavigationHelper_LoadState()添加

private void NavigationHelper_LoadState(object sender, LoadStateEventArgs e)
        {
            if (e.PageState!=null&&e.PageState.ContainsKey("testvalue"))
            {
                valueText.Text=e.PageState["testvalue"].ToString();
            }
        }

以上内容大部分来自Bob的教学视频,如有不对请指出。

时间: 2024-10-27 14:02:21

wp8.1 Study6: App的生命周期管理的相关文章

BEGINNING SHAREPOINT® 2013 DEVELOPMENT 第12章节--SP 2013中远程Event Receivers 远程Event Receivers App级别生命周期

BEGINNING SHAREPOINT? 2013 DEVELOPMENT 第12章节--SP 2013中远程Event Receivers  远程Event Receivers App级别生命周期 微软在新的云App模型中对Apps生命周期的管理投入了大量的投资.

BEGINNING SHAREPOINT® 2013 DEVELOPMENT 第12章节--SP 2013中远程Event Receivers 远程Event Receivers App级别生命周期

BEGINNING SHAREPOINT? 2013 DEVELOPMENT 第12章节--SP 2013中远程Event Receivers  远程Event Receivers App级别生命周期 微软在新的云App模型中对Apps生命周期的管理投入了大量的投资. BEGINNING SHAREPOINT® 2013 DEVELOPMENT 第12章节--SP 2013中远程Event Receivers 远程Event Receivers App级别生命周期

快速构建Windows 8风格应用30-应用生命周期管理

原文:快速构建Windows 8风格应用30-应用生命周期管理 引言 Windows 8 中可以启动多个应用并在其中切换,我们没有必要担心降低系统速度或消耗电池电量. 因为系统会自动挂起(有时会终止)在后台正在运行的应用.设计良好的应用可以由系统挂起.终止以及重新启动,并且这些过程看起来该应用一直在运行中. 一.原理 1.当激活了应用时,无论任何原因,系统都会发送 Activated 事件 2.每当用户切换到桌面或其他应用时,系统都会挂起你的应用,系统会发送Suspending事件 3.每当用户

k8s的Pod状态和生命周期管理

Pod状态和生命周期管理 一.什么是Pod? 二.Pod中如何管理多个容器? 三.使用Pod 四.Pod的持久性和终止 五.Pause容器 六.init容器 七.Pod的生命周期 (1)Pod phase(Pod的相位) (2)Pod的创建过程 (3)Pod的状态 (4)Pod存活性探测 (5)livenessProbe和readinessProbe使用场景 (6)Pod的重启策略 (7)Pod的生命 (8)livenessProbe解析 一.什么是Pod? Pod是kubernetes中你可以

tomcat系列分析之生命周期管理初始化动作

tomcat中有很多组件,要对这些组件进行生命周期的管理非常困难,tomcat中采用的是抽象出一个生命周期管理接口,然后所有的组件都实现该接口,当父组件启动时,同事负责将子组件启动起来,从而完成整tomcat的初始.启动.结束等动作. 来看下tomcat启动的过程,首先构造Bootstrap类,调用其中的init方法,完成类加载器的初始化,方便后面加载类使用,然后调用其中的load方法,实际上tomcat真正的启动动作是由Catalina类完成的.而这其中在BootStrap中调用Catalin

Siemens PLM TeamCenter 9.1生命周期管理软件

Siemens PLM TeamCenter 9.1生命周期管理软件Teamcenter 在构建时充分考虑了可扩展性. 无论是需要小规模部署来支持单个站点的小型团队,还是拥有遍布全球的众多站点以及复杂供应链的大型企业,或者介于其间的任何公司,Teamcenter 灵活的体系架构都能满足您当前的业务需求,并能随着贵公司的增长而继续保持出色表现. 下载内容包括: Siemens PLM TeamCenter 9.1 32和64位 为多国语言版本 Disc3 和 Disc4安装包 Teamcenter

Java实现生命周期管理机制

先扯再说 最近一直在研究某个国产开源的MySQL数据库中间件,拉下其最新版的代码到eclipse后,启动起来,然后做各种测试和代码追踪:用完想要关闭它时,拉出它的STOP类想要运行时,发现这个类里赫然只写以下几行代码,于是我感觉瞬间受到了很多伤害. public static void main(String[] args) { System.out.println(new Date() + ",server shutdown!"); } 这个中间件启动和运行的时候,开启了监听,启动着

6、Khala的登录生命周期管理

khala能够对设备进行生命周期管理,并提供了与生命周期相关的接口,用户只需在具体的设备类型实现类中重写这些生命周期接口,即可享受khala对于生命周期管理的同时定制与业务相关的操作.具体接口解释如下: onLoginCheckMsg(): 进行登录检查,在此可以通过查询DB等方式检查登录设备账号是否合法,可以为连接设备设置设备ID(此ID必须唯一,将被视为设备key,若出现重复将执行onLoginFailureMsg,若未设置将以临时ID值作为ID key),若账号检查失败,设置失败回复消息并

[转载]DevOps建立全生命周期管理

全生命周期管理(ALM)领域作为企业DevOps实践的总体支撑,应该说是DevOps领域中最为重要的实践领域,也是所有其他实践的基础设施.现在很多企业都非常重视CI/CD自动化工具的引入和推广,但是对ALM的建设的重视程度并不够.CI/CD的火爆很大程度上是被Docker和DevOps的热潮带动的,但CI/CD自动化只是提升团队效率的一个环节,如果没有ALM工具的支撑,CI/CD也只是空中楼阁,无法起到整体优化团队工作效率的作用,甚至局部的效率提高还会造成团队的不适应甚至抵触.如果管理者看不到自