Palm Programmer's Laboratory
Palm OS Programmer's Companion Volume I/7-4
7-4 カード上のアプリケーション
拡張カードボリュームの /PALM/Launcher ディレクトリにある Palm OSアプリケーションは、ハンドヘルドの拡張スロットにカードが挿入されるとランチャの独立したカテゴリに表示されます。それらのアプリケーションのアイコンをタップすると、アプリケーションはメインメモリにコピーされてから実行されます。
カードから起動されるアプリケーション(“カード起動”アプリケーション)には、まず最初にアプリケーションが保存されているボリュームの参照番号とアプリケーションのフルパス名を含むパラメータブロックとともに、 sysAppLaunchCmdCardLaunch 起動コードが送られます。この起動コードを処理する時点では、アプリケーションはユーザーと対話したり大域にアクセスするべきではありません。アプリケーションの start フラグ(これはパラメータブロックの一部です)に sysAppLaunchStartFlagNoUISwitch がセットされていない限り、アプリケーションにはその後で sysAppLaunchCmdNormalLaunch 起動コードが送られます。これが、アプリケーションが(必要なら)ユーザーと対話すべきタイミングです。sysAppLaunchCmdCardLaunch を受信した時になんらかの状態を保存しておき、sysAppLaunchCmdNormalLaunch を受信した時にその状態を使用したい場合があるかもしれません。
訳注:最後の文は尻切れトンボのような感じですが、 訳が悪いせいかもしれません。
ユーザーが別のアプリケーションに切り替えると、カード起動アプリケーションはメモリから消去されます。しかし、カード起動アプリケーションが作成したデータベースはメモリに残留します。
この“コピーして実行”というプロセスには、以下のような注意点があります。
- 実行するアプリケーションのための十分なメモリ領域が必要です。アプリケーションを受け入れるだけの十分なメモリ領域がハンドヘルドにないと、拡張カードからのコピーは行なわれず、アプリケーションは起動されません。
- コピー処理に時間がかかります。大きなアプリケーションの場合、アプリケーションが実際に起動されるまでに明らかな遅延を生じる場合があります。
- カード上のアプリケーションのあるバージョンがすでにメインメモリ上に存在する場合、ランチャはダイアログを表示してメインメモリ内のバージョンを上書きするかどうかの選択をユーザーに求めます。
- カード起動アプリケーションのライフタイムは限られていて、メインメモリ上に存在しているのは実行中だけになります。ユーザーが別のアプリケーションに切り替えると、それまで実行されていたカード起動アプリケーションはメインメモリから消去されます。カード起動アプリケーションが再び起動されると、再度ハンドヘルドのメモリへのコピーが行なわれます。
- “レガシー”な ―― すなわち、カードから起動されていることに気付かないような ―― アプリケーションは、メインメモリ内のデータベースだけで動作します。関連するデータベースはアプリケーションにバンドルされていない限りメインメモリにはコピーされません。カード起動アプリケーションによって作成されたデータベースはデータベースとともに削除されませんが、残されたデータはその後のアプリケーションの実行時に利用することができます。VFSマネージャを利用するように実装されたアプリケーションは拡張カード上のデータを読み書きできるため、この制限は通常レガシーなアプリケーションだけに当てはまります。バンドルデータベースはアプリケーションとともにメインメモリにコピーされますが、これは(ゲームのレベル情報のように)変更されない静的なデータベースという意味なので、コピーによってカードに戻されることはありません。バンドルデータベースはユーザーがアプリケーションを切り替えた時点で単純に削除されます。データベースをアプリケーションにバンドルするには、データベースにアプリケーションと同じクリエータIDを設定し、dmHdrAttrBundle ビットをセットします。そして、そのデータベースをアプリケーションとともに /PALM/Launcher ディレクトリに置きます。
- カード起動アプリケーションは実行中でない限り、ノティフィケーションや起動コードを受信することはありません。なぜなら実行中でなければハンドヘルド上に存在していないからです。特に、これらのアプリケーションはノティフィケーションを受けず、アラームがトリガーされても受信しません。