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 = ; 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();
}
}
四、Resumming事件
Resumming事件在APP.xaml.cs中,当挂起后,再点进程序时发生。
如:
this.Resuming += OnResuming;
....... void OnResuming(object sender, object e)
{
TimeSpan elapsedTime = DateTimeOffset.Now - this.suspensionTime; double elapsedMilliseconds = elapsedTime.TotalMilliseconds; decimal elapsedDecimalSeconds =
(decimal)Math.Round(elapsedMilliseconds / 1000.0, ); Data.Value += elapsedDecimalSeconds;
}
以上内容大部分来自Bob的教学视频,如有不对请指出。
wp8.1 Study6: App的生命周期管理的更多相关文章
- Castle IOC容器组件生命周期管理
主要内容 1.生命处理方式 2.自定义生命处理方式 3.生命周期处理 一.生命处理方式 我们通常创建一个组件的实例使用new关键字,这样每次创建出来的都是一个新的实例,如果想要组件只有一个实例,我们会 ...
- Windows 8 动手实验系列教程 实验5:进程生命周期管理
动手实验 实验5:进程生命周期管理 2012年9月 简介 进程生命周期管理对构建Windows应用商店应用的开发者来说是需要理解的最重要的概念之一.不同于传统的Windows应用(它们即使在后台仍然继 ...
- 快速构建Windows 8风格应用30-应用生命周期管理
原文:快速构建Windows 8风格应用30-应用生命周期管理 引言 Windows 8 中可以启动多个应用并在其中切换,我们没有必要担心降低系统速度或消耗电池电量. 因为系统会自动挂起(有时会终止) ...
- Akka(2):Actor生命周期管理 - 监控和监视
在开始讨论Akka中对Actor的生命周期管理前,我们先探讨一下所谓的Actor编程模式.对比起我们习惯的行令式(imperative)编程模式,Actor编程模式更接近现实中的应用场景和功能测试模式 ...
- BEGINNING SHAREPOINT® 2013 DEVELOPMENT 第12章节--SP 2013中远程Event Receivers 远程Event Receivers App级别生命周期
BEGINNING SHAREPOINT® 2013 DEVELOPMENT 第12章节--SP 2013中远程Event Receivers 远程Event Receivers App级别生命周期 ...
- npm scripts的生命周期管理
我们平时阅读一些开源项目,可能会发现有些项目的package.json里的scripts区域定义的脚本很复杂,令人眼花缭乱. 其实这些脚本是有规律可循的.让我们从最简单的一个例子开始学习. 新建一个空 ...
- k8s的Pod状态和生命周期管理
Pod状态和生命周期管理 一.什么是Pod? 二.Pod中如何管理多个容器? 三.使用Pod 四.Pod的持久性和终止 五.Pause容器 六.init容器 七.Pod的生命周期 (1)Pod p ...
- akka-typed(1) - actor生命周期管理
akka-typed的actor从创建.启用.状态转换.停用.监视等生命周期管理方式和akka-classic还是有一定的不同之处.这篇我们就介绍一下akka-typed的actor生命周期管理. 每 ...
- 从大厂DevOps工具链部署,看现代产品的生命周期管理
目录 1. 认识DevOps 1.1. DevOps工具链 1.2. CI 持续集成(Continuous Integration) 1.3. CD(持续交付 & 持续部署) 1.4. Agi ...
随机推荐
- mysql ERROR 1044 (42000): Access denied for user ''@'localhost' to database
新安装的mysql密码是空的. ./mysql -u root -p use mysql SELECT `Host`,`User` FROM user; UPDATE user SET `Host` ...
- Linux上安装Mysql后除了本机其他机器不能访问的问题(zhuan)
http://blog.sina.com.cn/s/blog_a338027c0101esbs.html http://niutuku.com/tech/Mysql/237638.shtml http ...
- 转 java int与Integer的区别
int是java提供的8种原始数据类型之一, Java为每个原始类型提供了封装类,Integer是java为int提供的封装类. int 是基本类型,Integer是引用类型. java.lang.I ...
- C# Socket编程(5)使用TCP Socket
TCP 协议(Transmission Control Protocol,传输控制协议)是TCP/IP体系中面向连接(connection oriented)的传输层(transport layer) ...
- SCCM日志存放路径
sccm有一些比较重要的日志大家可能经常需要查看.下面是一些比较常用的日志文件的存放位置. 客户端日志文件: 日志位于服务器端 SMS_CCM\Logs 文件夹中 日志位于客户端 %Windir%\S ...
- Android 开源简单控件
Android开源系列分类 查看 CircleImageView 自定义圆形控件的使用 添加依赖 ‘de.hdodenhof:circleimageview:2.1.0' 作用:无论你设置的图片是什么 ...
- FCKeditor jsp配置
FCKeditor jsp配置 FCKeditor是sourceforge.net上面的一个开源项目,主要是实现在线网页编辑器的功能,可以让web程序拥有如MS Word这样强大的编辑功能.官方网站为 ...
- 安装Ubuntu Linux系统时硬盘分区最合理的方法
无论是安装Windows还是Linux操作系统,硬盘分区都是整个系统安装过程中最为棘手的环节,网上的一些Ubuntu Linux安装教程一般都是自动分区,给初学者带来很大的不便,下面我就根据多年来在合 ...
- jQuery 2.0.3 源码分析 Deferrred概念
转载http://www.cnblogs.com/aaronjs/p/3348569.html JavaScript编程几乎总是伴随着异步操作,传统的异步操作会在操作完成之后,使用回调函数传回结果,而 ...
- jquery iframe高度自适应
$(document).ready(function () { $("#test").load(function () { var thisheight = $(this).con ...