SlideShare uma empresa Scribd logo
1 de 56
Baixar para ler offline
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
タスクを処理するエージェント
                            Agentはバックグラウ
AudioPlayerAgent            ンドでの処理を行うク
オーディオプレイヤー専用のエージェント               ラス


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

BackgroundTransferService
ファイル転送用のAPI
                            Serviceはバックグラ
Alarm、Reminder              ウンドへの処理の授受
                               を行うクラス
指定した時刻に通知するAPI
ScheduledTaskAgent
AudioPlayerAgent
AudioStreamingAgent
BackgroundTransferService
Alarm、Reminder


各エージェントの説明
ScheduledTaskAgent
役割                       ScheduledTaskAgent




 任意の処理をバックグラウンドで行うことが
 できる
 バックグラウンドの処理の実行を制御するた
 めに2つのタスクが存在する
 定期的に処理を実行するPeriodicTask
 長時間処理を行うResourceInsentiveTask
 最もプログラマーにとって融通の効くエー
 ジェント
制約              ScheduledTaskAgent




 メモリの上限は6MB
 2週間ごとに再スケジュールが必要
 2回連続でクラッシュすると登録が解除さ
 れる
PeriodicTaskについて   ScheduledTaskAgent




  定期的な間隔で小さな処理を行うのに向い
  ている
  例えばデバイスの位置の更新
PeriodicTaskの制約    ScheduledTaskAgent




  30分間隔で実行
                  30分
  最大で10分のずれ

  25秒間実行
  バッテリーセーブモードでは実行できない
  かも
  デバイスで決められた数(最低6個)まで
  登録できる
ResourceInsentiveTask           ScheduledTaskAgent

               あんなこと    そんなこと        できます!


  ある程度の長い時間(10分)処理できる
  タスク
  例えばデータをすべて同期するなどの処理
  に向いている
  制約が厳しいので実行されないケースも想
  定する必要がある
  利用するケースとしては寝ている間に実行
  する
ResourceInsentiveTaskの制約   ScheduledTaskAgent

 条件は非常に厳しいので実行されないケースも

  時間は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)            1.登録
                                             Task
      Add(ResourceInsentiveTask)             Task

・ScheduledAction.IsScheduled
                                   4.確認
     ScheduledActionはTaskの基底クラス



エージェント(ScheduledTaskAgent)
                                   2.呼び出し
 OnInvoke(task)
 {
   Task別に処理
                                   3.結果を返す
     NotifyComplete() or Abort()
 }
AudioPlayerAgent
役割                   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


// コンストラクタでイベントを設定
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;
    }
}
バックグラウンド側の実装             AudioPlayerAgent




 OnUserActionの実装
 OnPlayStateChangedの実装
 OnErrorの実装
OnUserActionの実装                                                                 AudioPlayerAgent

 ユーザーの操作によって発生したイベントに対応する処理を実装する
 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();
 }
OnPlayStateChangedの実装                                                         AudioPlayerAgent

 プレイヤーの状態に変更があったときの処理を実装する
 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();
 }
OnErrorの実装                                        AudioPlayerAgent

ダウンロードに失敗したときなどのためのエラー処理を実装する
protected override void OnError(
BackgroundAudioPlayer player, AudioTrack track,
Exception error, bool isFatal)
{
    if (isFatal)
    {
         Abort();
    }
    else
    {
         NotifyComplete();
    }
}
アーキテクチャ                                      AudioPlayerAgent
アプリケーション                          システム

BackgroundAudioPlayer.Instance
   Play                   1.イベント登録
                                     Zune Media Queue
   Pause
   SkipNext
   event PlayStateChanged
                                 4.イベント通知
             UIの更新


 エージェント(AudioPlayerAgent)

  • OnUserAction                 2.呼び出し
  • OnPlayStateChanged
  • OnError
                                 3.結果を返す
   NotifyComplete() or Abort()
AudioStreamingAgent
役割                  AudioStreamingAgent




 ストリーミング専用のエージェント
 Windows Phoneでは対応していない形式の
 ファイルを再生するのに利用するらしい…
制約                     AudioStreamingAgent




 時間は無制限
 最大で15MBのメモリ制限
 ただしデバッグ実行中は無制限
 MediaElementとの同居は不可
使い方                                                        AudioStreamingAgent

AudioPlayerAgentの実装も必要!
AudioPlayerAgentはユーザーの操作への応答に必要。
 既存のプロジェクトにオーディオストリーミング
 エージェントを追加



  参照に追加するのを忘れずに!                                                Uriをnullに設定す
                                                                ることで
 アプリケーション側からイベント発生                                              AudioStreaminAge
  BackgroundAudioPlayer.Instance.Track =                        ntを呼び出す

             new AudioTrack(null, "title", null, null, null);

 バックグラウンド側でイベント処理
  OnBeginStreamingの処理を追加
アーキテクチャ                                          AudioStreamingAgent
アプリケーション                              システム

・BackgroundAudioPlayer.Instance
                                     1.登録
   .Track = new AudioTrack(null, …
                                            Zune Media Queue
   event PlayStateChanged
                                     6.完了通知


 エージェント(AudioStreamingAgent)
                                     2.呼び出し
  • OnBeginStreaming
    MediaStreamSourceをセットする
                                     3.完了

 エージェント(AudioPlayerAgent)
  • OnUserAction                     4.再生開始
  • OnPlayStateChanged
  • OnError
                                     5.再生完了
   NotifyComplete() or Abort()
BackgroundTransferService
役割                           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



アップロード
 5MBまで

ダウンロード
 接続     外部電源   制限
 3G     ー      20MB
 WiFi   なし     100MB
リクエストの制限         BackgroundTransferService




 アプリ内では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

    ・BackgroundTransferRequest
      event TransferProgressChanged
      event TransferStatusChanged
                                      2.状態の変化を通知
                         Completed

   Add(request)                              Upload or Download
                                      1.登録




    Remove(request)
                          3.終了したら削除
Alarm・Reminder
役割                    Alarm・Reminder




 指定した時刻に通知してくれ
 る
 定期的に指定することも可
 AlarmとRemainderの2つ
 Alarmは指定した時刻に音楽
 を鳴らす目覚まし時計のよう
 な用途
 Reminderは友達との約束や仕
 事の予定などのスケジュール
 を目的とした用途
制約                                                                      Alarm・Reminder




 登録できる数はアプリケーション内で50
 個まで
 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)                                     Alarm・Reminder

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);
実装サンプル(Reminder)                                  Alarm・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
フォアグラウンド                                システム


                                       2.通知




                                               Alarm
                                               Reminder
 アプリケーション

 ・ScheduledActionService
                                       1.登録
           Add(Alarm or Reminder)

           Remove(Alarm or Reminder)     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 Phone
  http://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 Devices
  http://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)
ご清聴ありがとうございました。

Mais conteúdo relacionado

Mais procurados

OpenStackクラウド基盤構築ハンズオンセミナー 第1日:ハンズオンNo1
OpenStackクラウド基盤構築ハンズオンセミナー 第1日:ハンズオンNo1OpenStackクラウド基盤構築ハンズオンセミナー 第1日:ハンズオンNo1
OpenStackクラウド基盤構築ハンズオンセミナー 第1日:ハンズオンNo1Etsuji Nakai
 
OpenStackクラウド基盤構築ハンズオンセミナー 第2日:ハンズオンNo1
OpenStackクラウド基盤構築ハンズオンセミナー 第2日:ハンズオンNo1OpenStackクラウド基盤構築ハンズオンセミナー 第2日:ハンズオンNo1
OpenStackクラウド基盤構築ハンズオンセミナー 第2日:ハンズオンNo1Etsuji Nakai
 
RでGPU使ってみた
RでGPU使ってみたRでGPU使ってみた
RでGPU使ってみたKazuya Wada
 
OpenStackクラウド基盤構築ハンズオンセミナー 第1日:講義No2
OpenStackクラウド基盤構築ハンズオンセミナー 第1日:講義No2OpenStackクラウド基盤構築ハンズオンセミナー 第1日:講義No2
OpenStackクラウド基盤構築ハンズオンセミナー 第1日:講義No2Etsuji Nakai
 
Stack Buffer OverFlow
Stack Buffer OverFlowStack Buffer OverFlow
Stack Buffer OverFlowsounakano
 
【Photon勉強会】FFGMでも採用!1時間でわかるPlugin開発とEnterprise Cloudの詳解
【Photon勉強会】FFGMでも採用!1時間でわかるPlugin開発とEnterprise Cloudの詳解【Photon勉強会】FFGMでも採用!1時間でわかるPlugin開発とEnterprise Cloudの詳解
【Photon勉強会】FFGMでも採用!1時間でわかるPlugin開発とEnterprise Cloudの詳解GMO GlobalSign Holdings K.K.
 
第7回oss貢献者賞 森-20120316
第7回oss貢献者賞 森-20120316第7回oss貢献者賞 森-20120316
第7回oss貢献者賞 森-20120316ksk_ha
 
Pacemaker NextGen OSC2012TokyoFall-20120908
Pacemaker NextGen OSC2012TokyoFall-20120908Pacemaker NextGen OSC2012TokyoFall-20120908
Pacemaker NextGen OSC2012TokyoFall-20120908ksk_ha
 
Linux-HA Japanプロジェクトのこれまでとこれから
Linux-HA JapanプロジェクトのこれまでとこれからLinux-HA Japanプロジェクトのこれまでとこれから
Linux-HA Japanプロジェクトのこれまでとこれからksk_ha
 
OpenStackクラウド基盤構築ハンズオンセミナー 第1日:ハンズオンNo2
OpenStackクラウド基盤構築ハンズオンセミナー 第1日:ハンズオンNo2OpenStackクラウド基盤構築ハンズオンセミナー 第1日:ハンズオンNo2
OpenStackクラウド基盤構築ハンズオンセミナー 第1日:ハンズオンNo2Etsuji Nakai
 

Mais procurados (12)

OpenStackクラウド基盤構築ハンズオンセミナー 第1日:ハンズオンNo1
OpenStackクラウド基盤構築ハンズオンセミナー 第1日:ハンズオンNo1OpenStackクラウド基盤構築ハンズオンセミナー 第1日:ハンズオンNo1
OpenStackクラウド基盤構築ハンズオンセミナー 第1日:ハンズオンNo1
 
Puppetのススメ
PuppetのススメPuppetのススメ
Puppetのススメ
 
OpenStackクラウド基盤構築ハンズオンセミナー 第2日:ハンズオンNo1
OpenStackクラウド基盤構築ハンズオンセミナー 第2日:ハンズオンNo1OpenStackクラウド基盤構築ハンズオンセミナー 第2日:ハンズオンNo1
OpenStackクラウド基盤構築ハンズオンセミナー 第2日:ハンズオンNo1
 
RでGPU使ってみた
RでGPU使ってみたRでGPU使ってみた
RでGPU使ってみた
 
OpenStackクラウド基盤構築ハンズオンセミナー 第1日:講義No2
OpenStackクラウド基盤構築ハンズオンセミナー 第1日:講義No2OpenStackクラウド基盤構築ハンズオンセミナー 第1日:講義No2
OpenStackクラウド基盤構築ハンズオンセミナー 第1日:講義No2
 
Stack Buffer OverFlow
Stack Buffer OverFlowStack Buffer OverFlow
Stack Buffer OverFlow
 
【Photon勉強会】FFGMでも採用!1時間でわかるPlugin開発とEnterprise Cloudの詳解
【Photon勉強会】FFGMでも採用!1時間でわかるPlugin開発とEnterprise Cloudの詳解【Photon勉強会】FFGMでも採用!1時間でわかるPlugin開発とEnterprise Cloudの詳解
【Photon勉強会】FFGMでも採用!1時間でわかるPlugin開発とEnterprise Cloudの詳解
 
第7回oss貢献者賞 森-20120316
第7回oss貢献者賞 森-20120316第7回oss貢献者賞 森-20120316
第7回oss貢献者賞 森-20120316
 
Pacemaker NextGen OSC2012TokyoFall-20120908
Pacemaker NextGen OSC2012TokyoFall-20120908Pacemaker NextGen OSC2012TokyoFall-20120908
Pacemaker NextGen OSC2012TokyoFall-20120908
 
Linux-HA Japanプロジェクトのこれまでとこれから
Linux-HA JapanプロジェクトのこれまでとこれからLinux-HA Japanプロジェクトのこれまでとこれから
Linux-HA Japanプロジェクトのこれまでとこれから
 
OpenStackクラウド基盤構築ハンズオンセミナー 第1日:ハンズオンNo2
OpenStackクラウド基盤構築ハンズオンセミナー 第1日:ハンズオンNo2OpenStackクラウド基盤構築ハンズオンセミナー 第1日:ハンズオンNo2
OpenStackクラウド基盤構築ハンズオンセミナー 第1日:ハンズオンNo2
 
Cedec2013 photon network engine
Cedec2013 photon network engineCedec2013 photon network engine
Cedec2013 photon network engine
 

Destaque

Webサーバーの構築
Webサーバーの構築Webサーバーの構築
Webサーバーの構築Kiyokazu Kaba
 
第5回ビジプレ すべては最高の未来につながっている 2016.6.19岐阜
第5回ビジプレ すべては最高の未来につながっている 2016.6.19岐阜第5回ビジプレ すべては最高の未来につながっている 2016.6.19岐阜
第5回ビジプレ すべては最高の未来につながっている 2016.6.19岐阜Kambashi Kazuhiro
 
プログラマーのための色彩 #1
プログラマーのための色彩 #1プログラマーのための色彩 #1
プログラマーのための色彩 #1Kiyokazu Kaba
 
ウェブ開発の次なる主戦場、Open Social
ウェブ開発の次なる主戦場、Open Socialウェブ開発の次なる主戦場、Open Social
ウェブ開発の次なる主戦場、Open SocialFITEA
 
Microsoftのクラウド戦略
Microsoftのクラウド戦略Microsoftのクラウド戦略
Microsoftのクラウド戦略FITEA
 
誰にでもできるパフォーマンスチューニング
誰にでもできるパフォーマンスチューニング誰にでもできるパフォーマンスチューニング
誰にでもできるパフォーマンスチューニングKiyokazu Kaba
 
Windows phone apps 開発秘話
Windows phone apps 開発秘話Windows phone apps 開発秘話
Windows phone apps 開発秘話Kiyokazu Kaba
 

Destaque (9)

Webサーバーの構築
Webサーバーの構築Webサーバーの構築
Webサーバーの構築
 
第5回ビジプレ すべては最高の未来につながっている 2016.6.19岐阜
第5回ビジプレ すべては最高の未来につながっている 2016.6.19岐阜第5回ビジプレ すべては最高の未来につながっている 2016.6.19岐阜
第5回ビジプレ すべては最高の未来につながっている 2016.6.19岐阜
 
プログラマーのための色彩 #1
プログラマーのための色彩 #1プログラマーのための色彩 #1
プログラマーのための色彩 #1
 
ウェブ開発の次なる主戦場、Open Social
ウェブ開発の次なる主戦場、Open Socialウェブ開発の次なる主戦場、Open Social
ウェブ開発の次なる主戦場、Open Social
 
Microsoftのクラウド戦略
Microsoftのクラウド戦略Microsoftのクラウド戦略
Microsoftのクラウド戦略
 
誰にでもできるパフォーマンスチューニング
誰にでもできるパフォーマンスチューニング誰にでもできるパフォーマンスチューニング
誰にでもできるパフォーマンスチューニング
 
Windows phone apps 開発秘話
Windows phone apps 開発秘話Windows phone apps 開発秘話
Windows phone apps 開発秘話
 
VRDC2016
VRDC2016VRDC2016
VRDC2016
 
MVVM入門
MVVM入門MVVM入門
MVVM入門
 

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

とある帽子の大蛇料理Ⅱ
とある帽子の大蛇料理Ⅱとある帽子の大蛇料理Ⅱ
とある帽子の大蛇料理ⅡMasami Ichikawa
 
Stagefright入門
Stagefright入門Stagefright入門
Stagefright入門l_b__
 
夜子まま塾講義12(broadcast reciever)
夜子まま塾講義12(broadcast reciever)夜子まま塾講義12(broadcast reciever)
夜子まま塾講義12(broadcast reciever)Masafumi Terazono
 
Unixカーネルの設計 7 プロセスの制御
Unixカーネルの設計 7 プロセスの制御Unixカーネルの設計 7 プロセスの制御
Unixカーネルの設計 7 プロセスの制御Norito Agetsuma
 
イベント駆動プログラミングとI/O多重化
イベント駆動プログラミングとI/O多重化イベント駆動プログラミングとI/O多重化
イベント駆動プログラミングとI/O多重化Gosuke Miyashita
 
Nseg20120929
Nseg20120929Nseg20120929
Nseg20120929hiro345
 
Flex with Google App Engine for Java
Flex with Google App Engine for JavaFlex with Google App Engine for Java
Flex with Google App Engine for JavaTakeya Waki
 
環境構築自動化ツールのご紹介
環境構築自動化ツールのご紹介環境構築自動化ツールのご紹介
環境構築自動化ツールのご紹介Etsuji Nakai
 
WebRTC UserMedia Catalog: いろんなユーザメディア(MediaStream)を使ってみよう
WebRTC UserMedia Catalog: いろんなユーザメディア(MediaStream)を使ってみようWebRTC UserMedia Catalog: いろんなユーザメディア(MediaStream)を使ってみよう
WebRTC UserMedia Catalog: いろんなユーザメディア(MediaStream)を使ってみようmganeko
 
Ec cube開発合宿 プラグインセミナー
Ec cube開発合宿 プラグインセミナーEc cube開発合宿 プラグインセミナー
Ec cube開発合宿 プラグインセミナーAyumu Kawaguchi
 
20130329 rtm2
20130329 rtm220130329 rtm2
20130329 rtm2openrtm
 
2015 0228 OpenStack swift; GMO Internet Services
2015 0228 OpenStack swift; GMO Internet Services2015 0228 OpenStack swift; GMO Internet Services
2015 0228 OpenStack swift; GMO Internet ServicesNaoto Gohko
 
Programming camp Codereading
Programming camp CodereadingProgramming camp Codereading
Programming camp CodereadingHiro Yoshioka
 
Android勉強会 1
Android勉強会 1Android勉強会 1
Android勉強会 1shotaueda3
 

Semelhante a Windows phoneのバックグラウンドエージェントについて (20)

とある帽子の大蛇料理Ⅱ
とある帽子の大蛇料理Ⅱとある帽子の大蛇料理Ⅱ
とある帽子の大蛇料理Ⅱ
 
Heap statsfx analyzer
Heap statsfx analyzerHeap statsfx analyzer
Heap statsfx analyzer
 
Stagefright入門
Stagefright入門Stagefright入門
Stagefright入門
 
perfを使ったPostgreSQLの解析(後編)
perfを使ったPostgreSQLの解析(後編)perfを使ったPostgreSQLの解析(後編)
perfを使ったPostgreSQLの解析(後編)
 
20081003
2008100320081003
20081003
 
Android gameprogramming
Android gameprogrammingAndroid gameprogramming
Android gameprogramming
 
夜子まま塾講義12(broadcast reciever)
夜子まま塾講義12(broadcast reciever)夜子まま塾講義12(broadcast reciever)
夜子まま塾講義12(broadcast reciever)
 
Unixカーネルの設計 7 プロセスの制御
Unixカーネルの設計 7 プロセスの制御Unixカーネルの設計 7 プロセスの制御
Unixカーネルの設計 7 プロセスの制御
 
RecentApps
RecentAppsRecentApps
RecentApps
 
Flashup 8
Flashup 8Flashup 8
Flashup 8
 
イベント駆動プログラミングとI/O多重化
イベント駆動プログラミングとI/O多重化イベント駆動プログラミングとI/O多重化
イベント駆動プログラミングとI/O多重化
 
Nseg20120929
Nseg20120929Nseg20120929
Nseg20120929
 
Flex with Google App Engine for Java
Flex with Google App Engine for JavaFlex with Google App Engine for Java
Flex with Google App Engine for Java
 
環境構築自動化ツールのご紹介
環境構築自動化ツールのご紹介環境構築自動化ツールのご紹介
環境構築自動化ツールのご紹介
 
WebRTC UserMedia Catalog: いろんなユーザメディア(MediaStream)を使ってみよう
WebRTC UserMedia Catalog: いろんなユーザメディア(MediaStream)を使ってみようWebRTC UserMedia Catalog: いろんなユーザメディア(MediaStream)を使ってみよう
WebRTC UserMedia Catalog: いろんなユーザメディア(MediaStream)を使ってみよう
 
Ec cube開発合宿 プラグインセミナー
Ec cube開発合宿 プラグインセミナーEc cube開発合宿 プラグインセミナー
Ec cube開発合宿 プラグインセミナー
 
20130329 rtm2
20130329 rtm220130329 rtm2
20130329 rtm2
 
2015 0228 OpenStack swift; GMO Internet Services
2015 0228 OpenStack swift; GMO Internet Services2015 0228 OpenStack swift; GMO Internet Services
2015 0228 OpenStack swift; GMO Internet Services
 
Programming camp Codereading
Programming camp CodereadingProgramming camp Codereading
Programming camp Codereading
 
Android勉強会 1
Android勉強会 1Android勉強会 1
Android勉強会 1
 

Último

20240412_HCCJP での Windows Server 2025 Active Directory
20240412_HCCJP での Windows Server 2025 Active Directory20240412_HCCJP での Windows Server 2025 Active Directory
20240412_HCCJP での Windows Server 2025 Active Directoryosamut
 
PHP-Conference-Odawara-2024-04-000000000
PHP-Conference-Odawara-2024-04-000000000PHP-Conference-Odawara-2024-04-000000000
PHP-Conference-Odawara-2024-04-000000000Shota Ito
 
新人研修のまとめ 2024/04/12の勉強会で発表されたものです。
新人研修のまとめ       2024/04/12の勉強会で発表されたものです。新人研修のまとめ       2024/04/12の勉強会で発表されたものです。
新人研修のまとめ 2024/04/12の勉強会で発表されたものです。iPride Co., Ltd.
 
Amazon SES を勉強してみる その12024/04/12の勉強会で発表されたものです。
Amazon SES を勉強してみる その12024/04/12の勉強会で発表されたものです。Amazon SES を勉強してみる その12024/04/12の勉強会で発表されたものです。
Amazon SES を勉強してみる その12024/04/12の勉強会で発表されたものです。iPride Co., Ltd.
 
IoT in the era of generative AI, Thanks IoT ALGYAN.pptx
IoT in the era of generative AI, Thanks IoT ALGYAN.pptxIoT in the era of generative AI, Thanks IoT ALGYAN.pptx
IoT in the era of generative AI, Thanks IoT ALGYAN.pptxAtomu Hidaka
 
プレイマットのパターン生成支援ツールの評価
プレイマットのパターン生成支援ツールの評価プレイマットのパターン生成支援ツールの評価
プレイマットのパターン生成支援ツールの評価sugiuralab
 
プレイマットのパターン生成支援ツール
プレイマットのパターン生成支援ツールプレイマットのパターン生成支援ツール
プレイマットのパターン生成支援ツールsugiuralab
 

Último (7)

20240412_HCCJP での Windows Server 2025 Active Directory
20240412_HCCJP での Windows Server 2025 Active Directory20240412_HCCJP での Windows Server 2025 Active Directory
20240412_HCCJP での Windows Server 2025 Active Directory
 
PHP-Conference-Odawara-2024-04-000000000
PHP-Conference-Odawara-2024-04-000000000PHP-Conference-Odawara-2024-04-000000000
PHP-Conference-Odawara-2024-04-000000000
 
新人研修のまとめ 2024/04/12の勉強会で発表されたものです。
新人研修のまとめ       2024/04/12の勉強会で発表されたものです。新人研修のまとめ       2024/04/12の勉強会で発表されたものです。
新人研修のまとめ 2024/04/12の勉強会で発表されたものです。
 
Amazon SES を勉強してみる その12024/04/12の勉強会で発表されたものです。
Amazon SES を勉強してみる その12024/04/12の勉強会で発表されたものです。Amazon SES を勉強してみる その12024/04/12の勉強会で発表されたものです。
Amazon SES を勉強してみる その12024/04/12の勉強会で発表されたものです。
 
IoT in the era of generative AI, Thanks IoT ALGYAN.pptx
IoT in the era of generative AI, Thanks IoT ALGYAN.pptxIoT in the era of generative AI, Thanks IoT ALGYAN.pptx
IoT in the era of generative AI, Thanks IoT ALGYAN.pptx
 
プレイマットのパターン生成支援ツールの評価
プレイマットのパターン生成支援ツールの評価プレイマットのパターン生成支援ツールの評価
プレイマットのパターン生成支援ツールの評価
 
プレイマットのパターン生成支援ツール
プレイマットのパターン生成支援ツールプレイマットのパターン生成支援ツール
プレイマットのパターン生成支援ツール
 

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

  • 1. Windows Phoneのバックグラウ ンドエージェントについて Metro スタイルへ続く…
  • 6. バックグラウンドでできないこと いっぱい! \(*T▽T*)/
  • 7. バックグラウンドでできないこと カメラ センサー(加速度、コンパス、ジャイロ) ブラウザ LauncherとChooser Xna ナビゲーション クリップボード … Windows Phone のバックグラウンド エージェントのサポートされない API http://msdn.microsoft.com/ja-jp/library/hh202962(v=vs.92).aspx
  • 8. バックグラウンド処理の実装の種類 ScheduledTaskAgent タスクを処理するエージェント Agentはバックグラウ AudioPlayerAgent ンドでの処理を行うク オーディオプレイヤー専用のエージェント ラス AudioStreamingAgent ストリーミング専用のエージェント BackgroundTransferService ファイル転送用のAPI Serviceはバックグラ Alarm、Reminder ウンドへの処理の授受 を行うクラス 指定した時刻に通知するAPI
  • 11. 役割 ScheduledTaskAgent 任意の処理をバックグラウンドで行うことが できる バックグラウンドの処理の実行を制御するた めに2つのタスクが存在する 定期的に処理を実行するPeriodicTask 長時間処理を行うResourceInsentiveTask 最もプログラマーにとって融通の効くエー ジェント
  • 12. 制約 ScheduledTaskAgent メモリの上限は6MB 2週間ごとに再スケジュールが必要 2回連続でクラッシュすると登録が解除さ れる
  • 13. PeriodicTaskについて ScheduledTaskAgent 定期的な間隔で小さな処理を行うのに向い ている 例えばデバイスの位置の更新
  • 14. PeriodicTaskの制約 ScheduledTaskAgent 30分間隔で実行 30分 最大で10分のずれ 25秒間実行 バッテリーセーブモードでは実行できない かも デバイスで決められた数(最低6個)まで 登録できる
  • 15. ResourceInsentiveTask ScheduledTaskAgent あんなこと そんなこと できます! ある程度の長い時間(10分)処理できる タスク 例えばデータをすべて同期するなどの処理 に向いている 制約が厳しいので実行されないケースも想 定する必要がある 利用するケースとしては寝ている間に実行 する
  • 16. ResourceInsentiveTaskの制約 ScheduledTaskAgent 条件は非常に厳しいので実行されないケースも 時間は10分 外部電源が必要 携帯のネットワークでは実行されない バッテリーの電力が90%以上 ロック画面 通話中はNG 途中から携帯のネットワークに変更できな い
  • 17. 使い方 ScheduledTaskAgent 使い方は簡単 既存のプロジェクトにタスクエージェント プロジェクトを追加 参照に追加するのを忘れずに! アプリ側にタスクを登録するコードを追加 バックグラウンドで処理するコードを追加
  • 18. アプリケーション側の実装 ScheduledTaskAgent // すでに登録してあるタスクを削除する var task = ScheduledActionService.Find(“タスク名”) as PeriodicTask; if (task != null) { ScheduledActionService.Remove(task); } // 新しいタスクの登録 task = new PeriodicTask(“タスク名”); task.Description = “バックグラウンドタスクに表示される文字列”; ScheduledActionService.Add(task);
  • 19. バックグラウンド側の実装 ScheduledTaskAgent // クラスは自動で生成される public class ScheduledAgent : ScheduledTaskAgent { protected override void OnInvoke(ScheduledTask task) { // ここでバックグラウンドでの処理を記述する … // 最後に成功したらNotifyComplete、失敗したらAbortを呼ぶ NotifyComplete(); // or Abort(); } }
  • 20. アーキテクチャ ScheduledTaskAgent アプリケーション システム ・ScheduledActionService Add(PeriodicTask) 1.登録 Task Add(ResourceInsentiveTask) Task ・ScheduledAction.IsScheduled 4.確認 ScheduledActionはTaskの基底クラス エージェント(ScheduledTaskAgent) 2.呼び出し OnInvoke(task) { Task別に処理 3.結果を返す NotifyComplete() or Abort() }
  • 22. 役割 AudioPlayerAgent オーディオ専用のバックグラウンドエージェ ント 再生・次の曲・一時停止、などのイベントを 受けて曲を再生したり次の曲を選曲する イベントの発行者は二人 アプリケーションから操作する BackgroundAudioPlayer ハードウェアから操作する Universal Volume Control (UVC)
  • 23. 制約 AudioPlayerAgent 30秒以内で処理 最大で15MBのメモリ制限 ただしデバッグ実行中は無制限
  • 24. 使い方 AudioPlayerAgent 既存のプロジェクトにオーディオファイル 再生エージェントを追加 参照に追加するのを忘れずに! アプリケーション側からイベント発生 バックグラウンド側でイベント処理
  • 25. アプリケーション側の実装 AudioPlayerAgent // 再生ボタンをクリックしたとき private void playButton_Click(object sender, RoutedEventArgs e) { // 再生中の時は停止、停止しているときは再生する if (PlayState.Playing == BackgroundAudioPlayer.Instance.PlayerState) { BackgroundAudioPlayer.Instance.Pause(); } else { BackgroundAudioPlayer.Instance.Play(); } }
  • 26. アプリケーション側の実装 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; } }
  • 27. バックグラウンド側の実装 AudioPlayerAgent OnUserActionの実装 OnPlayStateChangedの実装 OnErrorの実装
  • 28. OnUserActionの実装 AudioPlayerAgent ユーザーの操作によって発生したイベントに対応する処理を実装する 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(); }
  • 29. OnPlayStateChangedの実装 AudioPlayerAgent プレイヤーの状態に変更があったときの処理を実装する 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(); }
  • 30. OnErrorの実装 AudioPlayerAgent ダウンロードに失敗したときなどのためのエラー処理を実装する protected override void OnError( BackgroundAudioPlayer player, AudioTrack track, Exception error, bool isFatal) { if (isFatal) { Abort(); } else { NotifyComplete(); } }
  • 31. アーキテクチャ AudioPlayerAgent アプリケーション システム BackgroundAudioPlayer.Instance Play 1.イベント登録 Zune Media Queue Pause SkipNext event PlayStateChanged 4.イベント通知 UIの更新 エージェント(AudioPlayerAgent) • OnUserAction 2.呼び出し • OnPlayStateChanged • OnError 3.結果を返す NotifyComplete() or Abort()
  • 33. 役割 AudioStreamingAgent ストリーミング専用のエージェント Windows Phoneでは対応していない形式の ファイルを再生するのに利用するらしい…
  • 34. 制約 AudioStreamingAgent 時間は無制限 最大で15MBのメモリ制限 ただしデバッグ実行中は無制限 MediaElementとの同居は不可
  • 35. 使い方 AudioStreamingAgent AudioPlayerAgentの実装も必要! AudioPlayerAgentはユーザーの操作への応答に必要。 既存のプロジェクトにオーディオストリーミング エージェントを追加 参照に追加するのを忘れずに! Uriをnullに設定す ることで アプリケーション側からイベント発生 AudioStreaminAge BackgroundAudioPlayer.Instance.Track = ntを呼び出す new AudioTrack(null, "title", null, null, null); バックグラウンド側でイベント処理 OnBeginStreamingの処理を追加
  • 36. アーキテクチャ AudioStreamingAgent アプリケーション システム ・BackgroundAudioPlayer.Instance 1.登録 .Track = new AudioTrack(null, … Zune Media Queue event PlayStateChanged 6.完了通知 エージェント(AudioStreamingAgent) 2.呼び出し • OnBeginStreaming MediaStreamSourceをセットする 3.完了 エージェント(AudioPlayerAgent) • OnUserAction 4.再生開始 • OnPlayStateChanged • OnError 5.再生完了 NotifyComplete() or Abort()
  • 38. 役割 BackgroundTransferService バックグラウンドでのファイルのアップ ロードとダウンロードが可能 1つのファイルに対し1つの BackgroundTransferRequest ファイルの転送は BackgroundTransferService が担当
  • 39. 制約 BackgroundTransferService HTTP、HTTPSのみ対応 FTPは未対応 ファイルの基点は、”/shared/transfers” HTTPヘッダの予約 If-Modified-Since If-None-Match If-Range Range Unless-Modified-Since
  • 40. ファイルサイズの制限 BackgroundTransferService アップロード 5MBまで ダウンロード 接続 外部電源 制限 3G ー 20MB WiFi なし 100MB
  • 41. リクエストの制限 BackgroundTransferService アプリ内では5個まで デバイス内では500個まで デバイス内で同時転送は2個まで HTTPのヘッダー数は15個まで HTTPのヘッダーサイズは各16KBまで
  • 42. ネットワークの制限 BackgroundTransferService 2G、EDGE、Standard GPRSはNG 3G以上はNG 5 MB より大きいファイルの場合、サー バー側で content-length ヘッダーが必要 5 MB より大きいファイルの場合、サー バー側で範囲ヘッダーが必要
  • 43. 転送速度の制限 BackgroundTransferService ネットワーク 最低データ速度 3G 50Kbps Wi-Fi/ USB 100Kbps
  • 44. 使い方 BackgroundTransferService 1. BackgroundTransferRequestを生成 var request = new BackgroundTransferRequest(uri); 2. Requestに対しもろもろの設定(ダウンロー ドの場合) request.Method = “GET”; request.DownloadLocation = “保存する場所”; request.TransferPreferences = 転送の条件; 3. BackgroundTransferServideに追加 BackgroundTransferService.Add(request);
  • 45. アーキテクチャ BackgroundTransferService アプリケーション システム ・BackgroundTransferService ・BackgroundTransferRequest event TransferProgressChanged event TransferStatusChanged 2.状態の変化を通知 Completed Add(request) Upload or Download 1.登録 Remove(request) 3.終了したら削除
  • 47. 役割 Alarm・Reminder 指定した時刻に通知してくれ る 定期的に指定することも可 AlarmとRemainderの2つ Alarmは指定した時刻に音楽 を鳴らす目覚まし時計のよう な用途 Reminderは友達との約束や仕 事の予定などのスケジュール を目的とした用途
  • 48. 制約 Alarm・Reminder 登録できる数はアプリケーション内で50 個まで 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!
  • 49. 実装サンプル(Alarm) Alarm・Reminder 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);
  • 50. 実装サンプル(Reminder) Alarm・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);
  • 51. アーキテクチャ Alarm・Reminder フォアグラウンド システム 2.通知 Alarm Reminder アプリケーション ・ScheduledActionService 1.登録 Add(Alarm or Reminder) Remove(Alarm or Reminder) 3.必要がなくなったら削除
  • 52. デバッグの方法 タスクが実行されるタイミングを待ってら れない! 指定した時間(今からの時間で指定)に実 行するLaunchForTestがある ScheduledActionService.LaunchForTest( task.Name, TimeSpan.FromSeconds(20));
  • 53. 注意 ServiceにAddしたものは自分でRemoveし なければならない 制限が厳しいので制限に引っかかりそうな 処理には必ずtry-catchで例外を受け止める こと バックグラウンドの定義は WPAppManifest.xmlに記述してある
  • 55. 参考 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 Phone http://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 Devices http://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)