Xamarin.Forms 应用生命周期教程
开始演练本教程的前提条件为已成功完成以下教程:
- 生成第一个 Xamarin.Forms 应用快速入门。
- StackLayout教程。
- 输入教程。
在本教程中,你将了解如何执行以下操作:
- 响应应用程序的启动、休眠或恢复。
- 在生命周期状态变化的过程中保存数据。
你将使用 Visual Studio 2019 或 Visual Studio for Mac 创建一个简单的应用程序,演示如何在生命周期状态更改期间保留数据。 以下屏幕截图显示了最终的应用程序:
响应生命周期状态更改
若要完成本教程,应使用 Visual Studio 2019(最新版本),且安装了“使用 .NET 的移动开发”工作负载。 此外,还需要一个匹配的 Mac,用于在 iOS 上生成教程应用程序。 有关安装 Xamarin 平台的信息,请参阅安装 Xamarin。 有关将 Visual Studio 2019 连接到 Mac 生成主机的信息,请参阅通过“与 Mac 配对”进行 Xamarin.iOS 开发。
启动 Visual Studio,新建名为 AppLifecycleTutorial 的 Xamarin.Forms 空白应用。
重要
本教程中的 C# 和 XAML 片段要求将解决方案命名为 AppLifecycleTutorial。 使用不同的名称会导致:将本教程中的代码复制到解决方案中时出现生成错误。
有关创建的 .NET Standard 库的详细信息,请参阅 Xamarin.FormsXamarin.Forms 快速入门的深入探讨中的 Xamarin.Forms 应用程序剖析。
在“解决方案资源管理器”的 AppLifecycleTutorial 项目中,展开 App.xaml,然后双击 App.xaml.cs 将其打开。 然后在 App.xaml.cs 中,更新
OnStart
、OnSleep
和OnResume
重写,如下所示:protected override void OnStart() { Console.WriteLine("OnStart"); } protected override void OnSleep() { Console.WriteLine("OnSleep"); } protected override void OnResume() { Console.WriteLine("OnResume"); }
此代码使用
Console.WriteLine
语句更新应用程序生命周期方法重写,这些语句指示曾调用每个方法的时间:- 应用程序启动时调用
OnStart
方法。 - 应用程序转到后台时调用
OnSleep
方法。 - 应用程序从后台恢复时调用
OnResume
方法。
注意
没有终止应用程序的方法。 正常情况下,应用程序由
OnSleep
方法终止。- 应用程序启动时调用
在 Visual Studio 工具栏中,按“开始”按钮(类似“播放”按钮的三角形按钮),启动所选远程 iOS 模拟器或 Android Emulator 内的应用程序。 应用程序启动时,会调用
OnStart
方法,并且 OnStart 会输出到 Visual Studio“输出”窗口:[Mono] Found as 'java_interop_jnienv_get_object_array_element'. OnStart [OpenGLRenderer] HWUI GL Pipeline
应用程序在后台运行时(点击 iOS 或 Android 上的主页按钮),会调用
OnSleep
方法:[EGL_emulation] eglMakeCurrent: 0x83ee2920: ver 3 0 (tinfo 0x8357eff0) OnSleep [Mono] Image addref System.Runtime.Serialization[0x83ee19c0] -> System.Runtime.Serialization.dll[0x83f57b00]: 2
然后,应用程序从后台恢复时(点击 iOS 上的应用程序图标或点击 Android 上的“概述”按钮,并选择 AppLifecycleTutorial 应用程序)调用
OnResume
方法:Thread finished: <Thread Pool> #5 OnResume [EGL_emulation] eglMakeCurrent: 0x83ee2920: ver 3 0 (tinfo 0x8357eff0)
注意
这些代码块显示了在 Android 上运行应用程序时的示例输出。
在 Visual Studio 中停止应用程序。
有关 Xamarin.Forms 应用生命周期的详细信息,请参阅 Xamarin.Forms 应用生命周期。
跨生命周期状态更改保留数据
Application
子类具有静态 Properties
字典,可用于跨生命周期状态更改存储数据。 该字典使用 string
密钥并存储 object
值。 字典会自动保存到设备中,并在应用程序重启时重新填充。
重要
Properties
字典只能序列化基元类型用于存储。
在本练习中,你将修改应用程序以在后台运行时保留 Entry
中的文本,并在应用程序重启时将文本还原到 Entry
。
在“解决方案资源管理器”的 AppLifecycleTutorial 项目中,展开 App.xaml,然后双击 App.xaml.cs 将其打开 。 然后在“App.xaml.cs”中,删除所有模板代码并替换为以下代码 :
using System; using Xamarin.Forms; namespace AppLifecycleTutorial { public partial class App : Application { const string displayText = "displayText"; public string DisplayText { get; set; } public App() { InitializeComponent(); MainPage = new MainPage(); } protected override void OnStart() { Console.WriteLine("OnStart"); if (Properties.ContainsKey(displayText)) { DisplayText = (string)Properties[displayText]; } } protected override void OnSleep() { Console.WriteLine("OnSleep"); Properties[displayText] = DisplayText; } protected override void OnResume() { Console.WriteLine("OnResume"); } } }
此代码定义
DisplayText
属性和displayText
常数。 当应用程序在后台运行或终止时,OnSleep
方法覆盖会将DisplayText
属性值添加到Properties
字典,对应于displayText
的密钥。 然后,当应用程序启动时,如果Properties
字典包含displayText
密钥,则该密钥的值将还原为DisplayText
属性。重要
在访问密钥之前,请务必检查
Properties
字典是否存在密钥,以防止意外错误。没有必要从
OnResume
方法重载中的Properties
字典还原数据。 这是因为当应用程序在后台运行时,该数据及其状态仍然在内存中。在“解决方案资源管理器”的“AppLifecycleTutorial”项目中,双击“MainPage.xaml”将其打开 。 然后在 MainPage.xaml 中,删除所有模板代码,替换为以下代码 :
<?xml version="1.0" encoding="utf-8"?> <ContentPage xmlns="http://xamarin.com/schemas/2014/forms" xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml" x:Class="AppLifecycleTutorial.MainPage"> <StackLayout Margin="20,35,20,20"> <Entry x:Name="entry" Placeholder="Enter text here" Completed="OnEntryCompleted" /> </StackLayout> </ContentPage>
此代码以声明方式定义页面的用户界面,该界面由
StackLayout
中的Entry
组成。Entry.Placeholder
属性指定首次显示Entry
时显示的占位符文本,并在Completed
事件中注册名为OnEntryCompleted
的事件处理程序。 此外,Entry
具有使用x:Name
属性指定的名称。 该操作使代码隐藏文件能够使用分配给它的名称访问Entry
对象。在“解决方案资源管理器”的“AppLifecycleTutorial”项目中,展开“MainPage.xaml”,然后双击“MainPage.xaml.cs”将其打开 。 然后,在“MainPage.xaml.cs”中,为
OnAppearing
方法添加覆盖,并为该类添加OnEntryCompleted
事件处理程序 :protected override void OnAppearing() { base.OnAppearing(); entry.Text = (Application.Current as App).DisplayText; } void OnEntryCompleted(object sender, EventArgs e) { (Application.Current as App).DisplayText = entry.Text; }
OnAppearing
方法检索App.DisplayText
属性的值,并将其设置为Entry
的Text
属性值。注意
OnAppearing
方法覆盖的执行是在布局ContentPage
后但在其变得可见之前进行的。 因此,这是设置 Xamarin.Forms 视图内容的好地方。当文本在
Entry
中最终确定时,使用返回键执行OnEntryCompleted
方法,Entry
文本存储在App.DisplayText
属性中。在 Visual Studio 工具栏中,按“开始”按钮(类似“播放”按钮的三角形按钮),启动所选远程 iOS 模拟器或 Android Emulator 内的应用程序。
在
Entry
中输入一些文本,并按返回键。 然后,通过点击“开始”按钮以调用OnSleep
方法,在后台运行应用程序。在 Visual Studio 中,停止并重新启动应用程序,然后以前输入到
Entry
的文本将还原:在 Visual Studio 中停止应用程序。
有关将数据持久保存到属性字典的详细信息,请参阅《Xamarin.Forms 应用类》指南中的属性字典。
恭喜!
祝贺你完成了本教程的学习,在本教程中你学习了如何:
- 响应应用程序的启动、休眠或恢复。
- 在生命周期状态变化的过程中保存数据。
后续步骤
若要深入了解使用 Xamarin.Forms 创建移动应用程序的基础知识,请继续学习“本地数据库”教程。
相关链接
你有关于此部分的问题? 如果有,请向我们提供反馈,以便我们对此部分作出改进。