LifeCycle - DrumMidiEditor/DrumMidiEditorApp GitHub Wiki

アプリのインスタンス化

https://docs.microsoft.com/ja-jp/windows/apps/windows-app-sdk/applifecycle/applifecycle-instancing

Windows App SDKでは、既定で単一インスタンスアプリとなる。
Windows App SDKは、[Microsoft.Windows.AppLifeycle.AppInstance]クラスで管理

GetInstancesでは、キーが登録されているかどうかにかかわらず、
AppInstance API を使用しているアプリの実行中のすべてのインスタンスが返されます。
これには現在のインスタンスを含めることができます。
現在のインスタンスを一覧に含める場合は、AppInstance.GetCurrent を呼び出します。
同じアプリの異なるバージョンごと、および異なるユーザーによって起動されるアプリの
インスタンスごとに別々のリストが保持されます。

// GetInstancesに現在のインスタンスを追加と記載があったが
// 実行しないでも登録されている?
//AppInstance.GetCurrent();

// AppInstanceに登録されているインスタンスの一覧
foreach ( var instance in AppInstance.GetInstances() )
{
    Log.Info( $"ProcessId={instance.ProcessId}, Key={instance.Key}, IsCurrent={instance.IsCurrent}" );
}

リッチアクティベーション

https://docs.microsoft.com/ja-jp/windows/apps/windows-app-sdk/applifecycle/applifecycle-rich-activation

パッケージ アプリのアクティブ化は、UWP の 44のアクティブ化の種類すべてがサポートされている。

すべてのアプリでは、既定で、アクティブ化の種類 Launch がサポートされます。
パッケージ アプリでは、アプリケーション マニフェストのエントリを使用して
追加のアクティブ化の種類を登録できます。

このアプリで使うとしたらこれかな

  • CommandLineLaunch
    コマンド ラインからアプリ起動
    Windows 10 バージョン 1709 (10.0.16299) で導入

  • File
    アプリは、このアプリを処理するために登録されているファイルの種類を持つファイルを起動

  • Launch
    ユーザーがアプリを起動したか、コンテンツ タイルをタップ

  • ToastNotification
    アプリは、ユーザーがトースト通知の本文をタップしたとき
    またはトースト通知内でアクションを実行したときにアクティブ化されました。
    Windows 10バージョン 1507 (10.0.10240) で導入

アクティブ化の登録は、ユーザーごとに行います。
アプリが複数のユーザーにインストールされている場合は
ユーザーごとにアクティブ化を再登録する必要があります。

電源管理

https://docs.microsoft.com/ja-jp/windows/apps/windows-app-sdk/applifecycle/applifecycle-power

アプリの再起動

https://docs.microsoft.com/ja-jp/windows/apps/windows-app-sdk/applifecycle/applifecycle-restart

restart API を使用すると
再起動されたインスタンスに任意のコマンド ライン文字列を提供する機能を含め
コマンドで自身を終了および再起動できます。

var restartArgsInput = string.Empty;

// アプリ起動時のコマンドライン引数を取得
var commandLineArguments = Environment.GetCommandLineArgs();

if ( commandLineArguments.Length > 1 )
{
    commandLineArguments = commandLineArguments.Skip( 1 ).ToArray();

    restartArgsInput = string.Join( ",", commandLineArguments );
}

// アクティブ化時の引数を取得
var activatedArgs = AppInstance.GetCurrent().GetActivatedEventArgs();

switch ( activatedArgs.Kind )
{
    case ExtendedActivationKind.Launch:
        {
            if ( activatedArgs.Data is ILaunchActivatedEventArgs launchArgs )
            {
                var argStrings = launchArgs.Arguments.Split();

                if ( argStrings.Length > 1 )
                {
                    argStrings = argStrings.Skip( 1 ).ToArray();

                    restartArgsInput = string.Join( ",", argStrings.Where( s => !string.IsNullOrEmpty( s ) ) );
                }
            }
        }
        break;
}

// アプリ再起動
var restartError = AppInstance.Restart( restartArgsInput );

switch ( restartError )
{
    case AppRestartFailureReason.RestartPending:
        Log.Error( "Another restart is currently pending." );
        break;
    case AppRestartFailureReason.InvalidUser:
        Log.Error( "Current user is not signed in or not a valid user." );
        break;
    case AppRestartFailureReason.Other:
        Log.Error( "Failure restarting." );
        break;
}