.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 | 当本机窗口被销毁并解除分配时,将引发此事件。 重新打开应用时,可能会对新的本机窗口使用相同的跨平台窗口。 | 移除已附加到本机窗口的任何事件订阅。 |
活动 | Android | iOS | Windows |
---|---|---|---|
Created | OnPostCreate | FinishedLaunching | Created |
Activated | OnResume | OnActivated | Activated (CodeActivated 和 PointerActivated ) |
Deactivated | OnPause | OnResignActivation | Activated (Deactivated ) |
Stopped | OnStop | DidEnterBackground | VisibilityChanged |
Resumed | OnRestart | WillEnterForeground | Resumed |
Destroying | OnDestroy | WillTerminate | Closed |
此外,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 实例:
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 类的类
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 对象。
应用生命周期