第 9 章 待ち受けアプリケーション
9.2 待ち受けアプリケーションの作成
9.2.2 待ち受けアプリケーションのライフサイクルと状態遷移
以下に、待ち受けアプリケーションの取る 3 つの状態について解説します。
1. 活性化状態
通常のiアプリを実行している時と同様に、待ち受けアプリケーションがキーイベントおよびソフトキーイベ ントを受信することのできる状態です。ソフトキーイベントの処理が待ち受けアプリケーション側に委ねられ るため、ソフトキーラベルの表示も待ち受けアプリケーション側で行います。
2. 非活性化状態
待ち受けアプリケーションは動作を継続しており、画面の表示も待ち受けアプリケーションの指示通り行われ ますが、キーイベントおよびソフトキーイベントは待ち受けアプリケーションには通知されず、ネイティブ OSに通知されます。ソフトキーイベントの処理はネイティブOS側に委ねられるため、待ち受けアプリケーシ ョン側ではソフトキーラベルを設定することはできません。
待ち受けアプリケーションが待ち受け起動された直後は、非活性化状態になっています。
3. 休眠状態
電池の消費を抑えるため、待ち受けアプリケーションの動作は停止しています。画面には、待ち受けアプリケ ーションが休眠状態に入る直前の描画内容が保持されています。休眠状態への遷移は非活性化状態からのみ可 能であり、活性化状態から休眠状態に遷移することはできません。
注意事項:
Copyright Ⓒ 2008-2012 NTT DOCOMO, Inc. All Rights Reserved.
●
非活性化状態ではキーイベントはネイティブOS側に通知されますが、画面の表示は待ち受けアプリケーシ ョンに委ねられています。従って、非活性化状態の待ち受けアプリケーションがユーザーにキー操作を促す ような画面表示を行っていると、ユーザーが誤った操作を行う可能性もあり得ます。使いやすい待ち受けア プリケーションを作成するためには、非活性化状態における画面表示内容についても留意する必要がありま す。●
iアプリ実行中には、アプリケーションプログラムではなくシステム(ネイティブコンポーネントである JAM)がダイアログを表示することがあります。・ HTTP通信時に、BASIC認証によりID・パスワードが求められた場合
・
HTTPS通信時に、サーバーの証明書が完全には安全ではないと判断され、ユーザーに継続可否を確認する必要が生じた場合
・
アプリケーション連携機能など、機能の実行にユーザー確認が必要なAPIをアプリケーションプログラ ムが呼び出した場合待ち受けアプリケーションが非活性化状態にある場合、システムはダイアログを表示することはできません。
その場合は例外が発生しますので注意してください。
待ち受けアプリケーション実行中は、9.2.1 項で解説した状態遷移制御メソッドの呼び出しや各種 システムイベントの発生などによりこれら 3 つの状態の間の遷移が行われます。
以下に、活性化状態、非活性化状態、休眠状態の間の状態遷移の様子を図示します。
図 10: 待ち受けアプリケーションにおける各状態間の状態遷移
活性化状態、非活性化状態、休眠状態の間の状態遷移について以下に解説します。
1. 非活性化状態から活性化状態への遷移
待ち受けアプリケーションが非活性化状態のときに、ユーザーにより切り替えキー操作が行われると活性化状 態へ遷移します。このとき、待ち受けアプリケーションにはシステムイベントMODE_CHANGED_EVENTが通知 されます。
2. 活性化状態から非活性化状態への遷移
非活性化状態
活性化状態 休眠状態
待ち受けアプリケーション起動 ユーザーによる切り替えキー操作
ユーザーによる切り替えキー操作 deactivate()メソッド呼び出し
sleep()メソッド呼び出し
システムイベント発生
中断 再開
中断 再開
中断 再開
サスペンド状態 サスペンド状態
サスペンド状態
Copyright Ⓒ 2008-2012 NTT DOCOMO, Inc. All Rights Reserved.
活性化状態の待ち受けアプリケーションが、MApplication.deactivate()メソッドを呼び出すことで非活 性化状態へ遷移します。非活性化状態の待ち受けアプリケーションがこのメソッドを呼び出しても何もしませ ん。
なお、非活性化状態および休眠状態では切り替えキー操作はキーイベントとして待ち受けアプリケーションに 通知されませんが、活性化状態では切り替えキー操作はキーイベント(KEY_IAPP)として待ち受けアプリケ ーションに通知されます。アプリケーションプログラムは、このキーイベントを受けて
MApplication.deactivate()メソッドを呼び出すようにすることで、ユーザーは切り替えキーを状態切り 替えのためのトグルキーのように使用することができます。その際、MApplication.deactivate()メソッ ドの呼び出しはKEY_IAPPのリリースイベントを受けて行うようにしてください。KEY_IAPPのプレスイベン トを受けてこのメソッドを呼び出すようにしている場合、メーカーによってはプレスイベントに続いて発生す るリリースイベントをシステムが受信し、再度活性化状態に戻ってしまうことがあります。
3. 非活性化状態から休眠状態への遷移
非活性化状態の待ち受けアプリケーションが、MApplication.sleep()メソッドを呼び出すことで休眠状態 へ遷移します。その際、イベントキューに未処理のイベントが蓄えられている場合はそれらは全て破棄されま す。休眠状態に入った待ち受けアプリケーションは、システムイベントが発生するまで停止します。sleep() メソッドを呼び出したスレッドは、システムイベントが発生するとsleep()メソッドから復帰し、それに続 くロジックの処理を再開します。
特定の時間が経過した際に非活性化状態に復帰させたい場合は、sleep()メソッドの前に
MApplication.setWakeupTimer()メソッドを呼び出します。またネイティブの時計の時刻変化に合わせ て非活性化状態に復帰させたい場合は、あらかじめMApplication.setClockTick()メソッドにより時計 イベントを有効化しておく必要があります。
なお、休眠状態に入ると待ち受けアプリケーションのスレッドは全て停止します。イベント処理や描画メソッ ド(Canvas.paint())など、非同期的に実行される可能性のあるスレッドの実行中に休眠状態に入ると、
それらのスレッドも停止しますので注意してください。また、アプリケーションプログラムが通信処理を行っ ている際に休眠状態に入ると、その通信処理は失敗します。
4. 休眠状態から活性化状態への遷移
待ち受けアプリケーションが休眠状態のときに、ユーザーにより切り替えキー操作が行われると活性化状態へ 遷移します。このとき、待ち受けアプリケーションにはシステムイベントMODE_CHANGED_EVENTが通知され ます。sleep()メソッドを呼び出したスレッドは、休眠状態から活性化状態に遷移するとsleep()メソッド から復帰し、それに続くロジックの処理を再開します。sleep()メソッドからの復帰は、
MODE_CHANGED_EVENTの通知に先立って行われます。
なお、システムイベントの詳細については9.2.3項を参照してください。
5. 休眠状態から非活性化状態への遷移
待ち受けアプリケーションが休眠状態のときに、MODE_CHANGED_EVENTおよびFOLD_CHANGED_EVENT(開 状態から閉状態への変化)の2ケース以外システムイベントが発生すると非活性化状態へ遷移します。
sleep()メソッドを呼び出したスレッドは、休眠状態から非活性化状態に遷移するとsleep()メソッドから 復帰し、それに続くロジックの処理を再開します。sleep()メソッドからの復帰は、システムイベントの通知 に先立って行われます。
なお、システムイベントの詳細については9.2.3項を参照してください。
活性化状態から休眠状態へ遷移することはできません。活性化状態の待ち受けアプリケーションが sleep()メソッドを呼び出すと例外が発生します。活性化状態から休眠状態に遷移させたい場合 には、deactivate()メソッドにより一旦非活性化状態に遷移した後で sleep()メソッドを呼び 出すようにしてください。
待ち受けアプリケーションは、自身が現在どのような状態にあるかについて把握する必要がありま
す。MODE_CHANGED_EVENT が通知される契機および deactivate()メソッドを呼び出す契機に
て、自身の状態を適切に管理するようにしてください。
Copyright Ⓒ 2008-2012 NTT DOCOMO, Inc. All Rights Reserved.
各状態からの待ち受けアプリケーションの中断は、以下のような契機で発生します。中断された待 ち受けアプリケーションが再開される際、通常のiアプリの実行が再開される場合と同様に MApplication.resume()メソッドが呼び出されます。
状態 待ち受けアプリケーションの中断が発生する契機
携帯電話が通話着信を受けた場合など、通常のiアプリ実行より高優先度のイベントが発生した 場合
活性化状態
その待ち受けアプリケーションが、MApplication.launch()メソッド以外の、ユーザー操作(確 認ダイアログ操作等)を伴うアプリケーション連携機能のメソッドを呼び出した場合
(このようなメソッドは、非活性化状態で呼び出すことはできません)
携帯電話が通話着信またはメール・メッセージ着信を受けた場合や、スケジュールアラームのア ラーム通知が発生した場合など、非活性化状態・休眠状態のiアプリ実行より高優先度のイベン トが発生した場合
ユーザー操作により、通話発信が行われた場合 非活性化状態
・休眠状態
ユーザー操作により、パケット通信を使用しないアプリケーション(*1)が起動された場合
(*1)パケット通信を使用しないアプリケーションとは、携帯電話に搭載されているネイティブのスケジューラや電卓アプリ ケーションなど、そのアプリケーションの中でパケット通信を行う機能を持たないもの(パケット通信を行う可能性が ないもの)を指します。
中断時の待ち受けアプリケーションの状態が活性化状態または非活性化状態であれば、再開後の状 態は中断前の状態と同じとなります。これに対し、中断時の待ち受けアプリケーションの状態が休 眠状態の場合、再開後の状態は非活性化状態に変化しますので注意してください。休眠状態にある 待ち受けアプリケーションが中断・再開を受けると、 MApplication.sleep()メソッドでブロッ クされているスレッドは sleep()メソッドから復帰し、後続の処理を再開します。
また、各状態にある待ち受けアプリケーションは、以下のような契機で終了します。終了した待ち 受けアプリケーションは、再度待ち受け状態に復帰した際、自動的に再起動されます。
状態 待ち受けアプリケーションが終了する契機
その待ち受けアプリケーションからMApplication.terminate()が呼び出された場合 その待ち受けアプリケーションがMApplication.launch()メソッドによりアプリケーション 連携起動を行った場合(*1)
ユーザーの強制終了操作が行われた場合 接続ケーブルにより外部機器が接続された場合 活性化状態
その待ち受けアプリケーションの内部で、キャッチされない例外・エラーが発生した場合(*2)(*3) その待ち受けアプリケーションからMApplication.terminate()が呼び出された場合 ユーザーのメニュー操作により実行中待ち受けアプリケーションの強制終了が指示された場合 ユーザー操作により、パケット通信を使用するアプリケーション(*4)が起動された場合 接続ケーブルにより外部機器が接続された場合
その待ち受けアプリケーションの内部で、キャッチされない例外・エラーが発生した場合(*2)(*3) 非活性化状態
ユーザーのメニュー操作によりiモード機能やキー操作のロックが掛けられた場合 この場合、ロックが解除されるまで待ち受けアプリケーションは待ち受け起動されません ユーザーのメニュー操作により実行中待ち受けアプリケーションの強制終了が指示された場合 ユーザー操作により、パケット通信を使用するアプリケーション(*4)が起動された場合 休眠状態
接続ケーブルにより外部機器が接続された場合