从历史上看,Windows具有环境,用户可以同时运行多个应用程序.用户可以轻松切换不同的应用程序.此模型不适用于通常以单一应用程序为重点的手机或平板电脑设备.
Windows 8商店应用程序员面临的最重要挑战之一是管理和理解应用程序生命周期如果你一直在构建Windows手机应用程序,那么大部分都是熟悉的.
在Windows 8下,操作系统管理应用程序的生命周期,当用户可以终止应用程序时,通常用户打开新的应用程序而不会有意识地终止正在运行的应用程序.
通用Windows平台(UWP)for Windows 10解决了这些问题,为桌面用户提供了一些很酷的东西,以便多个应用程序可以运行多窗口体验.
Windows应用程序可以在基本级别存在三种状态,如下所示.
正在运行
暂停
终止
当用户启动/激活y应用程序,然后它进入运行状态.
如果用户不使用它,则可以暂停应用程序不再在前台.
从Suspended状态,应用程序可以恢复该应用程序或终止操作系统以回收系统资源.
了解正在运行的应用程序中的流程状态转换非常重要.当用户首次启动应用程序时,会显示启动画面,然后应用程序开始运行.
该过程可以解释如下 :
当应用程序是暂停,你的应用程序有5秒钟来处理暂停的事件.
当应用程序暂停时,绝对没有代码运行且没有分配资源.
当它恢复时,会通知应用程序它已恢复.如果您来自暂停状态,则无需采取任何措施.
在内存压力下,您的应用程序可能会被终止.
请记住,此时您不会收到通知,所以当您进入暂停的应用程序状态时,您必须执行任何保存.
当应用程序在正在运行和暂停状态之间来回转换时,请暂停和分别恢复事件.
有时,您需要保存数据.然后你必须调用异步方法,如下所示.
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); } } } }
编译执行上述代码时,您会看到以下窗口.现在写下所需的信息.
我们去吧生命周期事件下拉菜单,然后选择暂停.现在您的申请将被暂停,所需信息将存储在本地设置中.请参阅下面给出的屏幕截图.
现在,当你想要恢复您的应用程序,请从生命周期事件菜单中选择恢复选项.
现在您将看到从本地设置中检索存储的信息,并且应用程序恢复到与其挂起的相同状态./p>