WindowsRuntimeの起動プロセス

WindowsストアアプリやWindowsPhoneアプリなどは、ライブタイルをタップすることで起動したり、共有ターゲットとして起動したりなど、様々な起動方法があります。

 

WindowsRuntimeにおけるアプリの起動は「アクティブ化」と呼ばれます。

WindowsRuntimeのアプリの起動は以下のフローチャートによって表すことができます。

27

実行中か判断

アクティブ化されるときは、まずシステムはアプリが実行中かどうかを判断します。

「アプリが実行中でかつアクティブ化されるとき」というのはイメージしにくいですが、例えばフォアグラウンドで実行しているアプリを、別のアプリに切り替え、別のアプリから先ほどのアプリを共有ターゲットとして呼び出した場合などです。

この場合、最初のアプリはバックグラウンドにまわっただけでまだ実行中なのに別のアプリから共有ターゲットとしてアクティブ化されるので「実行中かつアクティブ化」ということになります。

WindowsRuntimeのアプリのインスタンスは常に1つであり、実行中のアプリとそのアプリが別のアプリから呼び出される共有ターゲットは同一のインスタンスとなります。

ApplicationクラスとAppクラス

もし実行中でないならば、Mainメソッドが呼び出され、ApplicationクラスのStartメソッドが呼び出されます。

WindowsRuntimeのアプリでは、ビルドされたときにApp.g.i.csファイルが作成され、その中にMainメソッドがあります。

Mainメソッド内ではApplicationクラスのStartメソッドでAppクラスを初期化します。

Appクラスのインスタンスは、staticクラスであるApplicationクラスのprivateメンバとして保持されます。

staticクラスであるApplicationクラスによってAppクラスが保持されるため、Appクラスはガベージコレクションによって回収されることはありません。

 

OnWindowCreatedメソッド

その後、OnWindowCreatedメソッドが呼び出されます。

OnWindowCreatedメソッドはApplicationクラスに存在し、Applicationクラスを継承するAppクラスによってoverrideすることができます。

メインビューアクティブ化とホステッドビューアクティブ化

続いてシステムはメインビューアクティブ化かホステッドビューアクティブ化かどうか判断します。

メインビューアクティブ化とは、ユーザーがタイルをタップしてアプリを起動したり、ユーザーがファイルをタップしたときにアプリが起動したときなどのことを指します。

それに対しホステッドビューアクティブ化とは別のアプリが共有チャームから共有コントラクトを呼び出してアプリがアクティブ化されたときや別のアプリからファイルピッカーによってアプリがアクティブ化されたときなど、

別のアプリによってアクティブ化された場合はホステッドビューアクティブ化と呼びます。

22

現在のアプリがメインビューアクティブ化か、ホステッドビューアクティブ化かを調べるには、CoreApplicationViewのIsHostedプロパティを見ればわかります。

メインビューアクティブ化ならFalseでホステッドビューアクティブ化ではTrueになります。

アクティブ化を2つに分類するとメインビューアクティブ化とホステッドビューアクティブ化になりますが、もっと細かくアクティブ化を分類すると以下の起動方法があります。

種類 説明 アクティブ化の種類
Launch ユーザーがライブタイルかセカンダリタイルかトースト通知をタップした時 メインビューアクティブ化
Search ユーザーが検索チャームから検索したとき メインビューアクティブ化
ShareTarget 共有ターゲットとして起動したとき ホステッドビューアクティブ化
File ファイルの関連付けから起動したとき メインビューアクティブ化
Protcol URLスキームのプロトコルによって起動したとき メインビューアクティブ化
FileOpenPicker 別アプリケーションからファイルピッカーとして起動したとき ホステッドビューアクティブ化
FileSavePicker 別アプリケーションからファイルを保存するために起動したとき ホステッドビューアクティブ化
CachedFileUploder アプリケーションによってコンテンツ管理が提供されるファイルを保存しようとしたとき ホステッドビューアクティブ化
ContactPicker 別アプリから連絡先ピッカーとして起動したとき ホステッドビューアクティブ化
Device デバイスを接続したとき自動起動によって起動したとき メインビューアクティブ化
PrintTaskSettings 関連付けられたプリンターが接続されたときに印刷タスクを処理するために起動したとき ホステッドビューアクティブ化
CameraSettings 関連付けられたカメラかが接続されたときキャプチャ処理をするために起動したとき ホステッドビューアクティブ化
RestrictedLaunch 制限された起動をしたとき 不明
AppointmentsProvider 別アプリから予定プロバイダーとして起動したとき(タイムフレームに表示したとき→メインビューアクティブ化、予定ピッカーとして起動したとき→ホステッドビューアクティブ化) 両方
Contact 別アプリから連絡先を使用したタスクをするために起動したとき(メッセージ送信など) メインビューアクティブ化
LockScreenCall マシンをロックしている時に着信した電話に出るなどロック中に起動したとき メインビューアクティブ化
PickerReturned 別アプリのピッカー完了後にアクティブ化された場合(WindowsPhoneのみ) 不明

アプリが、これらのどの起動方法で起動しているのかを調べるには、OnLaunchedなどのアクティブ化メソッドの引数にあるIActivatedEventArgsを実装するインスタンスのKindプロパティを調べると、ActivationKind列挙体によって起動方法をしらべることができます。

 

 

OnLaunchedメソッド

もしメインビューアクティブ化 の場合、ApplicationクラスのOnLaunchedメソッドがよばれます。

OnLaunchedメソッドはAppクラスによってoverrideすることができます。

通常VisualStudioからプロジェクトを作ると、Appクラスは自動生成され、OnLaunchedメソッド内に上記のようなコードが生成されます。

これは、Frameクラスをnewし、Window.Current.Contentプロパティに入れ、PageへNavigateし、Activateメソッドを呼んでいます。

つまり。OnLaunchedメソッドで上記のコードを書かないと、アプリケーションはアクティブ化されますが、どのPageにもNavigateされないアプリが出来上がります。

 

ホステッドビューアクティブ化

ホステッドビューアクティブ化の場合、Applicationクラスにメソッドが用意されている場合とそうでない場合があります。

Applicationクラスには以下のような仮想メソッドがあり、Appクラスでoverrideすることができます。

つまりこれらのメソッドにあるようなアクティブ化の場合、これらのメソッドをoverrideすればアクティブ化を検知することができます。

しかし、通常起動ではないのでOnLaunchedはよばれません。

つまり通常のホステッドビューアクティブ化の場合も、OnLaunchedメソッドで行っているようなFrameを作ってNavigateする処理をしなければいけません。

 

その他のアクティブ化

ファイルの関連付けによる起動や、プロトコルによる起動など、Applicationクラスに仮想メソッドとして用意されていないアクティブ化方法の場合は、ApplicationクラスのOnActivatedメソッドが呼ばれます。

これもOnLaunched同様、Frameを作ってNavigateする処理を書く必要があります。

 

目次