雑記 - otherwise

最近はDQ10しかやっていないダメ技術者がちまちまと綴る雑記帳

Windows Phone 8.x 時代の Application Lifecycle

ご無沙汰しております。
最近はすっかり放置気味の本 blog ですが、別に放棄したわけではありませんので何卒。。。
# 相変わらず DQ10 中心の生活を続けているせいで技術ネタにかけている時間がないだけ、と云うのは公然の秘密です。
……さて。
今年も残すところあと 20 日程となりました。
季節はすっかり冬。世の中はクリスマス一色。イルミネーションが綺麗ですねぇ。(涙)
そしてクリスマスと言えば、そう、 Advent Calendar の季節な訳です。
昨年は今年以上に技術ネタから離れた生活をしていた(単に堕落していただけ)ので回避しましたが、今年は Windows Phone にだけ手を挙げてみました。
と云う事で、本記事は Windows Phone Advent Calendar 2014 の 10 日目の担当記事となります。
前日は @icchu さんの WindowsPhone Advent Calendar 2014 ユニバーサル的な小物 Tips でした。
# 前述の通り記事の内容を練っている時間をあまり取れていないので、今回は概論だけでコードなしで行きたいと思います……。 ^^;

そもそも Application Lifecycle とは?

まずここでの Application Lifecycle とは、 1 つのアプリケーションが起動されてから終了されるまでの一連の状態遷移の事で、アプリケーション開発で一般的に用いられる ALM (Application Lifecycle Management) とは別の意味になります。ややこしいですが。。。
従来のデスクトップ環境では、アプリケーションが実行されてから終了するまで、基本的に処理は常に継続する事になっている*1ので、デスクトップアプリケーションの Application Lifecycle は「実行」状態と「終了」状態のみを考えればよく、一般的なアプリケーション開発に於いて Application Lifecycle について細かく意識するケースは少なかったかと思います。
しかし、 Windows 8 以降のストアアプリ (WinRT) では、同時に実行可能なアプリケーションは常に 1 つに限られる様になりました。(タブレット等のリソースが限られた環境での実行を想定するため、バッテリー消費量を抑える目的がある様です)
そのため、アプリケーションの実行状態として、「実行」・「終了」に加えて、「起動されているが実行はされていない」状態(中断)と云う新たな状態が加わる事となり、アプリケーションを開発する上でこの状態を意識した設計が求められる様になりました、
ストアアプリの「中断」は、他のストアアプリが実行された場合以外にも、電源 OFF (サスペンド)等でも発生するため、ほぼ全てのストアアプリがこの「中断」状態を意識すべきだと言えます。

Windows Phone (7.x) の Application Lifecycle

Windows Phone の記事と言っておきながら何の前触れもなくストアプリの話ばかりをしてしまいましたが、 Windows Phone のアプリでも当然 Application Lifecycle を意識する必要があります。*2
ちなみに Windows Phone 7.x (Silverlight) では、 "Tombstone" と呼ばれる状態を設ける事で、中断中のアプリケーションの使用リソースを減らして効率的にアプリケーションを実行する仕組みが提供されていました。
※なお、 Windows Phone 7.x に於ける Application Lifecycle の詳細については以前書いた記事を参照ください。(わんくま同盟東京勉強会 #67 でも詳しくご紹介させていただきました)

Windows Phone 8.x (WinRT) の Application Lifecycle

Windows Phone 8 からは、 "Tombstone" モデルは Silverlight アプリケーションのみでのサポートとなり、 WinRT アプリケーションの Application Lifecycle はストアアプリと同じ構成が採用されています。(プラットフォーム自体が WinRT に統合されているため当然と言えば当然)

Windows Phone 7.x と WinRT での Application Lifecycle の違い

一般的には WinRT では「 3 つの状態を持つ」と表現されます。

実行
文字通りアプリケーションが実行されている状態で、該当するアプリケーションが前面に表示されてアクティブになっている状態になります。
終了
アプリケーションが終了している(=起動してない)状態です。デスクトップアプリケーションで言えば該当するアプリケーションの実行プロセスが存在しない状態に当たります。
中断
アプリケーションは起動されているものの、バックグラウンドにまわっていて実行はされていない状態です。いわば、一時停止の様な状態になります。

これを先の記事にある Windows Phone 7.x のアプリケーションの状態(起動中の状態)と比較すると、「実行 = Running 」、「中断 = Dormant 」に対応します。
Windows Phone 7.x では中断のもう一つの状態として "Tombstone" (起動はされているがアプリケーションのメモリがほぼすべて解放されている状態)がありましたが、 WinRT にはこの状態に該当するものは厳密にはありません。*3
但し、アプリケーションの起動時に、前回の「終了」が「ユーザ操作による終了」だったのか「中断状態からのシステムによる終了状態移行」だったのかを判別する手段が用意されています。
これにより、アプリケーション開発者は "Tombstone" に近い挙動を実装する事が可能になっています。

詳しくは来月のわんくま東京勉強会で

ここまでざっと Windows Phone と WinRT の Application Lifecycle の違いについてざっと紹介しましたが、実装コードや実際の動きを含めてもう少し詳しいお話しを来月のわんくま同盟東京勉強会 #94 (2015/01/24) でご紹介したいと思っています。*4
近日中に募集ページも公開されると思いますので、是非ご参加いただければと思います。

明日の Windows Phone Advent Calendar 2014 は

明日の担当は @saku_karamomo さんです。

*1:多数のプロセスが同時に起動された場合に、一時的にリソースが割り当てられない状態になる事はありますが。

*2:Windows Phone で「中断」状態が導入されたのは 7.5 からのため、実際にはこうした仕組みを導入したのはストアアプリより Windows Phone の方が先です。

*3:WinRT では、 「中断」状態からのメモリ解放時に「終了」状態に移行します。

*4:それまでにはちゃんと時間を取って資料を作ります。。。><