如何检测UWP的出口

如何检测UWP的出口,uwp,Uwp,有没有办法检测当前UWP将要退出的情况?(由用户关闭或终止进程) 我想向服务器发送一些关于应用程序将断开连接的请求,还想在退出前保存一些数据。无法检测此类情况或阻止用户终止应用程序。如果要在退出前保存状态或执行某些操作,请使用: 挂起事件是您的应用程序在终止之前(如果发生)将收到的唯一指示。因此,您应该存储足够的会话状态(例如正在阅读的当前文章或当前电影播放位置),以便在激活期间重新创建完全相同的体验。内容创建应用程序的指导原则是尽早保存用户的工作,并且经常保存,但在挂起期间提交最后一次保存。在

有没有办法检测当前UWP将要退出的情况?(由用户关闭或终止进程)


我想向服务器发送一些关于应用程序将断开连接的请求,还想在退出前保存一些数据。

无法检测此类情况或阻止用户终止应用程序。如果要在退出前保存状态或执行某些操作,请使用:

挂起事件是您的应用程序在终止之前(如果发生)将收到的唯一指示。因此,您应该存储足够的会话状态(例如正在阅读的当前文章或当前电影播放位置),以便在激活期间重新创建完全相同的体验。内容创建应用程序的指导原则是尽早保存用户的工作,并且经常保存,但在挂起期间提交最后一次保存。在挂起之前保存数据非常有用,因为挂起事件处理程序只有5秒的时间来完成其操作

记住时间有限


事实上,还有另外两个事件将被触发(在移动情况下,当用户按住按钮并转到任务切换器时):Window.VisibilityChanged和Windows.Activated,但当用户更改应用程序时,它们也会被触发,显示提示等-无法区分这些情况。

要在应用程序的主页中拦截close,Windows 10 1703版(build 10.0.15063)中添加了受限功能
confirmAppClose

将以下代码添加到清单中:

xmlns:rescap="http://schemas.microsoft.com/appx/manifest/foundation/windows10/restrictedcapabilities"
...
<Capabilities> 
  <Capability Name="internetClient" /> 
  <rescap:Capability Name="confirmAppClose"/> 
</Capabilities> 
您可以使用
Window.Current.Closed
ApplicationView.GetForCurrentView().Consolidated
CoreWindow.GetForCurrentThread().Closed
CoreApplication.Exiting
,查看所有其他窗口


不幸的是,没有办法通过终止应用程序的进程来截获close。

如果您能在其中添加一些示例代码,这将非常有帮助。:-)@qakmak什么样的示例代码?没有什么特别的,只需订阅App.Current.Suspending event.Code进行检查。我想知道你是如何知道这个应用程序的,不仅仅是切换到其他应用程序或转到系统主页,而是退出。我只是不知道如何使用可见性和激活进行确认exit@qakmak正如我在第一行中所说的,您无法检测到它。应用程序将在您提到的每个案例中调用挂起事件。尽管我认为,你应该处理这个问题,因为这个应用程序可能在将来被关闭。请记住,一旦应用程序被挂起,当资源不足时,系统就可以关闭它,在这种情况下,您将无法调用任何事件。@qakmak我仍然不知道您不能做什么?对于代码,简单事件订阅:
App.Current.Suspending+=yourEventHandler;//在处理程序中,如果作业是异步的,请获取延迟
。另外,请记住,如果不手动调用事件,您将无法调试此程序-当调试PLM被禁用时,在这种情况下,应用程序的行为会略有不同-您必须使用lifecycle tab.Um。。。在这么长时间之后,我想也许我应该告诉一些仍然需要回答的人:事实证明,手机应用程序不同于桌面软件。因此,如果用户
杀死应用程序,您无法检测到它,但我们可以手动检测应用程序是否进入后台。(这就是为什么我们会听到“不要太多地手动终止应用程序”),我的建议是针对第一次使用手机应用程序开发的用户:让服务器端检测断开连接的情况。(比如长时间没有收到应用程序的响应)
public MainPage()
{
    this.InitializeComponent();
    SystemNavigationManagerPreview.GetForCurrentView().CloseRequested += OnMainPageCloseRequest;
}

private void OnMainPageCloseRequest(object sender, SystemNavigationCloseRequestedPreviewEventArgs e)
{
    var deferral = e.GetDeferral();

    if (!saved) 
    {
        e.Handled = true; 
        SomePromptFunction(); 
    }

    deferral.Complete();
}