主にプログラミング関連のメモ帳 ♪(✿╹ヮ╹)ノ
書いてあるコードは自己責任でご自由にどうぞ。記事本文の無断転載は禁止です。
2015/11/17
先日の記事の続きです。
今回は、実際に飛んできたイベントの処理をします。
ちなみに、先日の記事 ↓
先日の記事の最後のように、トースト通知ではボタンを設置できたり、
入力内容を受け取って処理をする...みたいなのができます。
この時、どう処理するかにもよるのですが、
のどちらかで処理することになります。
個人的には、多くの場合はバックグラウンドで良いんじゃないかと思ってます。
(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
にタスクを登録します。
こんな感じですね。
これで、実際にバックグラウンドタスクを呼び出すことができます。