windows phoneのバックグラウンドエージェントについて
DESCRIPTION
2012.06.10 Community Open Dayで発表した資料TRANSCRIPT
バックグラウンドエージェントとは
Windows Phoneでフォアグランドで動くアプリは一つだけ。バッググラウンドでも処理をするために搭載された機能がバックグラウンドエージェント。
一部のバックグラウンドの機能がWindows
Phone OS 7.0から組み込まれてはいたが、開発者が扱えるようになったのはWindows
Phone OS 7.1から、と思われる。
バックグラウンドでできること
オーディオの再生アプリケーションが終了していても音楽を再生することができる
タスクの実行定期的な間隔で処理を実行できる
ファイル転送ファイルのダウンロードやアップロードの最中にアプリケーションが閉じられても継続的に処理する
アラームなどの通知指定した時刻にユーザーに通知する
カメラ
センサー(加速度、コンパス、ジャイロ)
ブラウザ
LauncherとChooser
Xna
ナビゲーション
クリップボード
…
バックグラウンドでできないこと
Windows Phone のバックグラウンドエージェントのサポートされない API
http://msdn.microsoft.com/ja-jp/library/hh202962(v=vs.92).aspx
バックグラウンド処理の実装の種類
ScheduledTaskAgentタスクを処理するエージェント
AudioPlayerAgentオーディオプレイヤー専用のエージェント
AudioStreamingAgentストリーミング専用のエージェント
BackgroundTransferServiceファイル転送用のAPI
Alarm、Reminder指定した時刻に通知するAPI
Agentはバックグラウ
ンドでの処理を行うクラス
Serviceはバックグラ
ウンドへの処理の授受を行うクラス
各エージェントの説明
ScheduledTaskAgent
AudioPlayerAgent
AudioStreamingAgent
BackgroundTransferService
Alarm、Reminder
役割
任意の処理をバックグラウンドで行うことができる
バックグラウンドの処理の実行を制御するために2つのタスクが存在する
定期的に処理を実行するPeriodicTask
長時間処理を行うResourceInsentiveTask
最もプログラマーにとって融通の効くエージェント
ScheduledTaskAgent
PeriodicTaskの制約
30分間隔で実行最大で10分のずれ
25秒間実行
バッテリーセーブモードでは実行できないかも
デバイスで決められた数(最低6個)まで登録できる
ScheduledTaskAgent
30分
ResourceInsentiveTask
ある程度の長い時間(10分)処理できるタスク
例えばデータをすべて同期するなどの処理に向いている
制約が厳しいので実行されないケースも想定する必要がある
利用するケースとしては寝ている間に実行する
ScheduledTaskAgent
あんなこと そんなこと できます!
ResourceInsentiveTaskの制約
時間は10分
外部電源が必要
携帯のネットワークでは実行されない
バッテリーの電力が90%以上
ロック画面
通話中はNG
途中から携帯のネットワークに変更できない
ScheduledTaskAgent
条件は非常に厳しいので実行されないケースも
使い方
既存のプロジェクトにタスクエージェントプロジェクトを追加
参照に追加するのを忘れずに!
アプリ側にタスクを登録するコードを追加
バックグラウンドで処理するコードを追加
ScheduledTaskAgent
使い方は簡単
アプリケーション側の実装
// すでに登録してあるタスクを削除する
var task = ScheduledActionService.Find(“タスク名”)
as PeriodicTask;
if (task != null)
{
ScheduledActionService.Remove(task);
}
// 新しいタスクの登録
task = new PeriodicTask(“タスク名”);
task.Description = “バックグラウンドタスクに表示される文字列”;
ScheduledActionService.Add(task);
ScheduledTaskAgent
バックグラウンド側の実装
// クラスは自動で生成される
public class ScheduledAgent : ScheduledTaskAgent
{
protected override void OnInvoke(ScheduledTask task)
{
// ここでバックグラウンドでの処理を記述する
…
// 最後に成功したらNotifyComplete、失敗したらAbortを呼ぶ
NotifyComplete(); // or Abort();
}
}
ScheduledTaskAgent
アーキテクチャアプリケーション システム
・ScheduledActionService
Add(PeriodicTask)
Add(ResourceInsentiveTask)
エージェント(ScheduledTaskAgent)
OnInvoke(task)
{
Task別に処理
NotifyComplete() or Abort()
}
Task
Task
1.登録
2.呼び出し
3.結果を返す
・ScheduledAction.IsScheduled4.確認
ScheduledActionはTaskの基底クラス
ScheduledTaskAgent
役割
オーディオ専用のバックグラウンドエージェント
再生・次の曲・一時停止、などのイベントを受けて曲を再生したり次の曲を選曲する
イベントの発行者は二人
アプリケーションから操作するBackgroundAudioPlayer
ハードウェアから操作する
Universal Volume Control
(UVC)
AudioPlayerAgent
使い方
既存のプロジェクトにオーディオファイル再生エージェントを追加
参照に追加するのを忘れずに!
アプリケーション側からイベント発生
バックグラウンド側でイベント処理
AudioPlayerAgent
アプリケーション側の実装
// 再生ボタンをクリックしたとき
private void playButton_Click(object sender, RoutedEventArgs e)
{
// 再生中の時は停止、停止しているときは再生する
if (PlayState.Playing == BackgroundAudioPlayer.Instance.PlayerState)
{
BackgroundAudioPlayer.Instance.Pause();
}
else
{
BackgroundAudioPlayer.Instance.Play();
}
}
AudioPlayerAgent
アプリケーション側の実装AudioPlayerAgent
// コンストラクタでイベントを設定
BackgroundAudioPlayer.Instance.PlayStateChanged += new EventHandler(Instance_PlayStateChanged)
// 状態が変化したときのイベント
void Instance_PlayStateChanged(object sender, EventArgs e)
{
switch (BackgroundAudioPlayer.Instance.PlayerState)
{
case PlayState.Paused:
break;
case PlayState.Playing:
break;
}
}
OnUserActionの実装
protected override void OnUserAction(
BackgroundAudioPlayer player, AudioTrack track, UserAction action, object param)
{
switch (action)
{
// 再生
case UserAction.Play:
break;
// 一時停止
case UserAction.Pause:
break;
// << 前の曲へ
case UserAction.SkipPrevious:
break;
// >> 次の曲へ
case UserAction.SkipNext:
break;
}
NotifyComplete();
}
AudioPlayerAgent
ユーザーの操作によって発生したイベントに対応する処理を実装する
OnPlayStateChangedの実装
protected override void OnPlayStateChanged(BackgroundAudioPlayer player, AudioTrack track, PlayState playState)
{
switch (playState)
{
// トラックが終了
case PlayState.TrackEnded:
PlayNextTrack(player); // 次の再生する曲へ
break;
// 再生の準備ができている
case PlayState.TrackReady:
// The track to play is set in the PlayTrack method.
player.Play(); // 再生する
break;
}
NotifyComplete();
}
AudioPlayerAgent
プレイヤーの状態に変更があったときの処理を実装する
OnErrorの実装
protected override void OnError(
BackgroundAudioPlayer player, AudioTrack track,
Exception error, bool isFatal)
{
if (isFatal)
{
Abort();
}
else
{
NotifyComplete();
}
}
AudioPlayerAgent
ダウンロードに失敗したときなどのためのエラー処理を実装する
アーキテクチャAudioPlayerAgent
アプリケーション システム
BackgroundAudioPlayer.Instance
Play
Pause
SkipNext
event PlayStateChanged
Zune Media Queue
エージェント(AudioPlayerAgent)
• OnUserAction
• OnPlayStateChanged
• OnError
NotifyComplete() or Abort()
1.イベント登録
2.呼び出し
3.結果を返す
4.イベント通知UIの更新
使い方
既存のプロジェクトにオーディオストリーミングエージェントを追加
参照に追加するのを忘れずに!
アプリケーション側からイベント発生BackgroundAudioPlayer.Instance.Track =
new AudioTrack(null, "title", null, null, null);
バックグラウンド側でイベント処理OnBeginStreamingの処理を追加
AudioStreamingAgent
AudioPlayerAgentの実装も必要!AudioPlayerAgentはユーザーの操作への応答に必要。
Uriをnullに設定す
ることでAudioStreaminAge
ntを呼び出す
アーキテクチャAudioStreamingAgent
アプリケーション システム
・BackgroundAudioPlayer.Instance
.Track = new AudioTrack(null, …
エージェント(AudioStreamingAgent)
Zune Media Queue
• OnBeginStreamingMediaStreamSourceをセットする
エージェント(AudioPlayerAgent)
• OnUserAction
• OnPlayStateChanged
• OnError
NotifyComplete() or Abort()
event PlayStateChanged
1.登録
2.呼び出し
3.完了
4.再生開始
5.再生完了
6.完了通知
役割
バックグラウンドでのファイルのアップロードとダウンロードが可能
1つのファイルに対し1つのBackgroundTransferRequest
ファイルの転送はBackgroundTransferService が担当
BackgroundTransferService
制約
HTTP、HTTPSのみ対応FTPは未対応
ファイルの基点は、”/shared/transfers”
HTTPヘッダの予約If-Modified-Since
If-None-Match
If-Range
Range
Unless-Modified-Since
BackgroundTransferService
リクエストの制限
アプリ内では5個まで
デバイス内では500個まで
デバイス内で同時転送は2個まで
HTTPのヘッダー数は15個まで
HTTPのヘッダーサイズは各16KBまで
BackgroundTransferService
ネットワークの制限
2G、EDGE、Standard GPRSはNG
3G以上はNG
5 MB より大きいファイルの場合、サーバー側で content-length ヘッダーが必要
5 MB より大きいファイルの場合、サーバー側で範囲ヘッダーが必要
BackgroundTransferService
使い方
1. BackgroundTransferRequestを生成
var request = new BackgroundTransferRequest(uri);
2. Requestに対しもろもろの設定(ダウンロードの場合)
request.Method = “GET”;
request.DownloadLocation = “保存する場所”;
request.TransferPreferences = 転送の条件;
3. BackgroundTransferServideに追加
BackgroundTransferService.Add(request);
BackgroundTransferService
アーキテクチャBackgroundTransferService
アプリケーション システム
・BackgroundTransferService
Add(request)
Remove(request)
Upload or Download
・BackgroundTransferRequest
event TransferStatusChanged
event TransferProgressChanged
1.登録
2.状態の変化を通知
3.終了したら削除
Completed
役割
指定した時刻に通知してくれる
定期的に指定することも可
AlarmとRemainderの2つ
Alarmは指定した時刻に音楽を鳴らす目覚まし時計のような用途
Reminderは友達との約束や仕事の予定などのスケジュールを目的とした用途
Alarm・Reminder
制約
登録できる数はアプリケーション内で50個まで
Alarm・Reminder
for (int i = 0; i < 50; i++)
{
name = System.Guid.NewGuid().ToString();
Alarm alarm = new Alarm(name);
alarm.Content = "コンテンツ";
alarm.Sound = new Uri("/Ringtones/music.mp3", UriKind.Relative);
alarm.BeginTime = beginTime;
alarm.ExpirationTime = expirationTime;
alarm.RecurrenceType = recurrence;
ScheduledActionService.Add(alarm);
}
51個目で例外InvalidOperationException!
実装サンプル(Alarm)
String name = System.Guid.NewGuid().ToString();
Alarm alarm = new Alarm(name);
alarm.Content = “コンテンツ”;
alarm.RecurrenceType = [毎日|毎週|毎月|月末|毎年];
alarm.Sound = new Uri(“音楽ファイル", UriKind.Relative);
alarm.BeginTime = 開始時間;
alarm.ExpirationTime = 期限;
ScheduledActionService.Add(alarm);
Alarm・Reminder
実装サンプル(Reminder)
String name = System.Guid.NewGuid().ToString();
Reminder reminder = new Reminder(name);
reminder.Title = “タイトル”;
reminder.Content =“コンテンツ”;
reminder.RecurrenceType = [毎日|毎週|毎月|月末|毎年];
reminder.BeginTime = 開始時間;
reminder.ExpirationTime = 期限;
reminder.NavigationUri = ナビゲート先;
ScheduledActionService.Add(reminder);
Alarm・Reminder
アーキテクチャAlarm・Reminder
アプリケーション
システム
Add(Alarm or Reminder)
・ScheduledActionService
フォアグラウンド
Alarm
Reminder
Remove(Alarm or Reminder)
1.登録
2.通知
3.必要がなくなったら削除
デバッグの方法
タスクが実行されるタイミングを待ってられない!
指定した時間(今からの時間で指定)に実行するLaunchForTestがある
ScheduledActionService.LaunchForTest(task.Name, TimeSpan.FromSeconds(20));
注意
ServiceにAddしたものは自分でRemoveしなければならない
制限が厳しいので制限に引っかかりそうな処理には必ずtry-catchで例外を受け止めること
バックグラウンドの定義はWPAppManifest.xmlに記述してある
参考
Windows Phone のバックグラウンド エージェントの概要http://msdn.microsoft.com/ja-jp/library/hh202942(v=vs.92).aspx
Windows Phone のバックグラウンド オーディオの概要http://msdn.microsoft.com/ja-jp/library/hh394039(v=vs.92)
Streaming Audio in Windows Phonehttp://msdn.microsoft.com/en-us/magazine/hh852599.aspx
Windows Phone のバックグラウンド ファイル転送の概要http://msdn.microsoft.com/ja-jp/library/hh202955(v=vs.92)
Developing for 256-MB Deviceshttp://msdn.microsoft.com/en-us/library/hh855081(v=vs.92)
Windows Phone のアラームとリマインダーの概要http://msdn.microsoft.com/ja-jp/library/hh202946(v=vs.92)
Windows Phone のマルチタスキングhttp://msdn.microsoft.com/ja-jp/library/hh202866(v=vs.92).aspx
Windows Phone のバックグラウンド エージェントのベスト プラクティスhttp://msdn.microsoft.com/ja-jp/library/hh202944(v=vs.92)