【问题标题】:How to detect if a user has closed a winrt application如何检测用户是否关闭了 winrt 应用程序
【发布时间】:2014-04-23 07:19:24
【问题描述】:

检测用户是否使用 ALT-F4 或关闭手势关闭应用的可靠(且立即)方法是什么?

【问题讨论】:

  • 你的意思是在用户关闭后运行代码?
  • @SLaks,是的,在用户关闭它之后和系统引发暂停事件之前
  • 两者有区别吗?
  • @Filip:十秒后调用后者。
  • 真的吗?有趣的。它到底有什么变化?

标签: windows-runtime windows-store-apps


【解决方案1】:

并不是对我的具体问题的确切答案,而是一种解决我发布问题的具体问题的方法。也许它可以帮助别人:

注册Window.CoreWindow.VisibilityChanged:

Window.Current.CoreWindow.VisibilityChanged += CoreWindow_VisibilityChanged;

如果可见性已更改为 false,这可能是由于应用程序关闭所致。请注意,该事件也会因许多其他原因而触发,例如通过 ALT-Tab 更改窗口:

 void CoreWindow_VisibilityChanged(CoreWindow sender, VisibilityChangedEventArgs args) {
        if(!args.Visible){
           // Action here
        }
 }

请注意:我怀疑 MS 没有明确提供我正在寻找的事件,因为在用户关闭应用程序时的繁重操作会导致用户体验不流畅。但是,我认为在某些符合条件的情况下,此类事件是有意义的,因此人们会使用我在此处提供的解决方法。如果您使用此解决方法或其他解决方法,请注意不要给系统造成沉重负载。

【讨论】:

  • 我必须同意这个答案。但是,我发现您还需要使用 Unloaded 事件,否则您可能会发现自己正在保存旧页面的状态。我将添加我的笔记作为可读性的答案。
  • 而是 Windows.UI.Xaml.Window.Current.VisibilityChanged
【解决方案2】:

根据Application Lifecycle 文档,无法检测到此事件(请参阅“应用关闭”部分)。使用ApplicationData 类可以最好地管理这种类型的状态。

【讨论】:

    【解决方案3】:

    毫无疑问,您不想一直保存状态以防应用暂停。难道这不会被称为“轮询”(这在其他方面有点糟糕和浪费)?在我的场景中,我有一个计时器来跟踪剩余时间,这是应用程序状态的一部分,但我不想在每次滴答时都存储它。

    因此,要正确执行此操作,您需要:

    1. 跟踪 VisibilityChanged(如原始海报所述)
    2. 跟踪卸载(无论何时从页面导航返回等)
    3. 跟踪页面何时被卸载,这样您就不会保存过时的缓存页面,因为这些页面可能会闲置

    要详细说明上面的#3 - 我发现如果我从 A -> B 向前导航,然后返回 A,然后再次导航到 B,我最终会得到另一个缓存页面 B。然后当用户离开应用程序时,我会触发多个 VisibilityChanged 事件,其中一些包括我认为会被销毁但没有被销毁的旧缓存页面。

    这是对我有用的代码:

    public void MyPage() // Constructor
    {
      Loaded += (sender, e) =>
      {
        if(!m_isLoaded)
        {
          m_isLoaded = true;
    
          Window.Current.CoreWindow.VisibilityChanged +=
              OnVisibilityChanged;
        }
      };
    
      Unloaded += async (sender, e) => 
      {
        if (m_isLoaded)
        {
          m_isLoaded = false;
    
          Window.Current.CoreWindow.VisibilityChanged -= 
              OnVisibilityChanged;
    
          await SaveStuff();
        }
      };
    }
    
    protected void OnVisibilityChanged(object sender,
      Windows.UI.Core.VisibilityChangedEventArgs e)
    {
      if (!e.Visible && m_isLoaded)
      {
        var dontAwait = SaveStuff();
      }
    }
    
    // Called whenever the page is unloaded and state needs to be saved.
    protected async Task SaveStuff()
    {
      await ThreadUtility.voidTask();
    }
    
    // Set to false when the page is unloaded (paused).
    private bool m_isLoaded = false;
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-03-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-11-27
      • 2016-11-07
      • 1970-01-01
      相关资源
      最近更新 更多