有没有办法检测当前的UWP 要退出? (靠近用户或杀死进程)
我想向服务器发送一些关于应用程序将断开连接的请求,也希望在退出之前保存一些数据。
答案 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.Closed
或ApplicationView.GetForCurrentView().Consolidated
或CoreWindow.GetForCurrentThread().Closed
或CoreApplication.Exiting
用于所有其他附加窗口。
不幸的是,无法通过杀死应用程序的进程来拦截关闭。