ホーム > デベロッパ > J2ME / MIDP プログラミング > 第 1 回

第 1 回 : 携帯 Java と IM

はじめに

本連載では、モバイル・インスタントメッセンジャーを例に挙げて、携帯 Java ( J2ME/MIDP ) プログラミングに関して開発者が陥りがちなポイントを Tips 集としてまとめます。


本連載について

携帯 Java 特有の制約事項を着眼点において話を進めます。


前提条件

Java 言語でのプログラミング経験

IM の紹介

IM とは、相手のステータス(状態)を電話をかける人が予め確認できるツールです。IM が出現するまでは、「予め相手の状態を確認する」概念はありませんでした。

2000年 以降、IM は、インターネットのブロードバンド化と共に急激に普及しています。

IM の機能

IM の基本機能は、友達管理、状態確認、コミュニケーションの 3 つです。

UI(ユーザーインタフェース)について

PC 上の IM ではトップ画面に友達のリストが表示され、友達の状態をいつでも見れます。携帯電話でも同じような UI が使いやすいでしょう。

それでは、テキストベース IM の UI の例を示します。

テキスト型 UI
テキスト型UI1 テキスト型UI2

アイコンベース IM の UI の例です。

アイコン型 UI
アイコン型UI1 アイコン型UI2 アイコン型UI3

1 人の友達をトップ画面に配置した常駐型 IM の UI の例です。

常駐型 UI
常駐型UI1 常駐型UI2 常駐型UI3


サイズ制限を乗り越えて…

NTT DoCoMo、KDDI、J-PHONE それぞれが独自に携帯 Java の仕様を拡張し、サイズ制限を設けています。

キャリアとサイズ制限
キャリア サイズ(KB)
DoCoMo 503 10
504 30
J-PHONE 30
80
au 50

i アプリが登場した当時は 10 Kバイト制限の中でアプリを実装する必要がありました。サイズ制限は緩和される方向にありますが、サイズ制限は常に意識しなければならない状況に変わりはありません。

携帯 Java アプリ開発では、Java のオブジェクト指向の特長を活かしにくいかもしれません。2 のクラスだけで開発しなければいけない状況も珍しくありまあせん。

サイズ削減の方法として次の 3 つを挙げることができます。

簡単に表にすると次のようになります。

サイズ削減方法
アルゴリズム データ領域最小化 JAR ツール
省サイズ設計
アルゴリズム最適化
クラス融合
未使用項目の削除
名前の短縮
名前の共有
… 
7-ZIP
KZIP

DoJa と MIDP の GUI

携帯電話は画面が小さい上に、使えるコンポーネントも限られます。

DoJa と MIDP は同じ携帯 Java でありながら、GUI に関しては設計思想が大きく異なります。それぞれのプロファイルの GUI 関連クラス図です。

DokaのGUIクラス図
MIDP1.0のGUIクラス図

DoJaとMIDP1.0でのGUI周りのクラス対応
機能 DoJa MIDP1.0 相違点
GUI トップ Frame Displayable 設計思想の違いから MIDP では切り替えられる回数が多くなります。
低水準描画 Canvas Canvas 特に大きな違いはありません。両者ともにポインティングデバイスにも対応しています。(DoJa では2.0から)
ダイアログ Dialog Alert Dialog では3つの選択肢が出せますが、Alert では CommandListener が登録できないため、分岐には使えません。なお、Alert ではタイムアウトが設定できます。
コンポーネントコンテナ Panel Form MIDP のレイアウト関連は貧弱です。
GUIコンポーネント Component Item Component では座標指定で配置できますが、Itemでは追加順序しかありません。
文字表示 Label StringItem StringItem ではラベルと内容の2つの部分に分かれています。
画像表示 ImageLabel ImageItem ImageItem では String のラベルが付けられます。
ボタン Button なし MIDP では、ボタンは使用できません。このため Choice や List を使うことを除けば、1画面からユーザーの選択によって分岐できるフローの数はソフトキーの個数と同じになります。
テキスト入力 TextBox TextField, TextBox DoJa では縦横幅が自由ですが、MIDP では、1行または1画面のいずれかとなります。
選択肢 ListBox ChoiceGroup, List DoJa では選択肢表示の UI が選べますが、MIDP では選べず実装依存です。
日付入力 なし DateField MIDP では日付選択専用の入力コンポーネントがあり、カレンダーを表示して選択させる高度な実装も存在します。
量調節バー なし Gauge MIDP では量調節用コンポーネントが提供されています。

DoJa でも MIDP でも低水準 API の Canvas では自由に線や文字・画像を描画することが可能で、使い勝手には大差はありません。

大きな相違点は高水準 API にあります。コンポーネントコンテナとして DoJa では Panel、MIDP では Form が提供されていて各コンポーネントの配置は、DoJa では PC と同じようにウィンドウに貼り付ける感覚で細かく指定できますが、MIDP では細かな指定はできません。

DoJa と MIDP の違いは「ボタンコンポーネント」で顕著です。DoJa では任意の機能を持たせたボタンを好きな場所に貼れますが、 MIDP では「ボタンコンポーネント」そのものがありません。

DoJa では Panel を使ってあっさりと GUI 画面を構成できますが、MIDP では 1 つの Form だけでは作れません。複数の画面が必要になります。

MIDP では以下の点に留意してください。

なお、DoJa でも、使いやすい GUI にしたい場合は、文字入力など必要な部分のみ高水準 API を使い、それ以外は低水準 API を使用するスタイルになります。

このアプローチのメリットは、DoJa ⇔ MIDP 間でも移植が容易な点です。

※ MIDP 2.0 ではレイアウト機能が強化されています。


簡単な通信アプリの作成

現在の携帯 Java では通信は基本的に HTTP (または HTTPS )に限られています。

「端末→サーバー」の通信は任意のタイミングで行えますが、「サーバー→端末」の通信はできません。

IM では、状態が変わった時やメッセージが届いた時にサーバーからクライアントへ通信した方が良い場合もありますが、HTTP では不可能です。

クライアントが定期的にサーバーに問い合わせる必要があります。この通信方式は「ポーリング」と呼ばれます。


サンプルプログラム「DBTest」の概要

DBtestのサンプル

システムの構成図です。

システムの構成図

クライアントとサーブレットは HTTP で通信します。サーブレットはクライアントからのリクエストに応じ JDBC 経由でデーターベースを操作します。

このプログラムではクライアントは別のクライアントが情報を更新したことを知るすべがありません。このため、定期的に手動で「取得」を行わないと情報が古いままとなってしまいます。

なお、サンプルをコンパイル・実行する環境については「エキストラトラック!」をご覧ください。


クライアントの詳細

KDDI、J-PHONE のどちらの端末でも動作させられるように MIDP の API のみで作成しました。

ただし今回は実機へ搭載させるところまで行わず、Sun の MIDP エミュレーターで動かすにとどめます。実機で動かしたい場合は、公式情報源の参考サイト 2、3 のほか、参考書籍 13 に詳しい説明があります。

以下はサンプルの詳細についての解説です。

クライアントには 2 つのクラスがあります。

サーブレットの詳細


DBTestServletDBTestServlet.java


サーブレットで使用するのはこのクラスのみです。HttpServlet を継承しています。

まとめ


サンプルプログラムを動かすことはできましたでしょうか?

クライアント1つでは面白くも何ともありませんが、離れた場所で複数起動してみると、IM によって実現される世界の片鱗が見えて楽しいかもしれません。


エキストラ トラック!

参考サイト・書籍