windows phoneのバックグラウンドエージェントについて

56
Windows Phoneのバックグラウ ンドエージェントについて Metro スタイルへ続く

Upload: kiyokazu-kaba

Post on 05-Jul-2015

1.399 views

Category:

Technology


0 download

DESCRIPTION

2012.06.10 Community Open Dayで発表した資料

TRANSCRIPT

Windows Phoneのバックグラウンドエージェントについて

Metro スタイルへ続く…

Twitter: @kabakiyo(かばちゅ~)

ブログ:遅咲きのエンジニア

Windows Phone

アジェンダ

バックグラウンドエージェントの概要

バックグラウンドエージェントの実装方法

バックグラウンドエージェントとは

Windows Phoneでフォアグランドで動くアプリは一つだけ。バッググラウンドでも処理をするために搭載された機能がバックグラウンドエージェント。

一部のバックグラウンドの機能がWindows

Phone OS 7.0から組み込まれてはいたが、開発者が扱えるようになったのはWindows

Phone OS 7.1から、と思われる。

バックグラウンドでできること

オーディオの再生アプリケーションが終了していても音楽を再生することができる

タスクの実行定期的な間隔で処理を実行できる

ファイル転送ファイルのダウンロードやアップロードの最中にアプリケーションが閉じられても継続的に処理する

アラームなどの通知指定した時刻にユーザーに通知する

バックグラウンドでできないこと

いっぱい!

\(*T▽T*)/

カメラ

センサー(加速度、コンパス、ジャイロ)

ブラウザ

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

ScheduledTaskAgent

役割

任意の処理をバックグラウンドで行うことができる

バックグラウンドの処理の実行を制御するために2つのタスクが存在する

定期的に処理を実行するPeriodicTask

長時間処理を行うResourceInsentiveTask

最もプログラマーにとって融通の効くエージェント

ScheduledTaskAgent

制約

メモリの上限は6MB

2週間ごとに再スケジュールが必要

2回連続でクラッシュすると登録が解除される

ScheduledTaskAgent

PeriodicTaskについて

定期的な間隔で小さな処理を行うのに向いている

例えばデバイスの位置の更新

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

AudioPlayerAgent

役割

オーディオ専用のバックグラウンドエージェント

再生・次の曲・一時停止、などのイベントを受けて曲を再生したり次の曲を選曲する

イベントの発行者は二人

アプリケーションから操作するBackgroundAudioPlayer

ハードウェアから操作する

Universal Volume Control

(UVC)

AudioPlayerAgent

制約

30秒以内で処理

最大で15MBのメモリ制限

ただしデバッグ実行中は無制限

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の実装

OnPlayStateChangedの実装

OnErrorの実装

AudioPlayerAgent

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の更新

AudioStreamingAgent

役割

ストリーミング専用のエージェント

Windows Phoneでは対応していない形式のファイルを再生するのに利用するらしい…

AudioStreamingAgent

制約

時間は無制限

最大で15MBのメモリ制限

ただしデバッグ実行中は無制限

MediaElementとの同居は不可

AudioStreamingAgent

使い方

既存のプロジェクトにオーディオストリーミングエージェントを追加

参照に追加するのを忘れずに!

アプリケーション側からイベント発生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.完了通知

BackgroundTransferService

役割

バックグラウンドでのファイルのアップロードとダウンロードが可能

1つのファイルに対し1つのBackgroundTransferRequest

ファイルの転送はBackgroundTransferService が担当

BackgroundTransferService

制約

HTTP、HTTPSのみ対応FTPは未対応

ファイルの基点は、”/shared/transfers”

HTTPヘッダの予約If-Modified-Since

If-None-Match

If-Range

Range

Unless-Modified-Since

BackgroundTransferService

ファイルサイズの制限BackgroundTransferService

接続 外部電源 制限

3G ー 20MB

WiFi なし 100MB

アップロード

5MBまで

ダウンロード

リクエストの制限

アプリ内では5個まで

デバイス内では500個まで

デバイス内で同時転送は2個まで

HTTPのヘッダー数は15個まで

HTTPのヘッダーサイズは各16KBまで

BackgroundTransferService

ネットワークの制限

2G、EDGE、Standard GPRSはNG

3G以上はNG

5 MB より大きいファイルの場合、サーバー側で content-length ヘッダーが必要

5 MB より大きいファイルの場合、サーバー側で範囲ヘッダーが必要

BackgroundTransferService

転送速度の制限

ネットワーク 最低データ速度

3G 50Kbps

Wi-Fi/ USB 100Kbps

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・Reminder

役割

指定した時刻に通知してくれる

定期的に指定することも可

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に記述してある

気になるところ

テスターはどうやってテストしてるんだろう?30分待つの?たくさんタスクを登録して例外が出るときのチェックはしてるのだろうか?

参考

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)

ご清聴ありがとうございました。