跨生命周期状态更改保留数据

Xamarin.Forms 的 Application 基类自带静态 Properties 字典,专门用于跨应用生命周期保存简单数据。

  • 字典采用 string 作为键,object 作为值。
  • 数据会自动持久化保存到设备本地,应用重启后可以读取恢复。
  • 适合存储少量简单配置、文本状态;不适合存大量数据、图片、复杂对象。

修改 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字典
            Properties[displayText] = DisplayText;
        }

        protected override void OnResume()
        {
            Console.WriteLine("OnResume");
        }
    }
}
Code language: PHP (php)

代码说明

  1. 定义常量 displayText 作为字典的key,避免硬编码字符串出错。
  2. OnStart:应用首次启动触发;判断字典中是否存在key,存在则读取赋值给属性。
  3. OnSleep:应用退到后台、即将被系统回收时触发,在这里保存状态
  4. OnResume:应用从后台切回前台;此时数据还在内存,不需要从Properties重新加载。重要:读取前一定要用 ContainsKey 判断key是否存在,防止空引用异常。

修改 MainPage.xaml

打开 MainPage.xaml,替换全部代码:

<?xml version="1.0" encoding="utf-8"?>
<ContentPage xmlns="[http://xamarin.com/schemas/2014/forms](http://xamarin.com/schemas/2014/forms)"
             xmlns:x="[http://schemas.microsoft.com/winfx/2009/xaml](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>
Code language: HTML, XML (xml)

页面包含一个输入框Entry,绑定Completed回车完成事件。

修改 MainPage.xaml.cs

打开后台代码文件,添加 OnAppearing 重写方法和 OnEntryCompleted 事件:

protected override void OnAppearing()
{
    base.OnAppearing();
    // 页面显示时,读取App全局保存的文本,赋值给输入框
    entry.Text = (Application.Current as App).DisplayText;
}

void OnEntryCompleted(object sender, EventArgs e)
{
    // 回车确认输入,将输入框文本存入App全局属性
    (Application.Current as App).DisplayText = entry.Text;
}
Code language: JavaScript (javascript)

代码说明

  • OnAppearing:页面即将显示时执行,读取App中保存的文本,回填到Entry输入框。
  • OnEntryCompleted:按下键盘回车触发,把输入框内容存入App的DisplayText属性。
  • 当App进入后台,OnSleep会自动把该属性写入Properties持久化存储。

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注