イベント処理って何だ? - 1 / 2 -
今回は BREW のイベント処理について学びます。
イベントハンドラ
すでに何度も出てきているように、ユーザーがアプレットを開始したり、携帯電話のキーを押したときに、 BREW 実行環境はイベントハンドラを呼び出します。イベントハンドラのプロトタイプは次のようになります。
boolean EventHandler ( IApplet* pApplet, // アプレット構造体 AEEEvent evt, // イベントコード uint16 wParam, // イベント パラメータ (16 ビット) uint32 dwParam // イベント パラメータ (32 ビット) );
※このプロトタイプの説明は、「BREW API リファレンス」の AEEHANDLER の項目、または、 IAPPLET_HandleEvent の項目にあります。
pApplet 引数には IApplet* や AEEApplet*、あるいは、独自のアプレット構造体のポインタを受け取ることになります。この引数に実際に何が渡されるかは、 AEEClsCreateInstance() 関数内で、アプレット構造体として何を作成したかに依存します。このことについては本連載の第3回で解説しましたので、理解が不十分な方は復習しておきましょう。
次に、 evt 引数ですが、これは通知されたイベントの種類を表す定数です。これを "イベントコード" と呼びます。例えば、「ユーザーが携帯電話のキーを押しましたよー」というイベントであれば、 EVT_KEY というイベントコードが渡されます。 BREW で定義されているイベントコードについては、後ほど詳しく説明します。
wParam と dwParam 引数は、 "イベントパラメータ" といって、イベントに付随するさまざまな情報を格納している引数で、その意味はイベントコードにより異なります。例えば、「ユーザーが携帯電話のキーを押しましたよー」というイベントであれば、 wParam に押したキーの種類を表す定数が渡されます。
イベントハンドラでは長時間の処理をしてはいけない
イベントハンドラを記述するときに注意しなければならないのは、「イベントハンドラでは、長時間に渡る処理をしてはいけない」ということです。一つのイベントに対して、長い処理を行いますと、 BREW 実行環境は、アプレットを強制的に終了させてしまいます。これは、携帯電話の機能が麻痺しないように保護するためです。
実際にどれくらいの処理時間までが許可されるかは端末により異なりますが、だいたい 1 秒以内に処理すべきだといわれているようです。
それでは、ファイルシステムの読み書きやネットワーク通信などの、時間のかかる処理はどのように行ったらよいでしょうか。いくつか方法があります。
- タイマーやユーザー定義のイベントを利用して、時間のかかる処理を細切れにして処理する。
- 非同期関数を使用する。
これらは高度な話題ですので、本連載では扱わないことにします。
関連情報:"第 11 回 TCP / IP ネットワークプログラミング"
BREW で定義されているイベント
BREW のイベントの一覧を調べてみましょう。「BREW API リファレンス」を開いて、左側の目次から、 [データ型] - [イベントコード] を選択します。イベントコードの表が表示されます。
イベントコードを調べる別の方法としては、 BREW SDK をインストールしたフォルダの inc\AEE.h ファイルを開いて "AEE Events" という部分を検索してみましょう。イベントコードの一覧が記述されています(このようにヘッダーファイルを調べてみることは、 BREW SDK をよく理解する上で役に立ちます。ドキュメントに記述がない情報が書かれていることもあります)。
以下が、BREW の主なイベントです。
イベントコード | 説明 |
---|---|
EVT_APP_START | BREW アプリが起動されました。 |
EVT_APP_STOP | ユーザーが BREW アプリを終了します。 |
EVT_APP_SUSPEND | BREW アプリを中断します。 |
EVT_APP_RESUME | 中断した BREW アプレットを再開します。 |
EVT_KEY | ユーザーが何かのキーを押しました。 |
EVT_KEY_PRESS | ユーザーが何かのキーを押下しました。 |
EVT_KEY_RELEASE | ユーザーが何かのキーを離しました。 |
EVT_CHAR | ユーザーが何かの文字キーを押しました。 |
EVT_USER | ユーザー定義のイベントが発生しました。 |
アプレットの開始イベント
アプレットが開始しますと、イベントコード EVT_APP_START が通知されます。アプレットの初期化処理を行いたい場合、ここで行うことができます。
イベント パラメータですが、「BREW API リファレンス」には、「wParam=0、dwParam = const char* (引数)」と書かれていますが、これは誤りです。
実際には、 EVT_APP_START イベントの wParam には 0 が渡され、 dwParam には AEEAppStart* が渡されます。 AEEAppStart は次のような構造体です。
typedef struct _AEEAppStart { int error; // 起動エラーを返す AEECLSID clsApp; // アプレット ID IDisplay * pDisplay; // IDisplay オブジェクト AEERect rc; // アプレットの長方形領域 const char * pszArgs; // アプレットに渡された引数 } AEEAppStart;
この構造体は、別の BREW アプレットから起動されるときに重要になるものです。アプリ間連携を行うのでなければ、使うことはないでしょう。
アプレットの終了イベント
アプレットが終了しますと、イベントコード EVT_APP_STOP が通知されます。アプレットの終了処理を行いたい場合、ここで行うことができます。イベントパラメータについては、「BREW API リファレンス」に以下のように書かれています。
wParam = 0、dwParam = boolean * (アプリケーションが今終了するか、後で終了するかを指定するフラグ。 デフォルトは今)
dwParam は、イベントを受け取ったハンドラが、 BREW 実行環境に値を返すためのものです。このポインタに FALSE を返すことで、 EVT_APP_STOP イベントを受け取っても、「た、頼む、終了しないでくれぇ」と懇願することができますが、通常はこのパラメータは使用しません。