2

ユーザーがALT-F4またはジェスチャーを閉じることでアプリを閉じたかどうかを検出するための信頼できる(そしてすぐに)方法は何ですか?

4

3 に答える 3

4

私の特定の質問に対する正確な答えではありませんが、質問を投稿した具体的な問題を解決する方法です。多分それは他の誰かを助ける:

に登録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 は私が探していたイベントを明示的に提供していないと思われます。ただし、そのようなイベントが理にかなっている適切なケースがあると思います。したがって、ここで提供するような回避策を使用する人もいます。この回避策または別の回避策を使用する場合は、システムに大きな負荷がかからないように注意してください。

于 2012-09-06T12:58:33.350 に答える
1

アプリが中断された場合に備えて、常に状態を保存したくないシナリオがあることは間違いありません。これは「ポーリング」と呼ばれるのではないでしょうか (これは、別の意味で悪いことであり、無駄なことです)。私のシナリオでは、アプリの状態の一部である残り時間を追跡するタイマーがありますが、これをすべてのティックに保存したくありません。

したがって、これを適切に行うには、次のことを行う必要があります。

  1. VisibilityChanged の追跡 (元の投稿者が述べたように)
  2. Unloaded の追跡 (ページから戻るときなど)
  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;
于 2013-08-27T07:09:31.937 に答える