Windows 10 开发 – 生命周期
Windows 10 开发 – 生命周期
从历史上看,Windows 具有用户可以同时运行多个应用程序的环境。用户可以轻松地在不同的应用程序之间切换。此模型不适用于手机或平板电脑设备,因为这些设备的使用通常侧重于单一应用程序。
Windows 8 应用商店应用程序程序员面临的最重大挑战之一是管理和理解应用程序生命周期。如果您一直在构建 Windows 手机应用程序,那么您应该很熟悉其中的大部分内容。
-
在 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>
下面给出了实现 Suspend 和 Resume 事件的 C# 代码。当前数据将存储在本地设置中的挂起事件中,然后数据将在恢复事件中从本地设置中检索,如下所示。
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); } } } }
上述代码编译执行后,会看到如下窗口。现在编写所需的信息。
让我们转到Lifecycle Events 下拉菜单并选择paused。现在您的应用程序将被暂停,所需的信息将存储在本地设置中。请参阅下面给出的屏幕截图。
现在,当您想要恢复应用程序时,请从生命周期事件菜单中选择恢复选项。
现在您将看到存储的信息是从本地设置中检索的,并且应用程序恢复到挂起时的相同状态。