.net MAUI应用生命周期

news2024/12/25 1:30:53

.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 ANDROID
                    events.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))));
#endif
                    static 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 || MACCATALYST
                    events.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))));
#endif
                    static 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 WINDOWS
                    events.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
                               }
                           }));
#endif
                    static 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 WINDOWS
                    events.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 WINDOWS
                      events.AddWindows(windows => windows
                             .OnWindowCreated(window =>
                             {
                                    window.SizeChanged += OnSizeChanged;
                             }));
    #endif
                });
    
          return builder.Build();
    }    
    
  • 在平台生命周期事件的事件处理程序中,检索 ILifecycleEventService 实例并调用其 InvokeEvents 方法,同时将平台事件名称指定为其参数:

    C#复制

    using Microsoft.Maui.LifecycleEvents;
    ...
    
    #if WINDOWS
            static 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 WINDOWS
                        events.AddWindows(windows => windows
                               .OnWindowCreated(window =>
                               {
                                      window.SizeChanged += OnSizeChanged;
                               }));
    
                        events.AddEvent(nameof(Microsoft.UI.Xaml.Window.SizeChanged), () => LogEvent("Window SizeChanged"));
    #endif
                        static 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 方法中指定的操作。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2120968.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

四七层如何获取客户端真实地址

7层代理会对报文进行重新封装&#xff0c;封装过程中可以通过增加XFF的header传递客户端IP。4层转发不会修改报文。在不修改HTTP报文前提下&#xff0c;前置补充代理信息, 格式: PROXY TCP 客户端IP 代理端IP 客户端端口 代理端端口。 nginx 七层代理配置&#xff1a; server …

JavaEE---Spring MVC(6)

如何创建一个spring项目呢 2. 3. 上述步骤结束后就ok了

PLM系统有哪些品牌推荐?国内不错的PLM厂商有哪些?

在当今快速变化的商业环境中&#xff0c;产品生命周期管理PLM系统已成为企业技术创新和管理创新的重要工具。PLM系统涵盖了产品从概念设计到市场推出、使用维护直至最终报废的整个生命周期&#xff0c;通过整合与产品相关的所有信息&#xff0c;助力企业实现高效、协同的产品开…

SuperMap GIS基础产品FAQ集锦(20240909)

一、SuperMap iDesktopX 问题1&#xff1a;镶嵌了一份550GB的DOM&#xff0c;双击加载到地图需要读取550GB的数据&#xff0c;耗时很久&#xff0c;加载到地图后一操作就需要再次读取&#xff0c;请问在不创建金字塔的情况下&#xff0c;如何把这份数据集保存到地图&#xff0…

【Hot100算法刷题集】哈希-03-最长连续序列(含排序、哈希、并查集法未正确使用哈希表导致算法效率降低的分析)

&#x1f3e0;关于专栏&#xff1a;专栏用于记录LeetCode中Hot100专题的所有题目 &#x1f3af;每日努力一点点&#xff0c;技术变化看得见 题目转载 题目描述 &#x1f512;link->题目跳转链接 给定一个未排序的整数数组 nums &#xff0c;找出数字连续的最长序列&#x…

记录一下linux安装nginx,也是很简单了啦

1、下载nginx 官网下载nginx&#xff1a;http://nginx.org/&#xff0c;这里很简单&#xff0c;下载自己想要的版本就行&#xff0c;这里不罗嗦 1、进入home目录&#xff0c;建一个文件夹nginx rootroot ~]# cd /home rootroot home]# mkdir nginx rootroot home]# cd /nginx2…

什么是智慧箱变动环辅控系统?箱式变电站动环监控@卓振思众

智慧箱变动环辅控系统是一种智能化的辅助控制系统&#xff0c;主要用于对箱变&#xff08;箱式变电站&#xff09;等设备的运行环境进行监测和控制。以下是【卓振思众】智慧箱变动环辅控系统的主要功能特点&#xff1a; 一、环境监测方面温度监测&#xff1a;实时监测箱变内的温…

C#编写上位机通过OPC DA读取西门子PLC数据

Sync_RW 引用&#xff1a;Quick.OpcComRcw 文档中原程序会报错&#xff1a; 原因&#xff1a;需要在安装有Simatic NET V14的电脑上运行这个程序。 需要注释掉下面程序&#xff0c;否则读取时会无故障提示退出。 //finally里的程序要注释掉&#xff0c;否则一点击read按钮&a…

招商银行信用卡中心编程练习题题解(全)

第一天 递归:LeetCode21.合并两个有序链表 /*** Definition for singly-linked list.* struct ListNode {* int val;* ListNode *next;* ListNode() : val(0), next(nullptr) {}* ListNode(int x) : val(x), next(nullptr) {}* ListNode(int x, ListNode…

掌握生成树 (STP、RSTP、MSTP) 最详细配置,轻松优化网络

目录 一. 实验内容 STP配置实验 RSTP配置实验 MSTP配置实验 二. 1 ) STP配置实验 实验拓扑 ​编辑 实验配置 实验结果 2 ) RSTP配置实验 实验拓扑 实验配置 实验结果 3 ) MSTP配置实验 实验拓扑 实验配置 ​编辑 实验结果 三 实验总结 一. 实验内容 1) …

齐齐哈尔医院系统等保测评,安全防护全面升级

随着数字化时代的到来&#xff0c;医疗系统的信息化建设日益重要。然而&#xff0c;随之而来的数据安全问题也成为了医疗机构必须面对的重大挑战。为了保障患者信息的安全以及整个医疗系统的稳定运行&#xff0c;齐齐哈尔市某医院近期进行了等保&#xff08;等级保护&#xff0…

vue-router 之如何在模版(template)中获取路由配置信息?

vue-router 之如何在模版&#xff08;template&#xff09;中获取路由配置信息&#xff1f; 获取当前路由信息 在vue3 中&#xff0c;route通常使用useRoute()钩子获取的&#xff0c;**代表当前激活的路由信息。**它包含了与当前路由相关的数据&#xff0c;比如路径、参数、查…

小米对讲机2S申请业余无线电台执照

首先&#xff0c;小米对讲机2S是可以用来申请业余无线电台执照得&#xff0c;对讲机、电台在工信部能查到核准代码即可。 工业和信息化部政务服务平台 在小米对讲机2S底部有核准代码 2022FP10742&#xff0c;搜索后即可看到详细信息。 有一点矛盾的是&#xff0c;在这里查询到…

ML 系列:机器学习和深度学习的深层次总结(02)线性回归

ML 系列&#xff1a; — 简单线性回归 线性回归、损失函数、假设函数 图 1.线性回归 文章目录 一、说明二、线性回归2.1 简单线性回归2.2 回归中的损失函数 三、线性回归中的评估标准四、线性回归模型训练五、可视化5.1 假设函数5.2 计算训练模型的损失&#xff1a;5.3 绘制 H…

关于武汉芯景科技有限公司的IIC电平转换芯片XJ9517开发指南(兼容PCF9517)

一、芯片引脚介绍 1.芯片引脚 2.引脚描述 二、系统结构图 三、功能描述 1.电平转换 2.芯片使能/失能 EN 引脚为高电平有效&#xff0c;内部上拉至 VCC&#xff08;B&#xff09;&#xff0c;允许用户选择中继器何时有效。这可用于在上电时隔离行为不良的从机&#xff0c;直到…

饭店起名|饭店怎么起名有创意

给饭店起名是一个非常重要的任务&#xff0c;对于饭店的经营和吸引力都有着重要的影响。一个好的饭店名字能够吸引顾客、传达出饭店的风格和特色。在起名之前&#xff0c;我们需要先考虑一些因素&#xff0c;例如饭店的定位、菜品特色、目标顾客、所在地区等。下面是一些建议可…

20章 线性表、栈、队列和优先队列

1.编写一个程序&#xff0c;从文本文件读取单词&#xff0c;并按字母的升序显示所有的单词(可以重复)。单词必须以字母开头。文本文件作为命令行参数传递。 import java.io.IOException; import java.nio.file.Files; import java.nio.file.Paths; import java.util.Arrays;pu…

python-数字反转

题目描述 给定一个整数 N&#xff0c;请将该数各个位上数字反转得到一个新数。新数也应满足整数的常见形式&#xff0c;即除非给定的原数为零&#xff0c;否则反转后得到的新数的最高位数字不应为零&#xff08;参见样例 2&#xff09;。 输入格式 一个整数 N。 输出格式 …

数据结构基础讲解(七)——数组和广义表专项练习

本文数据结构讲解参考书目&#xff1a; 通过网盘分享的文件&#xff1a;数据结构 C语言版.pdf 链接: https://pan.baidu.com/s/159y_QTbXqpMhNCNP_Fls9g?pwdze8e 提取码: ze8e 数据结构基础讲解&#xff08;六&#xff09;——串的专项练习-CSDN博客 个人主页&#xff1a;樱娆…

猫头虎分析:iPhone 16 系列哪款更适合你?买 iPhone 16 选哪款好?

猫头虎分析&#xff1a;iPhone 16 系列哪款更适合你&#xff1f;买 iPhone 16 选哪款好&#xff1f; 大家好&#xff0c;我是猫头虎。每年苹果发布新机型时&#xff0c;总能引发广泛的讨论和期待。今年也不例外&#xff0c;苹果发布了备受瞩目的 iPhone 16 系列&#xff0c;无…