.NET Multi-platform App UI (.NET MAUI) 应用生命周期

.NET Multi-platform App UI (.NET MAUI) 应用通常有四种执行状态:“未运行”、“运行中”、“已停用”和“已停止”。 当应用从未运行状态转换为运行状态、从运行状态转换为已停用状态、从已停用状态转换为已停止状态、从已停止状态转换为运行状态,以及从已停止状态转换为未运行状态时,.NET MAUI 会引发 Window 类的跨平台生命周期事件。

下图显示了 .NET MAUI 应用生命周期的概述:

在此图中,灰色椭圆表示应用未加载到内存中。 浅蓝色椭圆表示应用在内存中。 圆弧上的文本指示 .NET MAUI 引发的并且向正在运行的应用提供通知的事件。

应用的执行状态取决于应用的历史记录。 例如,首次安装应用或启动设备时,可以将应用视为“未运行”。 启动应用后,将引发 Created 与 Activated 事件,并且应用处于“运行中”状态。 如果其他应用窗口获得焦点,则会引发 Deactivated 事件并且应用处于“已停用”状态。 如果用户切换到其他应用或返回到设备的主屏幕,以便应用窗口不再可见,则会引发 Deactivated 与 Stopped 事件,并且应用处于“已停止”状态。 如果用户返回到应用,则会引发 Resuming 事件,并且应用处于“运行中”状态。 或者,应用在运行时可能会由用户终止。 在这种情况下,应用处于“已停用”状态,然后处于“已停止”状态,将引发 Destroying 事件,并且应用处于“未运行”状态。 同样,设备可能会因资源限制而停止,进而将应用终止,此时会引发 Destroying 事件并且应用处于“未运行”状态。

此外,当引发平台生命周期事件时,.NET MAUI 会使应用得到通知。 有关详细信息,请参阅平台生命周期事件

跨平台生命周期事件

Window 类定义以下跨平台生命周期事件:

展开表

事件描述采取的操作
Created创建本机窗口后将引发此事件。 此时,跨平台窗口将具有本机窗口处理程序,但该窗口可能尚不可见。
Activated当窗口已激活且已经或将要变为焦点窗口时,将引发此事件。
Deactivated当窗口不再是焦点窗口时,将引发此事件。 但是,窗口可能依然可见。
Stopped当窗口不再可见时,将引发此事件。 无法保证应用将从此状态继续运行,因为它可能由操作系统终止。断开与任何长期进程的连接,或取消可能消耗设备资源的任何挂起请求。
Resumed当应用在被停止后继续运行时,将引发此事件。 应用首次启动时不会引发此事件,并且仅当之前已经引发 Stopped 事件时才能引发。订阅任何所需的事件,并刷新可见页面上的任何内容。
Destroying当本机窗口被销毁并解除分配时,将引发此事件。 重新打开应用时,可能会对新的本机窗口使用相同的跨平台窗口。移除已附加到本机窗口的任何事件订阅。

这些跨平台事件映射到不同的平台事件,下表显示了此映射:

展开表

活动AndroidiOSWindows
CreatedOnPostCreateFinishedLaunchingCreated
ActivatedOnResumeOnActivatedActivatedCodeActivated 和 PointerActivated
DeactivatedOnPauseOnResignActivationActivated (Deactivated)
StoppedOnStopDidEnterBackgroundVisibilityChanged
ResumedOnRestartWillEnterForegroundResumed
DestroyingOnDestroyWillTerminateClosed

此外,Window 类还定义了当窗口关闭或进入后台状态时在 iOS 和 Mac Catalyst 上引发的 Backgrounding 事件。 BackgroundingEventArgs 对象附带此事件,任何 string 状态都应保存到 BackgroundingEventArgs 对象的 State 属性,OS 将一直保留该属性,直到恢复窗口为止。 当窗口恢复时,状态由 IActivationState 参数提供给 CreateWindow 替代。

除了这些事件,Window 类还具有以下可替代的生命周期方法:

  • OnCreated,在引发 Created 事件时调用。
  • OnActivated,在引发 Activated 事件时调用。
  • OnDeactivated,在引发 Deactivated 事件时调用。
  • OnStopped,在引发 Stopped 事件时调用。
  • OnResumed,在引发 Resumed 事件时调用。
  • OnDestroying,在引发 Destroying 事件时调用。
  • OnBackgrounding,在引发 Backgrounding 事件时调用。

要订阅 Window 生命周期事件,请重写 App 类中的 CreateWindow 方法,以创建可在其上订阅事件的 Window 实例:

C#复制

namespace MyMauiApp
{
    public partial class App : Application
    {
        public App()
        {
            InitializeComponent();

            MainPage = new MainPage();
        }

        protected override Window CreateWindow(IActivationState activationState)
        {
            Window window = base.CreateWindow(activationState);

            window.Created += (s, e) =>
            {
                // Custom logic
            };

            return window;
        }
    }
}

或者,若要使用生命周期重写,请创建派生自 Window 类的类

C#复制

namespace MyMauiApp
{
    public class MyWindow : Window
    {
        public MyWindow() : base()
        {
        }

        public MyWindow(Page page) : base(page)
        {
        }

        protected override void OnCreated()
        {
            // Register services
        }
    }
}

然后,可以通过重写 App 类中的 CreateWindow 方法来使用 Window 派生类,以返回 MyWindow 实例。

 警告

如果设置了 App.MainPage 属性,并且 CreateWindow 方法使用接受 Page 参数的重写创建 Window 对象,则将引发 InvalidOperationException 对象。

平台生命周期事件

.NET MAUI 定义了在响应所引发的平台生命周期事件时调用的委托。 可以使用在调用委托时执行的命名方法或匿名函数为这些委托指定处理程序。 通过此机制,应用可在常见平台生命周期事件发生时收到通知。

 重要

ConfigureLifecycleEvents 方法位于 Microsoft.Maui.LifecycleEvents 命名空间中。

Android

下表列出了为响应所引发的 Android 生命周期事件而调用的 .NET MAUI 委托:

展开表

委托参数描述评论
OnActivityResultAndroid.App.ActivityintAndroid.App.ResultAndroid.Content.Intent?启动的活动退出时调用。
OnApplicationConfigurationChangedAndroid.App.ApplicationAndroid.Content.Res.Configuration在组件运行期间设备配置发生更改时调用。
OnApplicationCreateAndroid.App.Application应用启动后,在创建活动、服务或接收方对象(不包括内容提供程序)之前调用。
OnApplicationCreatingAndroid.App.Application应用启动时,在活动、服务或接收方对象(不包括内容提供程序)创建之前调用。
OnApplicationLowMemoryAndroid.App.Application当系统内存不足时调用,并且正在运行的进程应减少其内存使用率。
OnApplicationTrimMemoryAndroid.App.ApplicationAndroid.Content.TrimMemory当操作系统确定某个进程应当从其自身删减不需要的内存时调用。
OnBackPressedAndroid.App.Activity当活动检测到按下后退键时调用。
OnConfigurationChangedAndroid.App.ActivityAndroid.Content.Res.Configuration在活动运行期间设备配置发生更改时调用。
OnCreateAndroid.App.ActivityAndroid.OS.Bundle?创建活动时引发。
OnDestroyAndroid.App.Activity在活动完成时调用,或者因为系统暂时销毁活动实例以节省空间而调用。始终调用超级类的实现。
OnNewIntentAndroid.App.ActivityAndroid.Content.Intent?当活动在活动堆栈的顶部重新启动时调用,而不是启动活动的新实例。
OnPauseAndroid.App.Activity当活动进入后台但尚未终止时调用。始终调用超级类的实现。
OnPostCreateAndroid.App.ActivityAndroid.OS.Bundle?在调用 OnStart 和 OnRestoreInstanceState 之后,活动启动完成时调用。始终调用超级类的实现。 这是应用通常不应使用的仅限系统的事件。
OnPostResumeAndroid.App.Activity在调用 OnResume 之后,活动恢复完成时调用。始终调用超级类的实现。 这是应用通常不应使用的仅限系统的事件。
OnRequestPermissionsResultAndroid.App.Activityintstring[]Android.Content.PM.Permission[]作为请求权限的结果的回叫调用。
OnRestartAndroid.App.Activity在 OnStop 后调用。此时当前活动重新显示给用户(用户已导航回该活动)。始终调用超级类的实现。
OnRestoreInstanceStateAndroid.App.ActivityAndroid.OS.BundleOnStart 后调用。此时活动从以前保存的状态重新初始化。
OnResumeAndroid.App.ActivityOnRestoreInstanceStateOnRestart 或 OnPause 后调用,以指示活动处于活动状态并且已准备好接收输入。
OnSaveInstanceStateAndroid.App.ActivityAndroid.OS.Bundle调用来从被终止的活动中检索每个实例的状态,以便可以在 OnCreate 或 OnRestoreInstanceState 中恢复状态。
OnStartAndroid.App.Activity在 OnCreate 或 OnRestart 之后调用,此时活动已经停止,但正在显示给用户。始终调用超级类的实现。
OnStopAndroid.App.Activity当用户不再看到活动时调用。始终调用超级类的实现。


详情请见

应用生命周期 - .NET MAUI | Microsoft Learn

 

  • 9
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值