如何检测UWP的退出

时间:2016-06-08 05:20:17

标签: uwp

有没有办法检测当前的UWP 要退出? (靠近用户或杀死进程)

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

2 个答案:

答案 0 :(得分:6)

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

  

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

请记住有限的时间。

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

答案 1 :(得分:1)

要在应用程序的MainPage中拦截关闭,在Windows 10版本1703(内部版本10.0.15063)中添加了受限功能confirmAppClose

在清单中添加以下代码:

xmlns:rescap="http://schemas.microsoft.com/appx/manifest/foundation/windows10/restrictedcapabilities"
...
<Capabilities> 
  <Capability Name="internetClient" /> 
  <rescap:Capability Name="confirmAppClose"/> 
</Capabilities> 

然后,您可以在CloseRequested中拦截SystemNavigationManagerPreview事件。如果您的方法需要一些时间才能完成(例如保存或提示),则可以推迟。另外,您可以将Handled设置为true,以阻止窗口关闭(即用户取消的提示)。

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();
}

您可以将Window.Current.ClosedApplicationView.GetForCurrentView().ConsolidatedCoreWindow.GetForCurrentThread().ClosedCoreApplication.Exiting用于所有其他附加窗口。

不幸的是,无法通过杀死应用程序的进程来拦截关闭。