学号:15331334
姓名:徐楚燕
班级:教务4班
作业:实验4
知识点-应用生命周期
应用启动
当启动应用时,会调用 OnLaunched 方法。 向该方法传递LaunchActivatedEventArgs参数
从 LaunchActivatedEventArgs.PreviousExecutionState 获取应用之前的状态,这将返回 ApplicationExecutionState对象。
Suspending (应用暂停)
当用户最小化某个应用时,Windows 会等待数秒,以查看用户是否会切换回该应用。 如果用户在此时间范围内未切换回,并且任何扩展执行、后台任务或活动赞助执行都未处于活动状态,则 Windows 将暂停该应用。 只要应用中不存在任何处于活动状态的扩展执行会话等,该应用也将在出现锁屏界面时暂停。
当暂停应用时,它将调用 Application.Suspending 事件。 Visual Studio 的 UWP 项目模板为在 App.xaml.cs 中称为 OnSuspending 的此事件提供处理程序。 在 Windows 10 版本 1607 之前,要在此处添加用于保存状态的代码。 现在建议在进入后台状态时保存状态,如上所述。
应用终止
当你的应用暂停时,系统会尝试将你的应用及其数据保留在内存中。 但是,如果系统没有资源将你的应用保留在内存中,它将终止你的应用。 应用不会收到它们被终止的通知,所以你只能将应用数据保存在 OnSuspension 事件处理程序中,或者在 EnteredBackground 处理程序中以异步方式保存。
当应用确定它在终止后被激活时,它应该加载它保存的应用程序数据,以使应用处于与其终止之前相同的状态。 当用户切换回已终止的暂停应用时,该应用应该在其 OnLaunched 方法中还原其应用程序数据。 当终止应用时系统不会通知应用,因此在暂停应用之前,你的应用必须保存其应用程序数据并释放独占资源和文件句柄,并且当在终止后又激活应用时还原这些内容。
知识点-应用数据
https://docs.microsoft.com/zh-cn/windows/uwp/app-settings/store-and-retrieve-app-data
应用数据类型
应用数据有两类:设置和文件。
设置
使用设置存储用户首选项和应用程序状态信息。 应用数据 API 使你能够轻松创建和检索设置(我们将在本文的后面部分介绍一些示例)。
下面是可以用于应用设置的数据类型:
UInt8、Int16、UInt16、Int32、UInt32、Int64、UInt64、Single、Double
布尔值
Char16、String
DateTime、TimeSpan
GUID、Point、Size、Rect
ApplicationDataCompositeValue:一组必须按原子方式序列化和反序列化的相关应用设置。 使用复合设置可轻松处理相互依赖的设置的原子更新。 系统会在并发访问和漫游时确保复合设置的完整性。 复合设置针对少量数据进行了优化,如果将它们用于大型数据集,性能可能很差。
本地应用数据
本地应用数据应用于需要在应用会话之间予以保留但不适合于漫游应用数据的任何信息。
检索本地应用数据存储
在读取或编写本地应用数据前,必须检索本地应用数据存储。 若要检索本地应用数据存储,请使用 ApplicationData.LocalSettings 属性获取应用作为 ApplicationDataContainer 对象的本地设置。
使用 ApplicationData.LocalFolder 属性可以获取 StorageFolder 对象中的文件。
使用ApplicationData.LocalCacheFolder 属性来获取保存不包括在备份和还原中的文件的本地应用数据存储中的文件夹。
ApplicationDataContainer.Values类似于一个超大的对象,用键对存储数据。
Windows.Storage.ApplicationDataContainer localSettings =
Windows.Storage.ApplicationData.Current.LocalSettings;
localSettings.Values["exampleSetting"] = "Hello Windows";
嵌套Object作为数值:用 ApplicationDataCompositeValue对象。
标准检索(也就是读取数据):
// Composite setting
Windows.Storage.ApplicationDataCompositeValue composite =
(Windows.Storage.ApplicationDataCompositeValue)localSettings.Values["exampleCompositeSetting"];
if (composite == null) // 先检查键值是否为空
{
// No data
}
else
{
// Access data in composite["intVal"] and composite["strVal"]
}
实验过程
基本需求
原文:
点击checkbox出现横线,挂起并关闭程序,重新启动时,程序显示在Mainpage界面,并且点击的checkbox与对应横线都存在。
在NewPage中,输入数据,挂起并关闭程序,重新启动时,程序显示在 NewPage页面,并且挂起前输入的数据还在。
返回按钮的实现
1.在页面的OnNavigatedTo函数里控制按钮可视性
SystemNavigationManager.GetForCurrentView().AppViewBackButtonVisibility =
AppViewBackButtonVisibility.Visible;
2.在app.xaml.cs里修改OnLanched函数注册BackRequested
Windows.UI.Core.SystemNavigationManager.GetForCurrentView().BackRequested +=
OnBackRequested;
3.在app.xaml.cs里编写OnBackRequested函数
private void OnBackRequested(object sender, Windows.UI.Core.BackRequestedEventArgs e)
{
if (BackRequested != null)
{
BackRequested(this, e);
}
if (!e.Handled)
{
Frame frame = Window.Current.Content as Frame;
if (frame.CanGoBack)
{
frame.GoBack();
e.Handled = true;
}
}
}
CheckBox.IsChecked 和 Line.Visibility 绑定
居然找到一模一样的问题,还是微软社区官方解答,丝毫不用动脑
–答案就在这里–
这次实验终于解决了一个困扰我多时的问题:
有时新建类之后会各种找不到类名,感觉最安全的方法是从一开始就确定好类名,之后不要修改也不要改变命名空间。这样是最安全的。
(好像也不是什么有用的发现……)
是否使用Converter跟Windows系统的版本有关:
If your app is targeted to Windows 10 ver1607(10.0.14393) or later, your code is written in right syntax. The code “as is” would work properly as you expect, because boolean-to-visibility conversion is automatically fulfilled. See footer-note in Data binding overview.
But if your app is targeted to earlier versions (such as 10.0.10586-), you need to define a value-converter class which is to be used in binding for that conversion.
保存程序暂停前的状态并恢复
记录访问页面并在暂停后恢复时重新访问。数据也保存。
保存页面状态
用Frame.GetNavigationState()得到当前页面状态的string。并存入本地数据。
当应用启动时,检查键值,存在则导航至newPage。
One way is to use Frame.SetNavigationState. When you’re on page A, store Frame.GetNavigationState in a static variable which is accessible anywhere in the app.
MyClass.PageANavigationState = Frame.GetNavigationState();
When you’re on E (or whichever page), and you want to clear the navigation stack up to A, use
Frame.SetNavigationState[MyClass.PageANavigationState];
看了一下app.cs, 看起来其实已经处理好了
Onlaunched()
if (e.PreviousExecutionState == ApplicationExecutionState.Terminated)
{
//TODO: 从之前挂起的应用程序加载状态
if (ApplicationData.Current.LocalSettings.Values.ContainsKey("NavigationState"))
{
rootFrame.SetNavigationState((string)ApplicationData.Current.LocalSettings.Values["NavigationState"]);
}
}
private void OnSuspending(object sender, SuspendingEventArgs e)
{
var deferral = e.SuspendingOperation.GetDeferral();
//TODO: Save application state and stop any background activity
// Set this flag - this happens before the page navigatedfrom
IsSuspending = true;
// Get the frame navigation state serialized as a string and save in settings
Frame frame = Window.Current.Content as Frame;
ApplicationData.Current.LocalSettings.Values["NavigationState"] = frame.GetNavigationState();
deferral.Complete();
}
执行,在NewPage的OnNavigatedFrom保存数据时居然出错了:
protected override void OnNavigatedFrom(NavigationEventArgs e) // 从该页面离开时
{
bool suspending = ((App)App.Current).IsSuspending;
if (suspending)
{
// 保存数据
var composite = new ApplicationDataCompositeValue(); //<====这一行出错了
composite["Title"] = Title.Text;
composite["Details"] = Details.Text;
composite["Date"] = DueDatePicker.Date;
ApplicationData.Current.LocalSettings.Values["NewPage"] = composite;
}
// 保存页面状态
ApplicationData.Current.LocalSettings.Values["NavigationState"] = Frame.GetNavigationState();
}
———去掉
ApplicationData.Current.LocalSettings.Values["NavigationState"] = Frame.GetNavigationState();
即可。
存储数据时,
DueDatePicker.Date = (DateTimeOffset)composite["Date"];
Date项不需先转换成string再转换成DateTimeOffset类。
另外也要像上一次那样在Mainpage的构造函数加上
NavigationCacheMode = NavigationCacheMode.Enabled;
来保存缓存状态。
运行截图

本文详细介绍了UWP应用的生命周期,包括启动、暂停及终止的过程,并提供了具体实例代码。同时,还讲解了如何保存和恢复应用状态,以及如何在不同页面间保持数据一致性。


被折叠的 条评论
为什么被折叠?



