なつねこメモ

主にプログラミング関連のメモ帳 ♪(✿╹ヮ╹)ノ 書いてあるコードは自己責任でご自由にどうぞ。記事本文の無断転載は禁止です。

トースト通知のイベントを処理する

先日の記事の続きです。
今回は、実際に飛んできたイベントの処理をします。

ちなみに、先日の記事 ↓

Windows 10 でトースト通知を飛ばす

先日の記事の最後のように、トースト通知ではボタンを設置できたり、
入力内容を受け取って処理をする...みたいなのができます。

この時、どう処理するかにもよるのですが、

  • フォアグラウンド
  • バックグラウンド

のどちらかで処理することになります。
個人的には、多くの場合はバックグラウンドで良いんじゃないかと思ってます。
(Twitter の返信とか、わざわざアプリ起動せずとも返せるといいですよね。)

フォアグラウンドでの処理

フォアグラウンドで処理する場合は、アプリが起動している場合はトップレベルとなり、
起動していない場合は起動されて、 OnLaunched にパラメータが渡されます。

バックグラウンドでの処理

バックグラウンドで処理する場合は、アプリメイン以外に、
Windows ランタイム コンポーネント のプロジェクトを追加する必要があります。

それについて詳しく書かれているのがこのドキュメントです。

バックグラウンド タスクの作成と登録 - Windows app development

ちなみに、同一プロジェクトでやろうとしても、動いてくれないので注意。

Windows ランタイム コンポーネント プロジェクトを作ったら、こんな感じでクラスを追加する。

public sealed class QuickReplyBackgroundTask : IBackgroundTask
{
    private BackgroundTaskDeferral _deferral;

    public async void Run(IBackgroundTaskInstance taskInstance)
    {
        _deferral = taskInstance.GetDeferral();
        var toastDetails = taskInstance.TriggerDetails as ToastNotificationActionTriggerDetail;
        if (toastDetails == null)
        {
            return;
        }

        var arguments = toastDetails.Argument;
        var userInput = toastDetails.UserInput;

        // なにか処理

        _deferral.Complete();
    }
}

すると、入力した値を用いて処理することが可能です。
なお、このプロジェクトにあるクラスはすべて public sealed でないといけないようです。

注 バックグラウンド タスク クラス自体と、バックグラウンド タスク プロジェクト内のその他すべてのクラスは、sealed 指定の public クラスである必要があります。 https://msdn.microsoft.com/ja-jp/library/windows/apps/mt299100.aspx

また、非同期処理を行う場合、遅延処理のため deferral を定義しますが、
これもクラススコープでないとうまく動かないっぽい?

実際に使用するには、いくつか手順を踏む必要があります。
まず、メインアプリのコードから、 QuickReplyBackgroundTask を登録します。

var builder = new BackgroundTaskBuilder
{
    Name = nameof(QuickReplyBackgrondTask),
    TaskEntryPoint = typeof(QuickReplyBackgroundTask).FullName
};
builder.SetTrigger(new ToastNotificationActionTrigger());
builder.Register();

この際、Name はどんなものでも大丈夫です。
めんどくさいのでクラス名にしています。

すでに登録処理を行っている場合は再登録をしなくてはいけないので、その処理が必要ですが、
詳しくは MSDN を...。
ちなみに、これをサボると、同じ通知が数個飛んでくるカオスなことになります。

次に、Package.appxmanifest にタスクを登録します。
f:id:MikazukiFuyuno:20151117040157p:plain
こんな感じですね。

これで、実際にバックグラウンドタスクを呼び出すことができます。