Unofficial
"CLDC 1.1
+ MIDP 2.0"
API Reference.
(日本語版)

パッケージ javax.microedition.midlet

MIDlet パッケージは Mobile Information Device Profile アプリケーションとアプリケーションを実行する環境(ランタイム環境)とのインタフェースを定義します。

参照先:
          説明

クラスの概要
MIDlet MIDlet は MID Profile アプリケーションです。
 

例外の概要
MIDletStateChangeException 要求された MIDlet の状態移行が失敗あるいは拒否されたことを示す例外です。
 

パッケージ javax.microedition.midlet の説明

MIDlet パッケージは Mobile Information Device Profile アプリケーションとアプリケーションを実行する環境(ランタイム環境)とのインタフェースを定義します。 Mobile Information Device Profile のアプリケーションを MIDlet と言います。

アプリケーション

MIDP はデバイスに関する限られたリソースを複数の MIDP アプリケーションまたは MIDlet によって共有することができるアプリケーション・モデルを定義します。 それは MIDlet が何であるか、どのようにパッケージされるか、どのような実行環境が MIDlet によって利用可能であるか、リソースの管理にデバイスがどのように振舞うべきであるのかを定義します。 アプリケーション・モデルは、スイートを形成する複数の MIDlet を、ただ1つの Java 仮想マシンのコンテキストの中に一緒にパッケージし、どのようにリソースを共有するのかを定義します。 1セットのポリシーおよびコントロールを必要とするクラス・ファイルを、デバイスの限られたリソースとセキュリティ・フレームワークにおいて共有することを可能にします。

MIDP MIDlet スイート

MIDP アプリケーションは、それを開発し、テストし、配布し、そして実行するために MIDP 仕様で規定された機能だけを使用しなければなりません。

MIDlet スイートの要素は以下の通りです:

MIDlet をインストールし、選択し、実行し、削除するためにユーザーが必要とする機能は、各デバイスに実装されると仮定しています。 「アプリケーション管理ソフトウェア」という用語は、これらのデバイス定義の機能について、まとめて言及する際に使用します。 アプリケーション管理ソフトウェアは MIDlet のインストール、開始、停止およびアンインストールするための環境を提供します。 それは MIDlet スイートのインストール、実行および削除の際に発生するエラーを取り扱い、ユーザーと対話する責任があります。 それは MIDP 仕様によって必要とされる Java 実行環境を MIDlet に提供します。

1つまたはそれ以上の MIDlet を1つの JAR ファイルにパッケージすることができます。 MIDlet は MIDlet クラスを拡張するクラスと他のクラスから成り、それぞれが MIDlet にとって必要とされます。 JAR ファイルのマニフェストは MIDlet のインストールと実行の際に使用する属性を含みます。 MIDlet は、アプリケーション管理ソフトウェアによって実行される構成要素です。 MIDlet スイートが呼び出されるとき、クラスを実行する Java 仮想マシンが必要となります。 MIDlet の新しいインスタンスは、アプリケーションによって自身を作成、開始、一時停止および破棄するよう MIDlet に指示するために使用します。

MIDlet 間のデータと他の情報の共有は、個々の API とそれらの実装によって制御されます。 例えば、レコード管理システム API は MIDlet スイートに関連するレコード・ストアを MIDlet 中で共有するときに使用するメソッドを規定しています。

MIDlet スイートのセキュリティ

MIDP 1.0 仕様は、それぞれの MIDlet スイートが MIDlet で利用可能な全てのデバイス・センシティブな機能へのアクセスを防ぐために、サンドボックスによって動作を抑制していました。 そのサンドボックスの概念はこの仕様においても使用します。そして、全ての信頼されていない MIDlet スイートが制限を受けます。 この仕様のあらゆる実装が、信頼されていない MIDlet スイートを動作させることをサポートしなければなりません。

MIDP 2.0 はセンシティブであるとみなして制限する API の使用を許可することができる、信頼するアプリケーションの概念を導入します。 デバイスが MIDlet スイートを信頼すると決定するなら、デバイスはポリシーによって示されるようにアクセスを容認します。 MIDP アプリケーションのためのセキュリティ・セクションは、信頼されていないおよび信頼されているアプリケーションの概念と資格について説明します。

MIDP 実行環境

MIDP は MIDlet に提供される実行環境を定義します。 実行環境は MIDlet スイート中の全ての MIDlet によって共有されます。そして、どのような MIDlet も一緒にパッケージされた他の MIDlet と対話できます。 アプリケーション管理ソフトウェアはアプリケーションを主導して、以下を MIDlet に提供します:

CLDC と Java 仮想マシンはマルチスレッド、ロックと同期、バイト・コードの実行、メソッドのディスパッチなどを提供します。 1つの仮想マシンのスコープは、全てのポリシー、ネーミング、リソース管理です。 デバイスが複数の仮想マシンをサポートするなら、それぞれにはそれぞれ独自のスコープのネーミングおよびリソース管理ポリシーを持つでしょう。 MIDlet スイートは CLDC あるいは MIDP によって定義されたパッケージ中に含まれるクラスを含むことはできません。

MIDP は MIDP API を実装するクラスを提供します。 実装は、アプリケーション・プログラマがこれらの保護されたシステム・パッケージの全てのクラスに対して、オーバーライド、変更、追加できないことを確実にしなければなりません。

ただ1つの JAR ファイルが MIDlet クラスの全てを含みます。 MIDlet は JAR ファイル、MIDP、CLDC の中の全てのクラスのロードおよびメソッドの呼び出しを行うことができます。 これら3つの範囲の中の全てのクラスが、JAR ファイルによる MIDlet の実行環境において共有されます。 それらのクラスを通してアクセス可能な全ての状態が、MIDlet のために動作している全ての Java クラスでも使用可能です。 MIDlet スイートによって使用中の全ての MIDlet、MIDP および CLDC のオブジェクトを含む1つの空間があります。 同時実行問題を避けるために必要であれば、通常の Java ロッキングと同期基本命令を使用すべきです。 各ライブラリは MIDlet がどのように同時実行を扱うのか、そして安全にマルチスレッド環境を実行するために、どのようにそれらを使用すべきであるのかを規定します。

MIDlet のクラス・ファイルは実行するためだけに使用可能であり、リソースとしての読み出し、(実行目的以外の)再利用のための抽出のどちらもできません。 CLDC の実装は常に適切な様式で JAR ファイルの中身を解釈および格納します。

java.lang.Class.getResourceAsStream を使用することで JAR ファイルから Java クラスではないファイルを利用可能です。 例えば、マニフェストをこのように使用することができます。

それが存在しているなら、MIDlet ディスクリプタ・ファイルの中身を javax.microedition.midlet.MIDlet.getAppProperty メソッドで使用可能です。

MIDlet スイート・パッケージ

1つまたはそれ以上の MIDlet が1つの JAR ファイルにパッケージされます:

開発者は利用対象者、デバイス、ネットワーク、ロケールおよび権限のために、適切に JAR ファイルのコンポーネントを作成し、配布する責任があります。 例えば、特定のロケールにおいて、リソース・ファイルをそのロケールに必要である文字列とイメージを含むように変更するでしょう。

JAR マニフェストはアプリケーション管理ソフトウェアによって使用され、MIDlet スイートを識別およびインストールし、アプリケーション・ディスクリプタに存在しない属性のデフォルト属性を定義します。 属性はマニフェストとオプションのアプリケーション・ディスクリプタの両方における使用のために定義されます。

以下に示す事前定義属性によって、アプリケーション管理ソフトウェアは MIDlet を識別、取得、インストールおよび呼び出しを行います。

属性名属性解説
MIDlet-Name ユーザーが MIDlet を識別する MIDlet スイートの名前。
MIDlet-VersionMIDlet スイートのバージョン番号。 バージョン番号は、ユーザーとのコミュニケーションと同様に、インストールとアップグレード用にアプリケーション管理ソフトウェアでそれらを使用できるように書式化します。
MIDlet-VendorMIDlet スイートを提供する組織名。
MIDlet-IconMIDlet スイートを表現する JAR 中の PNG ファイルの大文字小文字を区別する絶対名。 アプリケーション管理ソフトウェアがスイートを特定するためのアイコンを表示するときに使用すべきです。
MIDlet-DescriptionMIDlet スイートの説明文。
MIDlet-Info-URL さらなる MIDlet スイートについて説明する情報への URL。 書式と意味は各体系を定義する各種 RFC と RFC2396 に従わなければなりません。
MIDlet-<n>JAR ファイルの n 番目の名前、アイコンおよびクラスをカンマ区切りで分離記述します。 <n>の最も低い値は 1 でなければならず、そして連続した序数を使用しなければなりません。 最初に欠損したエントリでリストは終了します。 その後(その他)の全ての追加エントリは無視します。 名前、アイコンおよびクラスにおける前後の連続空白は無視します。
  1. 名前はこの MIDlet をユーザーが特定するために使用します。 名前は存在していて非 -null(空であってはいけない)でなければなりません。
  2. アイコンは n 番目の MIDlet のアイコンのための JAR 中のイメージ(PNG)の大文字小文字を区別する絶対パス名です。 アイコンは省略することができます。
  3. クラスは n 番目の MIDlet のための MIDlet クラスを拡張するクラスの名前です。 クラス名は非 -null(空であってはいけない)であり、Java クラス名のための文字だけを含んでいなければなりません。 クラスには public でパラメータを受け取らないコンストラクタが存在していなければなりません。 クラス名は大文字と小文字が区別されます。
MIDlet-Jar-URLJAR ファイルをロードできる URL。 書式と意味は各体系を定義する各種 RFC と RFC2396 に従わなければなりません。 絶対および相対 URL の両方をサポートしなければなりません。 相対的な URL のためのコンテキストはこのアプリケーション・ディスクリプタをロードした URL です。
MIDlet-Jar-SizeJAR ファイルのバイト数。
MIDlet-Data-SizeMIDlet によって必要とされる永続データの最小バイト数。 デバイスはそれ自身のポリシーに応じて追加のストレージ機構を提供することができます。 デフォルトはゼロです。
MicroEdition-Profile システム・プロパティ microedition.profiles と同じ書式と値を使用する、必要な J2ME プロファイル(例えば、"MIDP-2.0")。 デバイスはリストアップされたプロファイルの全てを実装していなければなりません。 プロファイルのいずれかが実装されていないのであれば、インストールは失敗しなければなりません。 複数のプロファイルはブランク(Unicode U+0020)で分離します。
MicroEdition-Configuration システム・プロパティ microedition.configuration と同じ書式と値を使用する、必要な J2ME コンフィギュレーション(例えば、CLDC-1.0)。
MIDlet-PermissionsMIDlet スイートの機能に重要な、ゼロかそれ以上のパーミッション。 用法の詳細については MIDP アプリケーションのためのセキュリティ・セクションを参照してください。
MIDlet-Permissions-OptMIDlet スイートの機能に重要ではない、ゼロかそれ以上のパーミッション。 用法の詳細については MIDP アプリケーションのためのセキュリティ・セクションを参照してください。
MIDlet-Push-<n>MIDlet を登録し、インバウンド接続を扱います。 詳細については PushRegistry を参照してください。
MIDlet-Install-Notify 詳細については OTA 仕様を参照してください。
MIDlet-Delete-Notify 詳細については OTA 仕様を参照してください。
MIDlet-Delete-Confirm 詳細については OTA 仕様を参照してください。

いくつかの属性は複数の値を使用します。それらの属性ではカンマ(Unicode U-002C)によって値を切り離します。 それぞれの値における、前後の空白(Unicode U-0020)およびタブ(Unicode U-0009)は無視します。

バージョン番号の割り振り

バージョン番号には Major.Minor[.Micro]X.X[.X])という書式があります。このうち.Micro 部分は省略することができます(もしも.Micro 部分を省略しないのであれば、デフォルトはゼロとします)。 さらに、バージョン番号の各部分は最大2桁の10進数数字(すなわち、0 から 99)であることが求められます。 バージョン番号は Java(TM) 製品バージョン割り振り仕様 http://java.sun.com/products/jdk/1.2/docs/guide/versioning/spec/VersioningSpecification.html(さかき注:現在リンク切れしています)で説明されています。

例えば MIDlet スイートの最初のバージョンを指定するのに 1.0.0 を使用します。 バージョン番号の各部分において、先行するゼロは有効ではありません。 例えば 088 と等価です。 また 1.01.0.0 と等価です。 しかし 1.11.0.1 ではなく 1.1.0 と等価です。

MIDlet-Version タグが存在しない場合 0.0.0 であると仮定します。これは全てのゼロではないバージョン番号が MIDlet スイートのより新しいバージョンであるとみなすことを意味します。

JAR マニフェスト

マニフェストは JAR ファイルの内容に関する情報を提供します。 JAR ファイルの書式と仕様は http://java.sun.com/products/jdk/1.2/docs/guide/jar/index.html(さかき注:現在リンク切れしています)から得ることができます。 JAR マニフェストに関連する詳細については、JDK JAR マニフェスト文書を参照してください。 MIDP 実装はマニフェストの仕様の定義に基づいて 72 バイト以上の長い行の取り扱いを実装しなければなりません。 属性はマニフェストの中において1回以上存在してはなりません。 属性が重複する場合の効果については不定です。 MIDlet.getAppProperty を使用して要求すると、属性がアプリケーション・ディスクリプタで多重化されていないのであればマニフェストの属性が MIDlet に渡されます。多重化の取り扱いに関してはアプリケーション・ディスクリプタを参照してください。

マニフェストは以下の属性を含まなければなりません:

マニフェストあるいはアプリケーション・ディスクリプタは以下の属性を含まなければなりません:

マニフェストは以下の属性を含むことができます:

例えば、カードゲームを仮定するスイートでのマニフェストは以下の例のようになるでしょう:

MIDlet-Name: CardGames    
MIDlet-Version: 1.1.9    
MIDlet-Vendor: CardsRUS    
MIDlet-1: Solitaire, /Solitare.png, org.cardsrus.games.Solitare     
MIDlet-2: JacksWild, /JacksWild.png, org.cardsrus.games.JacksWild     
MicroEdition-Profile: MIDP-2.0     
MicroEdition-Configuration: CLDC-1.0     
Solitaire-Author: John Q. Public

MIDlet クラス

完全限定クラス名をディレクトリとファイル名にマッピングするということを基本に、MIDlet の全ての Java クラスが標準構造を用いて JAR ファイルに置かれることが求められます。 各ピリオドをスラッシュ(/)に変換し、そして拡張子.class を追加します。 例えば、クラス com.sun.microedition.Test は JAR ファイル中の com/sun/microedition/Test.class に置かれます。

アプリケーション・ディスクリプタ

各 JAR ファイルはアプリケーション・ディスクリプタを伴うことがあります。 アプリケーション・ディスクリプタは MIDlet を管理するためにアプリケーション管理ソフトウェアによって JAR マニフェストと連携して使用し MIDlet 自身のための構成特有の属性として使用します。 ディスクリプタによって、デバイス上のアプリケーション管理ソフトウェアは MIDlet スイートの完全な JAR ファイルをロードする前に MIDlet がデバイスに適合しているか否かを確認することができます。 またディスクリプタによって JAR ファイルを変更せずに、構成特有の属性(パラメータ)を MIDlet に提供することができます。

デバイスが MIDP アプリケーション管理ソフトウェアへ、アプリケーション・ディスクリプタをディスパッチできるようにするため、ファイル拡張子と MIME タイプを IANA に登録済みです:

属性の事前定義セットは MIDlet をアプリケーション管理ソフトウェアが識別、取得およびインストールすることを可能にします。 MIDlet はディスクリプタ・ファイルに存在する全ての属性を入手できます。 開発者はアプリケーション独自定義を目的とする、MIDlet- または MicroEdition で開始しない属性を使用することができます。 属性名は、大文字と小文字を区別し、完全に一致しなければなりません。 属性が重複する場合の効果は不定です。 MIDlet.getAppProperty メソッドを呼び出すことにより、MIDlet が指定した名前の属性を取得できます。

アプリケーション・ディスクリプタは以下の属性を含まなければなりません:

アプリケーション・ディスクリプタは以下の属性を含むことができます:

唯一のアプリケーションを特定するための必須属性である MIDlet-NameMIDlet-Version および MIDlet-Vendor はディスクリプタおよびマニフェスト・ファイルに多重化していなければなりません。 もしそれらが一致しないのであれば(同じアプリケーションではないのだから)その JAR をインストールしてはなりません。

アプリケーション・ディスクリプタにおける、他のマニフェストの属性の多重化は必要ではありません。そして、信頼されていない MIDlet スイートのための、マニフェストおよびディスクリプタ・ファイルには両方に同じ属性を含んでいても、それらの値は異なるかもしれません。 MIDlet スイートが信頼されていないと、ディスクリプタ・ファイルからの値はマニフェスト・ファイルからの値で上書きされます。 MIDlet スイートが信頼されるなら、アプリケーション・ディスクリプタの値はマニフェストの対応する属性値と一致していなければなりません。

MIDlet は MIDlet あるいは関連するコンフィギュレーションとプロファイル(例えば、CLDC と MIDP)仕様に基づいて定義された以外の MIDlet- または MicroEdition から始まるどのような属性も、マニフェストおよびアプリケーション・ディスクリプタに加えてはなりません。 アプリケーション管理ソフトウェアは認識しない属性を無視しなければなりません。

一般的に、アプリケーション・ディスクリプタの書式は、コロンを後置する属性名、属性の値および改行の順に構成されます。 値の前後の空白は無視します。 属性の順序は任意です。

アプリケーション・ディスクリプタを転送および保存するためにエンコードすることが許容されますが、以下の規則を使用し、解析を行う前に Unicode へ変換しなければなりません。 例えば ISO-8859-1 エンコードされたファイルは InputStreamReader に相当するものを通じて適切なエンコードによる読み出しを行う必要があります。 ディスクリプタを転送するためのデフォルト文字エンコードは UTF-8 です。 もしも、それをサポートするなら HTTP によって転送されたディスクリプタは、ストリームを UCS-2 に変換するために Content-Encoding ヘッダや Content-Type ヘッダの charset パラメータなどの HTTP 標準コンテント・ネゴシエーション・メカニズムを使用すべきです。

アプリケーション・ディスクリプタを解析するための BNF
アプリケーション・ディスクリプタ:  * 属性行    
属性行:  属性名 ":" [ 余白 ] 属性値 [ 余白 ] 新しい行
属性名:  1*<制御コードまたはセパレータを除く全ての Unicode 文字>    
属性値: * 値文字 | 値文字 *( 値文字 | 余白 ) 値文字    
値文字: <全ての有効な Unicode キャラクタから制御コードと余白を除いたもの>    
新しい行 = 1* 改行  ; 空行は許容し無視する
改行:   キャリッジ・リターン 行送り | 行送り 
  
キャリッジ・リターン  = <Unicode キャリッジ・リターン (U+000D)>     
行送り  = <Unicode 行送り (U+000A)>     

余白:  1*( 空白 | タブ )
空白  = <Unicode 空白 (U+0020)>
タブ  = <Unicode 水平タブ (U+0009)>
制御コード = <Unicode キャラクタ 
          U+0000 - U+001F および U+007F>
セパレータ: "(" | ")" | "<" |    
            ">" | "@" |   
            "," | ";" | ":" |    
            "'" | <">|    
            "/" | "[" | "]" |    
            "?" | "=" |        
            "{" | "}" | 空白 | タブ

例えば、カードゲームを仮定しているスイートのためのアプリケーション・ディスクリプタは以下のようになるでしょう:

MIDlet-Name: CardGames    
MIDlet-Version: 1.1.9    
MIDlet-Vendor: CardsRUS    
MIDlet-1: Solitaire, /Solitare.png, com.cardsrus.org.Solitare     
MIDlet-2: JacksWild, /JacksWild.png, com.cardsrus.org.JacksWild     
MicroEdition-Profile: MIDP-2.0    
MicroEdition-Configuration: CLDC-1.0    
MIDlet-Description: Really cool card games    
MIDlet-Jar-URL: http://www.cardsrus.com/games/cardgames.jar    
MIDlet-Jar-Size: 7378    
MIDlet-Data-Size: 256

アプリケーションのライフサイクル

各 MIDlet は MIDlet クラスを継承していなければなりません。 MIDlet クラスは MIDlet の適切な開始、停止および破棄を可能にします。 MIDlet は、アプリケーション管理ソフトウェアと意思疎通を図るようにアプリケーション・ディスクリプタの引数で要求することができます。 MIDlet スイートは public static void main() メソッドを持つ必要はありません。 もし存在しているなら、アプリケーション管理ソフトウェアにおいてそれを無視しなければなりません。 アプリケーション管理ソフトウェアは MIDlet を開始するために CLDC が求める初期クラスを提供します

MIDlet スイートがデバイス上にインストールされるとき、クラス、リソース・ファイル、引数および永続的なストレージがデバイスで使用できるように準備します。 ユーザーは MIDlet を、デバイスのアプリケーション管理ソフトウェアを通じて使用することができます。

MIDlet が実行されるとき、MIDlet の最初のクラスのインスタンスは、public で引数のないコンストラクタを使用して作成されます。そして、MIDlet のメソッドを呼び出して、様々な状態の変化を逐次 MIDlet へ伝えます。 MIDlet のメソッドを通して、MIDlet は状態の変化を要求するか、または状態変更をアプリケーション管理ソフトウェアに通知することができます。 MIDlet が完了するか、アプリケーション管理ソフトウェアによって終了するとき、それを破棄します。そして MIDlet が使用していたリソース(作成した全てのオブジェクトおよびクラスを含む)を回収します。 MIDlet は System.exit を呼び出してはなりません。MIDlet が呼び出すと SecurityException を throw します。

通常の状態の Java クラスは、それらのクラスのために、他のクラスがロードされることによる影響を受けることはありません。 全てのクラスに関しても参照するために必要なクラスをロードします。そして、通常の静的初期化が行われます。

javax.microedition.midlet のクラス解説
MIDlet アプリケーション管理ソフトウェアによって、開始、停止および破棄できるようにするために、MIDlet が継承する必要があります。
MIDletStateChangeException アプリケーションが変化の要求を受け入れることができない場合に throw します。

MIDlet のライフサイクル

MIDlet のライフサイクルは、以下のように MIDlet とその環境を通じての手順を定義します。

MIDlet ライフサイクルの定義

以下の定義が MIDlet ライフサイクルの中で使用されます:

MIDlet の状態

MIDlet のステート・マシン(予め決められている複数の状態を、決められた条件に合わせて、決められた状態へ遷移すること)は、アプリケーションの振る舞いが一貫しており、ユーザーが期待するように全てのデバイスにおいてもほぼ同等に動作することを目指して設計されています:

MIDlet の有効な状態は以下の通りです。

状態名

説明

休止

MIDlet は初期化済みであり静止しています。 この場合、共有資源を保持または使用していてはなりません。 この状態へは以下の場合に遷移します:

  • MIDletnew で作成されたあとに。 public で引数のないコンストラクタを呼び出して例外を throw することなく処理が戻った場合。 例外が発生したなら、アプリケーションはすぐに破棄状態に移行して処分されます。
  • アクティブ状態の時に、アプリケーション管理ソフトウェアによる MIDlet.pauseApp() メソッドの呼び出しが成功して処理が戻った場合。
  • アクティブ状態の時に、MIDletMIDlet.notifyPaused() メソッドを呼び出して成功して処理が戻った場合。
  • アクティブ状態の時に、startAppMIDletStateChangeException を throw した場合。

アクティブ

MIDlet は通常どおりに機能しています。 この状態へは以下の場合に遷移します:

  • MIDlet.startApp() メソッドをアプリケーション管理ソフトウェアが呼び出す直前。

破棄

MIDlet はリソースを全て開放して終了します。 この状態へは以下の場合に遷移します:

  • アプリケーション管理ソフトウェアによる MIDlet.destoryApp() メソッドの呼び出しが、unconditional 引数が false かつ MIDletStateChangeException を throw した場合を除いて、成功して処理が戻った場合。 このメソッドは、確保しているリソースを全て開放し、必要なクリーンナップおよびガーベジコレクトを行います。
  • MIDlet.notifyDestroyed() メソッドの呼び出しが成功してアプリケーションに処理が戻る場合。 MIDlet は、このメソッドを呼び出す前に MIDlet.destroyApp() メソッドを呼び出します。

注記:この状態へは1度だけ遷移します。



MIDlet の状態と遷移は次の通りです。




MIDlet ライフサイクル・モデル

MIDlet を実行する典型的な順序は以下の通りです。

アプリケーション管理ソフトウェア

MIDlet

アプリケーション管理ソフトウェアは MIDlet の新しいインスタンスを作成します。

MIDlet のデフォルト(引数のない)のコンストラクタが呼ばれます。 それは休止状態にあります。

アプリケーション管理ソフトウェアは、MIDlet を実行すると決定すると、その MIDlet をアクティブ状態に遷移するために MIDlet.startApp() メソッドを呼び出します。

MIDlet は必要とする全てのリソースを確保し、サービスを開始します。

アプリケーション管理ソフトウェアは、デバイスが電話などの他の機能によって使用されるか、または別の MIDlet を実行できるようにするため、MIDlet が使用しているリソース量を大幅に減少させる必要がある場合があります。 MIDlet.pauseApp メソッドを呼び出すことで、アプリケーション管理ソフトウェアはこの要求を MIDlet に通知します。 MIDlet はこれによって、リソース消費をできる限り下げることが望まれます。

MIDlet はサービスを行うことをやめ、現在確保しているリソースのいくつかを開放します。

アプリケーション管理ソフトウェアは MIDlet が不要となったか、よりプライオリティの高いアプリケーションに必要なリソースを確保する決定をしたため、それを MIDlet.destoryApp メソッドを呼び出すことによって、破棄対象の候補である MIDlet に通知します。

それがそのように設計されているなら、MIDlet は状態の保存またはユーザーの選択とクリーンナップを実行します。

MIDlet インタフェース

アプリケーションを記述する上での注意

アプリケーションは MIDlet メソッドの実行における競合条件を避ける対策を実施すべきです。 それぞれのメソッドが他のメソッドの状態変更による同時実行問題を避けるために、それ自身の同期を取る必要があります。

MIDlet アプリケーションの例

これは、Java 仮想マシンの速度を簡単に測定するために MIDlet ライフサイクルを使用する例です。

import javax.microedition.midlet.*;

/**
 * この MIDlet の例は、簡単なタイミングテストを実行します。アプリケー
 * ション管理ソフトウェアによって開始される際に、テストを行うための
 * 別のスレッドを生成します。このスレッドは、いつテストを終了するか
 * を、アプリケーション管理ソフトウェアに通知します。
 * startApp、pauseApp、destroyApp の各メソッドを使用しますので、それ
 * ぞれの要求をどのように扱って移行するかを確かめてください。
 */
public class MethodTimes extends MIDlet implements Runnable {
    // タイミングテストを行うスレッド
    Thread thread;

    /**
     * Start は、タイミングテストを行うスレッドを作成します。
     * このメソッドはディスパッチャーが止まるのを避けるために直ちに処理を戻すべきです。
     */
    public void startApp() {
        thread = new Thread(this);
        thread.start();
    }

    /**
     * Pause は、スレッドフィールドをクリアしスレッドを停止します。
     * 停止後に処理を再開する場合は最初からやり直します。
     */
    public void pauseApp() {
        thread = null;
    }

    /**
     * Destroy は必要なクリーンナップ処理を全て行います。
     * スレッドは停止され、結果は処理しません。
     */
    public void destroyApp(boolean unconditional) {
        thread = null;
    }

   /**
     * タイミングテストを行います。
     * 単純に 100000 回メソッド呼ぶのにかかる時間を計ります。
     * スレッドが既にカレントのスレッドでない場合は直ちに終了します。
     */
    public void run() {
        Thread curr = Thread.currentThread();  // どのスレッドがカレントであるか取得します。
        long start = System.currentTimeMillis();
        for (int i = 0; i < 100000 && thread != curr; i++) {
            empty();
        }
        long end = System.currentTimeMillis();

        // タイミングテストが終了したか否かを判定します。
        // 終了している場合は何もせずに戻ります。
        // そしてアプリケーションの残りの部分は実行しません。
        if (thread != curr) {
            return;
        }
        long millis = end - start;
        // ここにこの例の範囲の外に経過時間を報告する処理が入ります。

        // 全てが終わったらクリーンナップして終了します。
        destroyApp(true);
        notifyDestroyed();
    }

    /**
     * 空のメソッド。
     */
    void empty() {
    }
}
導入されたバージョン:
MIDP 1.0


Unofficial
"CLDC 1.1
+ MIDP 2.0"
API Reference.
(日本語版)

公式仕様書原文の著作権表記等(※):

Mobile Information Device Profile Specification ("Specification")
Version: 2.0
Status: FCS
Release: November 5, 2002

Copyright 2002 Sun Microsystems, Inc. and Motorola, Inc.
All rights reserved.
※ただしこの API リファレンスは英語仕様を一語一句正確に翻訳したものではなく、一度私が英語の仕様原文を読んだ上で元の意味と構造をなるべく保つように書き起こしたものです。このため一部は完全に異なる説明となっています。また CLDC 1.1 部分は同仕様の範囲外であるため、まったく参考とはしていません。

※仕様書のライセンス上、問題は無いと考えておりますが、万が一問題があるとお考えの関係者の方がいらっしゃいましたらメールにて連絡をいただけると幸いに存じます(第一言語に日本語、第二言語に英語を希望しますが、返信は基本的に日本語で行います)。

この API リファレンスは仕様書の日本語版という位置づけでは作成していませんし、仕様書ほど厳格でもありません。MUST、SHOULD、MAY などの仕様の条件を強調する文を維持していません(反映すらしていない個所もあります)。仮想マシンおよび MIDP の実装のために使用することは避けてください。そのような用途には必ず公式仕様書原文そのものを用いるべきです。
この API リファレンスに記載されている内容は"さかきけい"が Sun Microsystems, Inc や Motorola, Inc、Java Community Process が公開している各種公式資料を元に、独自に調査・編集したものであり、Sun Microsystems, Inc や Motorola, Inc、Java Community Process 等とは一切関係ありません。したがってこの API リファレンスに関する問い合わせを関係各社等に対して行うことを固く禁じます。
また、記載された内容には既知か否かに関らず誤りが含まれる可能性があり、一切保証はありません。本 API リファレンスを使用した結果、不利益が生じたとしても"さかきけい"は一切の責任を負いません。
許可無く公開/非公開および Internet/Intranet/LAN を問わず他サイトに転載すること、複写および複製すること、ローカル・ファイル等に保存することを禁じます。


Copyright© 2001-2002,2005-2009,2011 by KEI SAKAKI.
ALL RIGHTS RESERVED.
無断転載を禁じます。

Unofficial "CLDC 1.0 + MIDP 1.0" API Reference はこちらです。