当前位置: 首页 > news >正文

.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当用户不再看到活动时调用。始终调用超级类的实现。

 重要

每个委托都有一个相应的同名扩展方法,可以调用该方法来注册委托的处理程序。

若要响应要调用的 Android 生命周期委托,请在 MauiProgram 类的 CreateMauiapp 方法中在 MauiAppBuilder 对象上调用 ConfigureLifecycleEvents 方法。 然后,在对象 ILifecycleBuilder 上,调用 AddAndroid 方法并指定为所需委托注册处理程序的 Action

C#复制

using Microsoft.Maui.LifecycleEvents;namespace PlatformLifecycleDemo
{public static class MauiProgram{public static MauiApp CreateMauiApp(){var builder = MauiApp.CreateBuilder();builder.UseMauiApp<App>().ConfigureLifecycleEvents(events =>{
#if ANDROIDevents.AddAndroid(android => android.OnActivityResult((activity, requestCode, resultCode, data) => LogEvent(nameof(AndroidLifecycle.OnActivityResult), requestCode.ToString())).OnStart((activity) => LogEvent(nameof(AndroidLifecycle.OnStart))).OnCreate((activity, bundle) => LogEvent(nameof(AndroidLifecycle.OnCreate))).OnBackPressed((activity) => LogEvent(nameof(AndroidLifecycle.OnBackPressed)) && false).OnStop((activity) => LogEvent(nameof(AndroidLifecycle.OnStop))));
#endifstatic bool LogEvent(string eventName, string type = null){System.Diagnostics.Debug.WriteLine($"Lifecycle event: {eventName}{(type == null ? string.Empty : $" ({type})")}");return true;}});return builder.Build();}}
}

有关 Android 应用生命周期的详细信息,请参阅 developer.android.com 上的了解活动生命周期。

iOS 和 Mac Catalyst

下表列出了为响应正在引发的 iOS 和 Mac Catalyst 生命周期事件而调用的 .NET MAUI 委托:

委托参数描述
ApplicationSignificantTimeChangeUIKit.UIApplication在发生重大时间更改(例如午夜、运营商更改时间或夏令时开始或停止)时调用。
ContinueUserActivityUIKit.UIApplicationFoundation.NSUserActivityUIKit.UIApplicationRestorationHandler当应用收到与用户活动关联的数据(例如使用 Handoff 从其他设备传输活动)时调用。
DidEnterBackgroundUIKit.UIApplication当应用进入后台时调用。
FinishedLaunchingUIKit.UIApplicationFoundation.NSDictionary在应用启动时调用。
OnActivatedUIKit.UIApplication在应用启动时调用,每次应用返回到前台时调用。
OnResignActivationUIKit.UIApplication在应用即将进入后台、暂停运行或用户遇到中断情形(如接到电话或短信)时调用。
OpenUrlUIKit.UIApplicationFoundation.NSDictionary当应用应打开指定的 URL 时调用。
PerformActionForShortcutItemUIKit.UIApplicationUIKit.UIApplicationShortcutItemUIKit.UIOperationHandler启动主屏幕快速操作时调用。
PerformFetchUIKit.UIApplicationAction<UIBackgroundFetchResult>需要告知应用可开始提取操作以下载可用数据时调用。
SceneContinueUserActivityUIKit.UISceneFoundation.NSUserActivity需要处理指定的与移交相关的活动时调用。
SceneDidDisconnectUIKit.UIScene从应用中删除场景时调用。
SceneDidEnterBackgroundUIKit.UIScene当场景在后台运行且未出现在屏幕上时调用。
SceneDidFailToContinueUserActivityUIKit.UIScenestringFoundation.NSError需要通知用户无法完成活动时调用。
SceneDidUpdateUserActivityUIKit.UISceneFoundation.NSUserActivity更新指定活动时调用。
SceneOnActivatedUIKit.UIScene当场景处于活动状态并能够响应用户事件时调用。
SceneOnResignActivationUIKit.UIScene当场景即将退出活动状态并停止响应用户事件时调用。
SceneOpenUrlUIKit.UISceneFoundation.NSSet<UIKit.UIOpenUrlContext>当场景要求打开一个或多个 URL 时调用。
SceneRestoreInteractionStateUIKit.UISceneFoundation.NSUserActivity需要还原活动状态时调用。
SceneWillConnectUIKit.UISceneUIKit.UISceneSessionUIKit.UISceneConnectionOptions将场景添加到应用时调用。
SceneWillContinueUserActivityUIKit.UIScenestring需要准备接收与移交相关的数据时调用。
SceneWillEnterForegroundUIKit.UIScene当场景即将在前台运行并且对用户可见时调用。
WillEnterForegroundUIKit.UIApplication当应用将从后台状态返回时调用。
WillFinishLaunchingUIKit.UIApplicationFoundation.NSDictionary在应用已开始启动但尚未发生状态还原时调用。
WillTerminateUIKit.UIApplication在应用因内存限制而终止,或者由用户直接终止的情况下调用。
WindowSceneDidUpdateCoordinateSpaceUIKit.UIWindowSceneUIKit.IUICoordinateSpaceUIKit.UIInterfaceOrientationUIKit.UITraitCollection场景的大小、方向或特征发生更改时调用。

 重要

除 PerformFetch 以外,每个委托都有相应的同名扩展方法,可以调用该方法来注册委托的处理程序。

若要响应要调用的 iOS 和 Mac Catalyst 生命周期委托,请在 MauiProgram 类的 CreateMauiapp 方法中对 MauiAppBuilder 对象调用 ConfigureLifecycleEvents 方法。 然后,在 ILifecycleBuilder 对象上调用 AddiOS 方法并指定为所需委托注册处理程序的 Action

C#复制

using Microsoft.Maui.LifecycleEvents;namespace PlatformLifecycleDemo
{public static class MauiProgram{public static MauiApp CreateMauiApp(){var builder = MauiApp.CreateBuilder();builder.UseMauiApp<App>().ConfigureLifecycleEvents(events =>{
#if IOS || MACCATALYSTevents.AddiOS(ios => ios.OnActivated((app) => LogEvent(nameof(iOSLifecycle.OnActivated))).OnResignActivation((app) => LogEvent(nameof(iOSLifecycle.OnResignActivation))).DidEnterBackground((app) => LogEvent(nameof(iOSLifecycle.DidEnterBackground))).WillTerminate((app) => LogEvent(nameof(iOSLifecycle.WillTerminate))));
#endifstatic bool LogEvent(string eventName, string type = null){System.Diagnostics.Debug.WriteLine($"Lifecycle event: {eventName}{(type == null ? string.Empty : $" ({type})")}");return true;}});return builder.Build();}}
}

要详细了解 iOS 应用生命周期,请参阅 developer.apple.com 上的管理应用的生命周期。

Windows

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

委托参数描述
OnActivatedMicrosoft.UI.Xaml.WindowMicrosoft.UI.Xaml.WindowActivatedEventArgs如果应用未恢复,在引发平台 Activated 事件时调用。
OnClosedMicrosoft.UI.Xaml.WindowMicrosoft.UI.Xaml.WindowEventArgs在引发平台 Closed 事件时调用。
OnLaunchedMicrosoft.UI.Xaml.WindowMicrosoft.UI.Xaml.LaunchActivatedEventArgs创建并激活本机窗口后,由 .NET MAUI 的 Application.OnLaunched 重写调用。
OnLaunchingMicrosoft.UI.Xaml.WindowMicrosoft.UI.Xaml.LaunchActivatedEventArgs在创建和激活本机窗口前,由 .NET MAUI 的 Application.OnLaunched 重写调用。
OnPlatformMessageMicrosoft.UI.Xaml.WindowWindowsPlatformMessageEventArgs当 .NET MAUI 接收到特定的本机 Windows 消息时调用。
OnPlatformWindowSubclassedMicrosoft.UI.Xaml.WindowWindowsPlatformWindowSubclassedEventArgs由 .NET MAUI 在 Win32 窗口被子类化时调用。
OnResumedMicrosoft.UI.Xaml.Window如果应用正在恢复,在引发平台 Activated 事件时调用。
OnVisibilityChangedMicrosoft.UI.Xaml.WindowMicrosoft.UI.Xaml.WindowVisibilityChangedEventArgs引发平台 VisibilityChanged 事件时调用。
OnWindowCreatedMicrosoft.UI.Xaml.Window为跨平台 Window 创建本机窗口时调用。

.NET MAUI 使用 OnPlatformMessage 委托将特定的本机 Windows 消息公开为生命周期事件。 此委托附带的 WindowsPlatformMessageEventArgs 对象包含类型为 uint 的 MessageId 属性。 可以检查此属性的值以确定传递到应用窗口的消息。 有关 Windows 消息的详细信息,请参阅 Windows 消息(Win32 和 C++ 入门)。 有关窗口消息常量的列表,请参阅 Window 通知。

 重要

每个委托都有一个相应的同名扩展方法,可以调用该方法来注册委托的处理程序。

要响应正在调用的 Windows 生命周期委托,请在 MauiProgram 类的 CreateMauiApp 方法中对 MauiAppBuilder 对象调用 ConfigureLifecycleEvents 方法。 然后,在 ILifecycleBuilder 对象上调用 AddWindows 方法并指定为所需委托注册处理程序的 Action

C#复制

using Microsoft.Maui.LifecycleEvents;namespace PlatformLifecycleDemo
{public static class MauiProgram{public static MauiApp CreateMauiApp(){var builder = MauiApp.CreateBuilder();builder.UseMauiApp<App>().ConfigureLifecycleEvents(events =>{
#if WINDOWSevents.AddWindows(windows => windows.OnActivated((window, args) => LogEvent(nameof(WindowsLifecycle.OnActivated))).OnClosed((window, args) => LogEvent(nameof(WindowsLifecycle.OnClosed))).OnLaunched((window, args) => LogEvent(nameof(WindowsLifecycle.OnLaunched))).OnLaunching((window, args) => LogEvent(nameof(WindowsLifecycle.OnLaunching))).OnVisibilityChanged((window, args) => LogEvent(nameof(WindowsLifecycle.OnVisibilityChanged))).OnPlatformMessage((window, args) =>{if (args.MessageId == Convert.ToUInt32("031A", 16)){// System theme has changed}}));
#endifstatic bool LogEvent(string eventName, string type = null){System.Diagnostics.Debug.WriteLine($"Lifecycle event: {eventName}{(type == null ? string.Empty : $" ({type})")}");return true;}});return builder.Build();}}
}

检索 Window 对象

平台代码可以使用 GetWindow 扩展方法从平台生命周期事件中检索应用的 Window 对象:

C#复制

using Microsoft.Maui.LifecycleEvents;namespace PlatformLifecycleDemo
{public static class MauiProgram{public static MauiApp CreateMauiApp(){var builder = MauiApp.CreateBuilder();builder.UseMauiApp<App>().ConfigureLifecycleEvents(events =>{
#if WINDOWSevents.AddWindows(windows => windows.OnClosed((window, args) =>{IWindow appWindow = window.GetWindow();}));
#endif});return builder.Build();}}
}

自定义生命周期事件

虽然 .NET MAUI 定义为响应引发的平台生命周期事件而调用的委托,但它仅公开一组常见的平台生命周期事件。 但是,它还包括一种机制(通常适用于库作者),该机制支持应用在引发其他平台生命周期事件时收到通知。 完成此目的的过程如下所示:

  • 为 .NET MAUI 未公开的平台生命周期事件注册事件处理程序。
  • 在平台生命周期事件的事件处理程序中,检索 ILifecycleEventService 实例并调用其 InvokeEvents 方法,同时指定平台事件名称作为其参数。

然后,想要接收平台生命周期事件通知的应用应修改其 MauiProgram 类的 CreateMauiApp 方法,以调用 MauiAppBuilder 对象上的 ConfigureLifecycleEvents 方法。 然后,在 ILifecycleBuilder 对象上调用 AddEvent 方法,并指定平台事件名称和引发平台事件时将调用的 Action

示例

当本机应用窗口首次呈现或更改其呈现大小时,将发生 WinUI 3 Window.SizeChanged 事件。 .NET MAUI 不会将此平台事件公开为生命周期事件。 但是,当使用以下方法引发此平台事件时,应用可以接收通知:

  • 为 Window.SizeChanged 平台生命周期事件注册事件处理程序:

    C#复制

    using Microsoft.Maui.LifecycleEvents;
    ...public static MauiApp CreateMauiApp()
    {var builder = MauiApp.CreateBuilder();builder.UseMauiApp<App>().ConfigureLifecycleEvents(events =>{
    #if WINDOWSevents.AddWindows(windows => windows.OnWindowCreated(window =>{window.SizeChanged += OnSizeChanged;}));
    #endif});return builder.Build();
    }    
    
  • 在平台生命周期事件的事件处理程序中,检索 ILifecycleEventService 实例并调用其 InvokeEvents 方法,同时将平台事件名称指定为其参数:

    C#复制

    using Microsoft.Maui.LifecycleEvents;
    ...#if WINDOWSstatic void OnSizeChanged(object sender, Microsoft.UI.Xaml.WindowSizeChangedEventArgs args){ILifecycleEventService service = MauiWinUIApplication.Current.Services.GetRequiredService<ILifecycleEventService>();service.InvokeEvents(nameof(Microsoft.UI.Xaml.Window.SizeChanged));}
    #endif
    

    Windows 上的 MauiWinUIApplication 类型可用于通过其 Current 属性访问本机应用实例。 Android 上的 MauiApplication 类型可用于访问本机应用实例。 同样,iOS 上的 MauiUIApplicationDelegate 类型可用于访问本机应用实例。

     警告

    使用 InvokeEvents 方法调用未注册的事件不会引发异常。

  • 在 MauiProgram 类的 CreateMauiApp 方法中,调用 MauiAppBuilder 对象上的 ConfigureLifecycleEvents 方法。 然后,在 ILifecycleBuilder 对象上,调用 AddEvent 方法并指定平台事件名称和引发平台事件时调用的 Action

    C#复制

    using Microsoft.Maui.LifecycleEvents;namespace PlatformLifecycleDemo
    {public static class MauiProgram{public static MauiApp CreateMauiApp(){var builder = MauiApp.CreateBuilder();builder.UseMauiApp<App>().ConfigureLifecycleEvents(events =>{
    #if WINDOWSevents.AddWindows(windows => windows.OnWindowCreated(window =>{window.SizeChanged += OnSizeChanged;}));events.AddEvent(nameof(Microsoft.UI.Xaml.Window.SizeChanged), () => LogEvent("Window SizeChanged"));
    #endifstatic bool LogEvent(string eventName, string type = null){System.Diagnostics.Debug.WriteLine($"Lifecycle event: {eventName}{(type == null ? string.Empty : $" ({type})")}");return true;}});return builder.Build();}}
    }
    

总体效果是,当用户更改 Windows 上的应用窗口大小时,将执行 AddEvent 方法中指定的操作。

相关文章:

.net MAUI应用生命周期

.NET Multi-platform App UI (.NET MAUI) 应用通常有四种执行状态&#xff1a;“未运行”、“运行中”、“已停用”和“已停止”。 当应用从未运行状态转换为运行状态、从运行状态转换为已停用状态、从已停用状态转换为已停止状态、从已停止状态转换为运行状态&#xff0c;以及…...

Nginx 安装教程

一、安装编译工具及库文件 yum -y install make zlib zlib-devel gcc-c libtool openssl openssl-devel 二、首先要安装 PCRE PCRE 作用是让 Nginx 支持 Rewrite 功能。 1、下载 PCRE 安装包&#xff0c;下载地址&#xff1a; http://downloads.sourceforge.net/project/p…...

vue axios发送post请求跨域解决

跨越解决有两种方案&#xff0c;后端解决&#xff0c;前端解决。后端解决参考Django跨域解决-CSDN博客 该方法之前试着可以的&#xff0c;但是复制到其他电脑上报错&#xff0c;所以改用前端解决 1、main.js做增加如下配置 import axios from axios Vue.prototype.$axios a…...

MIT线性代数

本文链接的原创作者为 浊酒南街https://blog.csdn.net/weixin_43597208 第1讲 MIT_线性代数笔记&#xff1a;第 01 讲 行图像和列图像-CSDN博客 第2讲 MIT_线性代数笔记&#xff1a;第 02 讲 矩阵消元_矩阵first pivot-CSDN博客 第3讲 MIT_线性代数笔记&#xff1a;第 03…...

打工人自救指南!2024年数据恢复工具,清空回收站也能秒回数据

嘿&#xff0c;各位上班的朋友们&#xff0c;有没有手抖或者不小心&#xff0c;把重要的东西给拖到回收站&#xff0c;然后又不小心把回收站清空了&#xff1f;别慌&#xff0c;今天我就来给你们支招&#xff0c;用数据恢复工具&#xff0c;让你们在丢数据的倒霉时候也能找到救…...

MyBatis 缓存机制

分布式系统中不建议使用mybatis缓存机制&#xff0c;建议通过redis来解决数据缓存。 MyBatis 缓存机制包括一级缓存和二级缓存&#xff0c;它们在提高数据库查询效率方面发挥着重要作用。 1. **一级缓存**&#xff08;Local Cache&#xff09;&#xff1a; - 一级缓存是 M…...

10个神级Python自动化脚本助力轻松工作

大家好&#xff0c;Python自动化简化了日常编程任务&#xff0c;同时更激发了探索创新解决方案的热情。本文将介绍10个精心挑选的自动化脚本&#xff0c;帮助大家提升工作效率和优化操作流程。 1.Speakify Speakify 是专注于语音交互的人工智能助手,可以帮助用户通过语音进行…...

EasyExcel模板导出与公式计算(下)

目录 环境要求 功能预览 需求分析 导入依赖 制作模板 编写代码 格式优化 最终效果 总结 在上一篇 EasyExcel模板导出与公式计算&#xff08;上&#xff09;-CSDN博客 文章中我们知道了在若依中使用自带的Excel注解来实现表格数据的导出&#xff0c;并且通过重写相关接…...

Golang序言全面学习-前序

最近看了很多与Golang有关的教程与书籍&#xff0c;也包括bilibili上的教程&#xff0c;各位老师讲解非常详细的&#xff0c;基本涉及了基础篇的方方面面&#xff0c;但总是感觉缺少了一些实战&#xff0c;以及实际经验的传授。实际项目会用到的日志框架、配置管理框架&#xf…...

Python世界:文件自动化备份实践

Python世界&#xff1a;文件自动化备份实践 背景任务实现思路坑点小结 背景任务 问题来自《简明Python教程》中的解决问题一章&#xff0c;提出实现&#xff1a;对指定目录做定期自动化备份。 最重要的改进方向是不使用 os.system 方法来创建归档文件&#xff0c; 而是使用 zip…...

PTA 6-10 阶乘计算升级版(详讲)

6-10 阶乘计算升级版 - 基础编程题目集 (pintia.cn)https://pintia.cn/problem-sets/14/exam/problems/type/6?problemSetProblemId742&page0 首先这道题不能用我们之前学过的阶乘计算方法来解决&#xff0c;比如下面这段代码就无法通过全部的样例 void Print_Factorial…...

软件开发人员从0到1实现物联网项目:项目架构的思考

文章目录 前言单体应用足矣摒弃传统的微信对接后期的维护投入上真正的“云”&#xff1a;云托管0服务器免运维免费的CDN和DDoS防护 技术架构小结 前言 因为种种原因&#xff0c;《软件开发人员从0到1实现物联网项目》这个项目的进度停滞了将近一个月。 鉴于该项目的前期开发和…...

Java--集合进阶 Collection,迭代器,lambda表达式

集合体系结构 Collection&#xff1a;单列集合 LIst系列集合&#xff1a;添加的元素是有序、可重复、有索引 Set系列集合&#xff1a;添加的元素是无序、不重复、无索引 Collection集合常用方法 | 方法名 | 说明 || :---…...

STM32G474之DAC

STM32G474分别使用CORDIC硬件和“math.h”的正弦值&#xff0c;从DAC1和DAC2输出。 1、DAC特点 PA4的附加功能为DAC1_OUT1&#xff0c;无需映射&#xff0c;直接将它配置为模拟功能&#xff0c;就可以使用了。 PA6的附加功能为DAC2_OUT1&#xff0c;无需映射&#xff0c;直接将…...

哈希表的底层实现(2)---C++版

目录 链地址法Separate Chaining——哈希桶的模拟实现 超大重点分析&#xff1a; 两种方法对比 由于在上次的哈希表的底层实现(1)---C版已经详细的阐述了相关的结构和原理&#xff0c;哈希表的实现方法主要分为链地址法和开放定址法。开放定址法上次已经实现过了&#xff0c…...

算法知识点————【LRU算法】

思想&#xff1a;淘汰最久没有使用的 应用场景&#xff1a;手机清后台的时候先清最久没有使用的应用 设计一种数据结构&#xff1a;接收一个 capacity 参数作为缓存的最大容量&#xff0c;然后实现两个 API&#xff0c;一个是 put(key, val) 方法存入键值对&#xff0c;另一个是…...

记一次MySQL视图查询优化的经验

背景&#xff1a;库房系统项目迁移&#xff0c;两个版本的结构发生了很大变化&#xff0c;新版本的库存系统在开发阶段由于数据量小&#xff0c;根据看不出查询的性能问题&#xff0c;还沾沾自喜的想新版本多好。但是在做同步之后&#xff08;规则变更&#xff0c;需要插入很多…...

Cloudways搭建WordPress外贸独立站完整教程(1)

验证邮件发送完成后&#xff0c;就等待Cloudways的回复邮件&#xff0c;一般24小时之内就会收到激活的邮件。 Cloudways账号升级 激活成功后还需要账户升级&#xff0c;Cloudways提供了为期3天的免费试用体验。如果在试用期结束之前未绑定信用卡以升级账户&#xff0c;试用期…...

Delphi5数据控制组件——查询

文章目录 效果图参考查询Free方法Close方法总结通俗理解 完整代码 效果图 参考 本文是在上一篇的基础上&#xff0c;将查询页面重新写一次。 查询 {点击查询} procedure TForm2.Button1Click(Sender: TObject); vartj,tj1,tj2,tj3,tj4,tj5,tj6,tj7:string; begin//按照工号查…...

git pull之后发现项目错误,如何回到之前的版本方法

目录 首先我们打开小程序的cmd的黑窗口&#xff0c;git reflog查看之前的版本 之后再git reset --hard main{1} 我这个就已经返回了之前的6daaa2e的版本了 首先我们打开小程序的cmd的黑窗口&#xff0c;git reflog查看之前的版本 之后再git reset --hard main{1} 我这个就已…...

防跌倒识别摄像机

防跌倒识别摄像机 是一种结合了人工智能技术和监控摄像技术的先进设备&#xff0c;旨在通过实时监测和分析监控画面中的行为动作&#xff0c;及时发现并预防跌倒事件的发生。这种摄像机在医疗、养老院、家庭等场所有着广泛的应用前景。 防跌倒识别摄像机在医疗领域具有重要意义…...

MyQql性能诊断与实践

获取更多免费资料&#xff0c;见下图...

有序序列判断

描述 输入一个整数序列&#xff0c;判断是否是有序序列&#xff0c;有序&#xff0c;指序列中的整数从小到大排序或者从大到小排序(相同元素也视为有序)。 数据范围&#xff1a;3 < n< 50 序列中的值都满足 1< val < 100 输入描述&#xff1a; 第一行输入一个整数N…...

【Kubernetes知识点问答题】健康检查

目录 1. Kubernetes 对集群 Pod 和容器健康状态如何进行监控和检测的。 2. 解释 LivenessProbes 探针的作用及其适用场景。 3. 解释 ReadinessProbe 探针的作用及其适用场景。 4. 解释 StartupProbe 探针的作用及其适用场景。 5. 说明 K8s 中 Pod 级别的 Graceful Shutdown…...

【Prometheus】PromQL数据类型以及常用的计算函数用法详解

✨✨ 欢迎大家来到景天科技苑✨✨ &#x1f388;&#x1f388; 养成好习惯&#xff0c;先赞后看哦~&#x1f388;&#x1f388; &#x1f3c6; 作者简介&#xff1a;景天科技苑 &#x1f3c6;《头衔》&#xff1a;大厂架构师&#xff0c;华为云开发者社区专家博主&#xff0c;…...

STM32高级定时器生成互补PWM的原理与代码实现

文章目录 前言一 CubeMx配置1.1 TIM1 Mode and Configuration1.2 Paramter Settings 二 程序代码三 仿真分析总结 前言 互补 PWM&#xff08;Complementary PWM&#xff09;是指一对逻辑状态互为反相的 PWM&#xff08;脉冲宽度调制&#xff09;信号。这种信号配置常见于电机控…...

双指针题总结

双指针题总结 hot100移动零盛水最多的容器三数之和接雨水最小覆盖子串 hot100 移动零 题目链接&#xff1a; 283.移动零 代码&#xff1a; class Solution {public void moveZeroes(int[] nums) {int slow 0;for (int fast 0; fast < nums.length; fast ){if (nums[fas…...

[数据集][目标检测]人脸口罩佩戴目标检测数据集VOC+YOLO格式8068张3类别

数据集格式&#xff1a;Pascal VOC格式YOLO格式(不包含分割路径的txt文件&#xff0c;仅仅包含jpg图片以及对应的VOC格式xml文件和yolo格式txt文件) 图片数量(jpg文件个数)&#xff1a;8068 标注数量(xml文件个数)&#xff1a;8068 标注数量(txt文件个数)&#xff1a;8068 标注…...

JVM3-双亲委派机制

目录 概述 作用 如何指定加载类的类加载器&#xff1f; 面试题 打破双亲委派机制 自定义类加载器 线程上下文类加载器 Osgi框架的类加载器 概述 由于Java虚拟机中有多个类加载器&#xff0c;双亲委派机制的核心是解决一个类到底由谁加载的问题 双亲委派机制&#xff…...

经典文献阅读之--DEviLOG(使用合成数据和真实世界数据的数据驱动占用网格映射基于Transformer的BEV方案量产方案)

0. 简介 在自动驾驶汽车&#xff08;AV&#xff09;的感知任务中&#xff0c;数据驱动的方法往往优于传统方法。这促使我们开发了一种基于数据的方法来从激光雷达测量中计算占用网格地图&#xff08;OGM&#xff09;。我们的方法扩展了之前的工作&#xff0c;使得估计的环境表…...