MI-E21のアプリ起動/終了の違い

最終更新日:2001.10.25

前書き

 普通に使っている分にはあまり気になりませんが、 MI-E21は従来機種と比べてアプリの起動/終了にちょっとした違いがあります。 特に常駐アプリがまざってくると、意図しない動きをすることが多いように感じます。

 そこで、通常アプリと常駐アプリの起動/終了を繰り返して MI-E21(11) と MI-E1(18) の挙動とを比較してみました。 推測が多く、正確である保証もありませんが、何らかの傾向はつかめると思います。

使用するアプリ

 通常アプリとして、月の予定表V ver6.61,予定EditorV ver3.4,mabEditorV v3.4,Tree!Explorer を使用します。 常駐アプリとしては 顔文字IT! と カードキーV3.21 を使用することにします。

 なお、これらのアプリを選んだ理由は、クローズボタンを持ち自分自身を完全終了できること、 OUT状態を持つこと(裏にまわった時に終了しないこと)、 顔文字IT! など他アプリを直接呼び出すボタンがあることなど、テストに便利だったからです。 特定のアプリによる問題ではないことを、はじめにお断りしておきます。

テストの方法

 基本的には、インクワープロなどの画面を起点としてアプリを順々に起動していき、 続けてアプリを終了していく際に別の画面に飛んだり変な現象がでないかを調べます。 常駐アプリの終了順変更による違いについても確認します。

 アプリ起動は、基本的にランチャ系ソフトは用いず、 標準インデックスと、SYSTPREF.TXT による起動を利用します。 これは、インデックス経由とキー直接の起動とでは挙動が異なるためです。 本テストでは、機能+戻る で mabEditorV、 機能+決定で月の予定表V、 機能+インデックスで カードキーを起動できるよう SYSTPREF.TXT を設定しています。

 なお、下表の読み方ですが、起動/終了欄はアプリの起動順/終了順を示します。 例えば、起動欄に『インクワープロ→インデックス→mabEditorV』のように書いた場合は、 まずインクワープロ画面に移り、次にインデックスを表示して mabEditorV を起動した…という意味です。 インクワープロ画面からキー割り当て(機能+戻る)で mabEditorV を起動した場合は、 『インクワープロ→mabEditorV』のように記述します。 終了欄には、終了の順番のほか、どの画面に遷移したかなどの情報も記入しています。

起動/終了テスト

1.通常アプリを直接1つ起動してみる

MI-E1起動インクワープロ→mabEditorV
終了mabEditorV→インクワープロ
MI-E21起動インクワープロ→mabEditorV
終了mabEditorV→インクワープロ

 ザウルスでは、画面などの資源を扱う通常アプリは1つだけに限定され、 その他のアプリは裏にまわる(OUT状態)か、プロセス終了します。 インクワープロは前者ですが、他にもOUT状態のアプリがあるにも関わらず 正しくインクワープロに戻ってくるのですから、 1つ前のアプリのことは覚えているようです。

2.通常アプリをインデックス経由で1つ起動してみる

MI-E1起動インクワープロ→インデックス→mabEditorV
終了mabEditorV→インクワープロ
MI-E21起動インクワープロ→インデックス→mabEditorV
終了mabEditorV→インデックス?スケジュール?

 MI-E21では、インデックス画面を経由しただけで インクワープロに戻れなくなってしまいました。 MI-E1 ではインデックスの起動は影響がないのに対し、 MI-E21 では明らかに影響が出るようです。 試しに、カードキーの起動でインデックスを閉じてみた (MI-E21のインデックス画面には『閉じる』ボタンがないため)ところ、 インクワープロではなくスケジュール画面に飛んでしまいました。

3.インデックス経由で通常アプリを起動し、次にインデックスを起動

MI-E1起動インクワープロ→インデックス→mabEditorV→インデックス
終了インデックス→mabEditorV→?スケジュール?
MI-E21起動インクワープロ→インデックス→mabEditorV→インデックス
終了インデックス→mabEditorV→インデックス?スケジュール?

 MI-E1 では2度目のインデックスでインクワープロのことを忘れ去りました。 恐らくは通常アプリでも常駐アプリでも、 何かをアクティブにしたことで1つ前のアプリの情報を忘れる (新規のものを登録したことで追い出された) ものと思われます。 結果、戻り先が不定となり、スケジュールに飛んだのでしょう。

 MI-E21 はテスト2とほぼ同様の結果ですが、 1つ前のアプリを覚えているというだけなら、mabEditorV からインデックスに戻れないはずです。 それが戻れるということは、1つ前のアプリの記憶の仕方に違いがあるのでしょう。

4.通常アプリを2つインデックス経由で起動してみる

MI-E1起動インクワープロ→インデックス→mabEditorV→インデックス→Tree!Explorer
終了Tree!Explorer→mabEditorV→?スケジュール?
MI-E21起動インクワープロ→インデックス→mabEditorV→インデックス→Tree!Explorer
終了Tree!Explorer→インデックス?スケジュール?

 インデックス画面がカウントされるかを調べたものがこれです。 MI-E1 では、途中のインデックスは他のアプリと入れ替わりで消えていくためにカウントされないようです。 これに対して MI-E21 では、mabEditorV に戻ることさえできません。

5.通常アプリを2つダイレクトキーで起動してみる

MI-E1起動インクワープロ→mabEditorV→月の予定表
終了月の予定表→mabEditorV→?スケジュール?
MI-E21起動インクワープロ→mabEditorV→月の予定表
終了月の予定表→mabEditorV→?スケジュール?

 MI-E1 でも MI-E21 でも同じ結果が出ました。 3つ以上ダイレクトキーで起動した場合も同様で、 現在アクティブなアプリの1つ前にのみ戻ることができ、 それ以上は戻れずスケジュールに飛んでしまいます。

6.通常アプリを1つと、常駐アプリをダイレクトキーで起動してみる

MI-E1起動インクワープロ→mabEditorV→顔文字IT!
終了顔文字IT!→mabEditorV→?スケジュール?
MI-E21起動インクワープロ→mabEditorV→顔文字IT!
終了顔文字IT!→mabEditorV→インクワープロ

 テスト 5 の2番目の起動を、通常アプリではなく常駐アプリにしたものです。 MI-E1 では同じ結果でしたが、MI-E21 ではインクワープロまで戻ることができます。

 どうやら、MI-E21では自分を起動したアプリに戻ろうとしているようです。

7.通常アプリを1つと、常駐アプリ3つをダイレクトキーで起動してみる

MI-E1起動インクワープロ→mabEditorV→顔文字IT!→カードキー→統合辞典
終了統合辞典→カードキー→顔文字IT!→mabEditorV→?スケジュール?
MI-E21起動インクワープロ→mabEditorV→顔文字IT!→カードキー→統合辞典
終了統合辞典→カードキー→顔文字IT!→mabEditorV→インクワープロ

 常駐アプリを次々に起動してみたのがこのテストです。 やはり MI-E21 では、最初のアプリ(インクワープロ)まで戻れました。

 しかし MI-E1 では、常駐アプリの起動によっても1つ前のアプリの記憶を次々に更新するようです。 常駐アプリを閉じても他の画面に飛ばないため背景は mabEditorV のままですが、 それを終了した瞬間にスケジュールに飛んでしまいます。

8.通常アプリ、常駐アプリ、通常アプリ の順に起動

MI-E1起動インクワープロ→mabEditorV→カードキー→Tree!Explorer
終了Tree!Explorer→?スケジュール?
MI-E21起動インクワープロ→mabEditorV→カードキー→Tree!Explorer
終了Tree!Explorer→?スケジュール?

 常駐アプリのあとに通常アプリを起動してみました。 一見、mabEditorV までは戻れそうに思えるのですが、 ここに落とし穴があります。

 Tree!Explorerは通常アプリです。これを起動したカードキーは常駐アプリです。 Tree!Explorerを終了するとカードキーがアクティブになります…が、 この時、背景には何の通常アプリもいない状態になることに注意してください。

 そこでシステムは仕方なく適当なアプリ(スケジュール)を起動することで場を取り繕い、 かくして mabEditorV へは戻れないというわけです。

9.通常アプリから常駐アプリを起動し、更に終了順を変えてみる

MI-E1起動インクワープロ→mabEditorV→顔文字IT!
終了mabEditorV→(?スケジュール?)→顔文字IT!
MI-E21起動インクワープロ→mabEditorV→顔文字IT!
終了mabEditorV→(インクワープロ)→顔文字IT!→残像が残る

 MI-E1 では、今までのテストと同様の結果です。 通常アプリ mabEditorV を終了したことで(アクティブな通常アプリがなくなり) スケジュール画面に飛びますが、顔文字IT! は綺麗に終了できます。

 MI-E21 では、 通常アプリを先に終了したことで1つ前の通常アプリ(インクワープロ)に移りました。 これは テスト 6 と同様です。 しかし、顔文字IT! を終了した時にインクワープロの画面が再描画されることと、 なぜか画面上に顔文字IT!の残像(絵)が残ってしまうという問題が発生します。

 テスト 6 との違いは 顔文字IT! の終了タイミングだけですから、 終了の順番に関係があるはずです。 よくよく調べてみると、 顔文字IT!を終了した際、 それを起動したアプリをアクティブにしようとして失敗したことがわかりました。 つまり、mabEditorV をアクティブにしたいのに、 既に終了しているためお手上げになった…というわけです。

 この結果、1つ前のアプリに関する情報は全てクリアされて、 適当な通常アプリがアクティブになります。 一瞬画面が点滅したように感じたのは、システムがインクワープロを再起動したためです。

 MI-E21 では常駐アプリについても、 自分を起動したアプリに戻ろうとする性質があるようです。

10.MORE通常アプリから通常・常駐アプリを起動し、終了順を変えてみる

MI-E1起動インクワープロ→月の予定表→mabEditorV→顔文字IT!
終了mabEditorV→(?スケジュール?)→顔文字IT!
MI-E21起動インクワープロ→月の予定表→mabEditorV→顔文字IT!
終了mabEditorV→(月の予定表)→顔文字IT!→残像が残る→月の予定表→終了できない

 まず、mabEditorV を終了することで 月の予定表 の画面に移ります。 ここで 顔文字IT! を終了すると、テスト 9 と同様に、月の予定表 が再描画されて 顔文字IT! の残像が残ってしまいます。 そして更に 月の予定表 を終了しようとクローズボタンを押すと、 画面が再描画されて残像は消えるものの、月の予定表 を終了することができなくなっています!

 実は…これも テスト 9 と同じことで、 顔文字IT! 終了時に mabEditorV をアクティブにしようとして失敗したため、 1つ前のアプリに関する情報をクリアして、適当な通常アプリを表に出したのです。 この場合は、月の予定表が唯一のアクティブな通常アプリになります。

 クローズボタンを押しても終了できないのは、 アクティブな通常アプリがなくなることを防ぐ MI-E21 の保護機構が働いたためでしょう。 画面が再描画される瞬間をよく見ると、一度終了してまたすぐ再起動されています。 つまり、クローズボタンで一度は終了したんだけれど、 現在アクティブになれる通常アプリがわからないため、 今のアプリを再び起動している…ということです。

 言われてみれば確かにそうですが、 MI-E1 ではこうした場合は スケジュールに飛んでいましたので、 MI-E21 では「なぜ終了できないんだ?」と感じてしまうのです。

結果考察

 以上のテスト結果から、次のようなことが見えてくるかと思います。

MI-E1 の場合

 MI-E1 を含む従来機では、1つ前のアプリを覚えておく記憶領域があるように見えます。 この領域はアプリを起動(通常、常駐どちらも)した際に更新されるため、 1つ前には戻れますがそれ以上は戻れません。 戻り先が不定な場合は、スケジュールに戻ります。

 1つ前のアプリが常駐アプリだった場合は、 常駐アプリだけが画面に出ることは許されない(通常アプリが背景に必要)ため、 スケジュールを表に出すことで対処します。 常駐アプリの終了時は、背景に通常アプリがいますので、単に終了するだけです。

MI-E21 の場合

 通常アプリも常駐アプリも、どちらも“自分を起動したアプリ”を覚えているようです。 そして、終了時には自分を起動したアプリに戻ろうとします。 一見するとこれで良さそうに思えるのですが、 インデックスから起動した場合には必ずインデックスに戻るのですから困ります。 しかもインデックスを閉じることができないとなればなおさら。

 自分を起動したアプリが終了している場合は、戻り先不定となりスケジュールに飛びます。 戻り先が常駐アプリだった場合も、背景に通常アプリがいない状態となるため、 MI-E1 と同様にスケジュールに飛んでしまいます。

 テスト 5 でインクワープロまで戻れなかった理由は、 月の予定表を閉じて mabEditorV に戻るまでは良いものの、 その mabEditorV は“月の予定表”によって起動されたのですから、 終了時には月の予定表に戻ろうとして失敗(既に終了しているから)し、 戻り先不定でスケジュールに飛んだものと思われます。

回避策

 通常アプリが終了できなくなるという問題については、 アプリ終了時に単に AppliProcEndReqID するのではなく、 別なアプリをアクティブにしてぬけることで回避できます。 何も指定しないと、元のアプリに戻ろうとして問題を起こすのですから、 明示的に存在するアプリに切り替えてあげるのです。

 例1では、 クローズボタンが押されたら スケジュール に切り替えることで自分を OUT化し、 PIMExecEnd()内で終了か否かを判定した後、自分を 完全終了 させています。 ただし、このように決め打ちしてしまうと、 本来の呼び出し元には戻れないという弊害もあります (逆に見れば、好きなアプリに戻すことが可能です)。

[例1]
BOOLEAN TheEnd = false;

void CLICKBUTTON00BtnSelect()
{
  TheEnd = true;
  Message->CommonMsg.MessageID            = AppliStartupReqID;
  Message->AppliStartupReq.StartCondition = APPLI_NORMAL_START;
  Message->AppliStartupReq.ExecCondition  = APPLI_NORMAL_EXEC;
  Message->AppliStartupReq.ExecAppliName  = 'SCDL';
}

BOOLEAN	PIMExecEnd()
{
  if ( TheEnd ) {
    Message->CommonMsg.MessageID = AppliProcEndReqID;
    Message->AppliProcEndReq.AplFilter = AF_THIS_APPLI;
  }
}
 常駐アプリの場合は、上記と同じ方法ではうまくいかないようです。 本当は MI-E1 のように綺麗に閉じて欲しいのですが、 どうもうまくいきません。 終了する前に常駐ウィンドウを消してしまうか、 終了ではなく OUT化 することで回避するといったところでしょうか。

 MI-E21 の挙動が特に問題となるのは、ランチャ系のソフトでしょう。 別アプリを起動したあと自分が終了してしまうと、 戻るべきアプリがいないという状態になって問題が起きますし、 かと言って OUT状態に移行しただけでは、 呼び出したアプリが終了した時点で再び起動されてしまいます。

 これについてはどう対応したら良いのか不明ですが、 一例としては起動要因を調べて分岐させるという方法があります。 起動要因は次の位置で得られますので、 この値を変数に保存しておき、AppliEndReqID や AppliProcEndReqID であれば、 呼び出したアプリの終了によってアクティブにされたものと判定し、 何もせずに自分を非アクティブにするというものです。

 /* ExecConstruct() の場合 */
 Message->AppliIn.InFactor.DummyEvent.MessageID;

 /* FormOtherEvent() のActivateイベントの場合 */
 Message->AppliActivate.ActiveFactor.DummyEvent.MessageID;

 もっとも…アプリの終了で常駐アプリに戻ってくるというのが そもそもの問題のような気がしますし、 インデックス画面に戻ってくるのも(閉じるボタンがないのも)不便です。 できれば将来のバージョンでは、こうした点を改善して欲しいと思いつつ、 筆を置くこととします。


[ZAURUS] [HOME]