アプリケーションの起動プロセス

WindowsRuntimeの起動プロセス

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

 

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

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

27

実行中か判断

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

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

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

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

ApplicationクラスとAppクラス

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

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

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

//App.g.i.csファイル(ビルド時に自動生成)

pubic static class Program{
    static void Main(String[] args){
        Windows.UI.Xaml.Application.Start((p)=>new App());
    }
}

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

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

 

OnWindowCreatedメソッド

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

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

//Applicationクラスのoverride(Appクラスに書く)
protected override void OnWindowCreated(WindowCreatedEventArgs args)
{
    base.OnWindowCreated(args);

}

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

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

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

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

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

22

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

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

CoreApplication.GetCurrentView().IsHosted

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

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

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

protected override void OnLaunched(LaunchActivatedEventArgs e)
{
    base.OnLaunched(e);

    //通常起動の場合
    if (e.Kind == ActivationKind.Launch)
    {
    }
}

 

 

OnLaunchedメソッド

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

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

//メインビューアクティブ化の場合呼ばれる
protected override void OnLaunched(LaunchActivatedEventArgs e)
{
        Frame rootFrame = Window.Current.Content as Frame;

        if (rootFrame == null)
        {
            rootFrame = new Frame();
            rootFrame.CacheSize = 1;

            Window.Current.Content = rootFrame;
        }

        if (rootFrame.Content == null)
        {
#if WINDOWS_PHONE_APP

           if (rootFrame.ContentTransitions != null)
           {
                this.transitions = new TransitionCollection();
                foreach (var c in rootFrame.ContentTransitions)
                {
                    this.transitions.Add(c);
                }
            }

            rootFrame.ContentTransitions = null;
            rootFrame.Navigated += this.RootFrame_FirstNavigated;
#endif

            if (!rootFrame.Navigate(typeof(MainPage), e.Arguments))
            {
                throw new Exception("Failed to create initial page");
            }
        }

        Window.Current.Activate();
}

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

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

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

 

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

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

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

protected virtual void OnCachedFileUpdaterActivated(CachedFileUpdaterActivatedEventArgs args);
protected virtual void OnFileActivated(FileActivatedEventArgs args);
protected virtual void OnFileOpenPickerActivated(FileOpenPickerActivatedEventArgs args);
protected virtual void OnFileSavePickerActivated(FileSavePickerActivatedEventArgs args);
protected virtual void OnSearchActivated(SearchActivatedEventArgs args);
protected virtual void OnShareTargetActivated(ShareTargetActivatedEventArgs args);
protected virtual void OnWindowCreated(WindowCreatedEventArgs args);

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

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

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

protected override void OnFileActivated(Windows.ApplicationModel.Activation.FileActivatedEventArgs args)
{
    base.OnFileActivated(args);

    Frame rootFrame = Window.Current.Content as Frame;
    if (rootFrame == null)
    {
        rootFrame = new Frame();
        rootFrame.CacheSize = 1;
        Window.Current.Content = rootFrame;
    }
    rootFrame.Navigate(typeof(MainPage));
    Window.Current.Activate();
    
}

 

その他のアクティブ化

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

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

protected override void OnActivated(Windows.ApplicationModel.Activation.IActivatedEventArgs e)
{
    base.OnActivated(e);

    Frame rootFrame = Window.Current.Content as Frame;
    if (rootFrame == null)
    {
        rootFrame = new Frame();
        rootFrame.CacheSize = 1;
        Window.Current.Content = rootFrame;
    }

    rootFrame.Navigate(typeof(MainPage));
    Window.Current.Activate();
    
}

 

目次

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください