shell は Apollo アプリケーションと OS の仲介役のオブジェクトです。ドキュメントの記述から察するに、今後まだ仕様の追加変更がありそうな予感もしますが、とりあえず主な点をまとめます。
まず、shell オブジェクトはアプリケーション起動時に自動的に生成されますので、明示的に生成する必要はありません。シングルトンオブジェクトとして実装されていて、アクセスは Shell.shell のように行います。
Shell クラスのプロパティとメソッド
shell オブジェクトには以下のプロパティがあります。
id:String // アプリケーション ID activeWindow:NativeWindow // 現在アクティブなウインドウ focusWindow:NativeWindow // 現在フォーカスされているウインドウ autoExit:Boolean // true ならウインドウクローズ時自動的に終了
id はアプリケーション記述ファイル (-app.xml) の name タグの値が設定されます。id はアプリケーションを識別するために使用されるので、他のアプリケーションと被らないような名前にすることが重要です。ですので "com.adobe.apollo.ApplicationName" のような形式の命名が推奨されています。id に使用できる文字は英数字と "." (ドット) と "-" (ハイフン) です。
activeWindow は現在アクティブなウインドウ、focusWindow は現在フォーカスのあるウインドウへの参照です。どちらの属性も対象のウインドウが shell の属するアプリケーションのウインドウでない場合には null が設定されます。
autoExit は、値が true に設定されていると (これがデフォルトです) 全てのウインドウがクローズされた時点で自動的にアプリケーションが終了します。値が false の場合は明示的に Shell.shell.exit() を呼ばないと終了しないという仕様になっています。 ただし、アルファ版ではこれがまだちゃんと動作しないようで、false にすると exit() を呼んでもアプリケーションが終了しません。少なくともアルファ版の間は autoExit には触らない方がよさそうです。
さて、exit() メソッドの呼び出しは戻ります。すなわち、あるイベントハンドラが exit() を呼び出したとすると、そのイベントハンドラの処理が全て終了するまでは、実際のアプリケーションの終了処理は開始されません。
Shell クラスのイベント
Shell クラスには以下のイベントが定義されています。
activate // アプリケーションがアクティブになった deactivate // アプリケーションが非アクティブになった invoke // アプリケーションが起動された networkChange // ネットワークの接続状態が変わった
activate はアプリケーションがアクティブになると、deactivate はアクティブでなくなるとディスパッチされます。アルファ版では、activate と deactivate イベントは最初に作られたアプリケーションウインドウのみディスパッチされるようです。
Invoke イベントはアプリケーション起動時にディスパッチされます。このイベントはリスナが登録されるまで保存されるため、アプリケーション起動後でもちゃんと処理できるようになっています。
Inboke イベントの型は InvokeEvent です。属性として以下の2つを持っています。
arguments:Array // 起動時に渡された引数の配列 currentDirectory:File // 引数内に相対パスがあった際の基準になるディレクトリ
ちなみに Apollo では一つのアプリケーションを複数起動することはできません。代わりに、2回目以降の起動時には、最初に起動したアプリケーションに Invoke イベントが通知されます。
これにより、アプリケーションでは必要に応じて対応することが可能になります。例えば2つ目のアプリケーションウインドウを開くこともできますね。なお、前述のとおりアプリケーションの識別は id 属性により行われます。
最後の一つの networkChange イベントはネットワークの接続状態が変更されたことを通知してくれます。ちょっと乱暴ですがネットワークケーブルを抜いたり差したりするとイベントがディスパッチされるのが確認できます。
コメントする