Windows 10 开发 - 生命周期
从历史上看,Windows 的环境允许用户同时运行多个应用程序。用户可以轻松地在不同应用程序之间切换。这种模式并不适用于通常以单个应用程序为中心的手机或平板电脑设备。
Windows 8 应用商店应用程序程序员面临的最大挑战之一是管理和理解应用程序的生命周期。如果您一直在构建 Windows Phone 应用程序,那么其中的大部分内容应该很熟悉。
在 Windows 8 中,操作系统会管理应用程序的生命周期。虽然用户可以终止某个应用程序,但通常情况下,用户会在不主动终止正在运行的应用程序的情况下打开新的应用程序。
适用于 Windows 10 的通用 Windows 平台 (UWP) 解决了这些问题,它为桌面用户提供了一些很酷的功能,使多个应用程序可以以多窗口体验运行。
Windows 应用程序在基本级别上可以处于三种状态,如下所示。
正在运行
已暂停
终止
当用户启动/激活任何应用时,该应用都会进入运行状态。
如果用户不使用应用且应用不再处于前台,则应用可以被暂停。
在暂停状态下,应用可以恢复运行,也可以终止操作系统以回收系统资源。
进程状态转换
了解正在运行的应用中的进程状态转换非常重要。用户首次启动应用程序时,会显示启动画面,然后应用程序开始运行。
该过程可解释如下 −
当应用程序暂停时,您的应用有五秒钟的时间来处理该暂停事件。
当应用程序暂停时,绝对不会运行任何代码,也不会分配任何资源。
当应用程序恢复时,会通知应用程序已恢复。如果您刚从暂停状态恢复,则无需采取任何操作。
在内存压力下,您的应用可能会被终止。
请记住,此时您不会收到通知,因此任何保存操作都必须在进入暂停状态时进行。
当应用在 Running 和 Suspended 状态之间切换时,分别触发暂停和恢复事件。
有时,您需要保存数据。这时,您必须调用如下所示的异步方法。
Application.Current.Suspending += new SuspendingEventHandler(App_Suspending);
async void App_Suspending(Object sender, Windows.ApplicationModel.SuspendingEventArgs e){
// Create a simple setting
localSettings.Values["FirstName"] = fName.Text;
localSettings.Values["LastName"] = lName.Text;
localSettings.Values["Email"] = email.Text;
}
Application.Current.Resuming += new EventHandler<Object>(App_Resuming);
private void App_Resuming(Object sender, Object e){
fName.Text = localSettings.Values["FirstName"];
lName.Text = localSettings.Values["LastName"];
email.Text = localSettings.Values["Email"];
}
让我们研究一个添加控件的示例,如以下给出的 XAML 文件所示。
<Page
x:Class = "UWPLifeCycleDemo.MainPage"
xmlns = "http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x = "http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:local = "using:UWPLifeCycleDemo"
xmlns:d = "http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc = "http://schemas.openxmlformats.org/markup-compatibility/2006"
mc:Ignorable = "d">
<Grid Background = "{ThemeResource ApplicationPageBackgroundThemeBrush}">
<Hub Header = "Details" />
<StackPanel VerticalAlignment = "Top" HorizontalAlignment = "Left"
Margin = "12,64,0,0">
<TextBox Header = "First Name" Text = "{Binding FirstName,
Mode = TwoWay, UpdateSourceTrigger = PropertyChanged}"
Width = "200" />
<TextBox Header = "Last Name" Text = "{Binding LastName, Mode = TwoWay,
UpdateSourceTrigger = PropertyChanged}" Width = "200" />
<TextBox Header = "Email" Text = "{Binding Email, Mode = TwoWay,
UpdateSourceTrigger = PropertyChanged}" Width = "200" />
<Button Margin = "0,12">Submit</Button>
</StackPanel>
</Grid>
</Page>
以下是实现"暂停"和"恢复"事件的 C# 代码。当前数据将存储在本地设置的 suspend 事件 中,然后从本地设置的 resume 事件 中检索数据,如下所示。
using System;
using System.ComponentModel;
using System.Runtime.CompilerServices;
using Windows.UI.Xaml;
using Windows.UI.Xaml.Controls;
namespace UWPLifeCycleDemo {
/// <summary>
/// An empty page that can be used on its own or navigated to within a Frame.
/// </summary>
public sealed partial class MainPage : Page{
var localSettings = Windows.Storage.ApplicationData.Current.LocalSettings;
public MainPage() {
this.InitializeComponent();
Application.Current.Suspending += new SuspendingEventHandler(App_Suspending);
Application.Current.Resuming += new EventHandler<Object>(App_Resuming);
}
async void App_Suspending(Object sender, Windows.ApplicationModel.SuspendingEventArgs e){
// Create a simple setting
localSettings.Values["FirstName"] = fName.Text;
localSettings.Values["LastName"] = lName.Text;
localSettings.Values["Email"] = email.Text;
}
private void App_Resuming(Object sender, Object e){
fName.Text = localSettings.Values["FirstName"];
lName.Text = localSettings.Values["LastName"];
email.Text = localSettings.Values["Email"];
}
}
public abstract class BindableBase : INotifyPropertyChanged {
private string _FirstName = default(string);
public string FirstName {
get { return _FirstName; }
set { Set(ref _FirstName, value); }
}
private string _LastName = default(string);
public string LastName {
get { return _LastName; }
set { Set(ref _LastName, value); }
}
private string _Email = default(string);
public string Email {
get { return _Email; }
set { Set(ref _Email, value); }
}
public event PropertyChangedEventHandler PropertyChanged;
public void RaisePropertyChanged([CallerMemberName]string propertyName = null) {
PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
}
public void Set<T>(ref T storage, T value,
[CallerMemberName()]string propertyName = null){
if (!object.Equals(storage, value)){
storage = value;
RaisePropertyChanged(propertyName);
}
}
}
}
编译并执行上述代码后,您将看到以下窗口。现在输入所需的信息。
我们转到生命周期事件下拉菜单,然后选择已暂停。现在您的应用将被暂停,所需的信息将存储在本地设置中。请参阅下面的屏幕截图。
现在,当您想要恢复应用程序时,请从生命周期事件菜单中选择恢复选项。
现在,您将看到已存储的信息已从本地设置中检索,并且应用程序已恢复到其暂停时的状态。

