iアプリ開発Tips
アプリ全般
開発環境の構築
- 基本的な手順
- DoJaの環境構築との相違はインストールする開発ツールが異なるのみ
- Eclipseのインストール
-
All-In-One Eclipse
(日本語化済み+プラグイン含む)を使うと簡単
- 「ダウンロード」タブをクリック→*.001, *.002, *.003, *.batをダウンロード
- ダウンロード完了後に*.batを実行してセットアップファイルを生成→それを実行
- DoJaで使っているEclipseはStarには使用できないため、改めてEclipseをインストールする必要がある
- DoJaで使っているEclipseはそのままDoJa用に使用できる
-
All-In-One Eclipse
(日本語化済み+プラグイン含む)を使うと簡単
- Starプロファイル向けの開発ツールのインストール
-
Star-1.0プロファイル向けiアプリ開発ツール
からダウンロードしインストール
- カスタム構成を選択して全てインストールする
- 必ずEclipseを先にインストールしておく(Eclipseのインストール先を聞かれる)
-
Star-1.0プロファイル向けiアプリ開発ツール
からダウンロードしインストール
- リファレンスの入手
-
Star-1.xプロファイル向けiアプリに関する技術資料
から各種資料をダウンロード
- APIリファレンス(ZIPファイル)はC:\iDKStar1.0\docにも展開しておく(Javadocとして使う)
- CLDCのリファレンスは
JSR-000139 Connected Limited Device Configuration 1.1
のSpecificationからダウンロードする
- Appendix2-javadocs.zipはC:\iDKStar1.0\docにも展開しておく(Javadocとして使う)
- CLDCは
Unofficial "CLDC 1.1 + MIDP 2.0" API Reference
から日本語版を参照可能
- ただしStarでは使用できないMIDPのクラスも含まれるため注意
-
Star-1.xプロファイル向けiアプリに関する技術資料
から各種資料をダウンロード
- その他
- 絵文字を多用する場合は
i絵文字
をインストールしておくと便利
- メニューの「ファイル」→「設定」→「Unicodeの形式で挿入」を選択しておく
- 「�」の形式で挿入されるので「\u0000」に直す
- 絵文字を多用する場合は
i絵文字
をインストールしておくと便利
- Javadocの設定(プロジェクトごとに実施)
- 作成済みのプロジェクトを選択し、右クリックメニューから「プロパティー」を開く
- Javaのビルド・パスの「ライブラリー」タブを開く
- STAR_CLASS_ZIPとSTAR_STARCLASS_ZIPのツリーを展開する
- Javadocロケーションを選択→「編集」し、Javadocを展開したパスを指定する
- STAR_CLASS_ZIPにはCLDC 1.1のJavadocを指定
- STAR_STARCLASS_ZIPにはStar-1.0のJavadoc(基本API)を指定
- Javadocの複数指定または基本APIとオプションAPIのJavadocをマージする方法はあるのか?
DoJaアプリからStarアプリへの移行
- importの置換
- com.nttdocomoをcom.docomostarに置換
- Eclipseの場合は次の手順でも可
- importを全て削除
- 波線の出ているクラス名の右にカーソルを移動
- Ctrl+Space(import自動挿入)
- 波線がなくなるまで繰り返す
import com.nttdocomo.ui.*; ↓ import com.docomostar.ui.*;
- 起動クラスの書き換え
- IApplicationをStarApplicationに置換
- void start()をvoid started(int launchType)に置換
public class TestApp extends IApplication { public void start() { } } ↓ public class TestApp extends StarApplication { public void started(int launchType) { } }
- フォント取得部分の変更
Font.getFont(Font.FACE_SYSTEM | Font.SIZE_TINY) Font.getFont(Font.FACE_SYSTEM | Font.SIZE_SMALL) Font.getFont(Font.FACE_SYSTEM | Font.SIZE_MEDIUM) Font.getFont(Font.FACE_SYSTEM | Font.SIZE_LARGE) ↓ Font.getFont(Font.FACE_SYSTEM, 12) Font.getFont(Font.FACE_SYSTEM, 16) Font.getFont(Font.FACE_SYSTEM, 24) Font.getFont(Font.FACE_SYSTEM, 30)
- ShortTimerをTimerに変更
- タイマはあらかじめTimerを使うようにするとStarへの移行が楽
//ShortTimer版(DoJaのみで動作) public class TestCanvas extends Canvas { private static final int TIMER_REDRAW = 1; private ShortTimer tmRedraw; TestCanvas() { tmRedraw = ShortTimer.getShortTimer(this, TIMER_REDRAW, 100, true); } public void show() { Display.setCurrent(this); tmRedraw.start(); } public void paint(Graphics g) { //再描画 } public void processEvent(int type, int param) { switch(type) { case Display.TIMER_EXPIRED_EVENT: if(param == TIMER_REDRAW) { repaint(); //タイマの処理 } break; case Display.RESUME_VM_EVENT: tmRedraw.stop(); tmRedraw.start(); break; } } } ↓ //Timer版(DoJaとStarの両方で動作) public class TestCanvas extends Canvas implements TimerListener { private Timer tmRedraw; TestCanvas() { tmRedraw = new Timer(); tmRedraw.setTime(100); tmRedraw.setRepeat(true); tmRedraw.setListener(this); } public void show() { Display.setCurrent(this); tmRedraw.start(); } public void paint(Graphics g) { //再描画 } public void processEvent(int type, int param) { switch(type) { case Display.RESUME_VM_EVENT: tmRedraw.stop(); tmRedraw.start(); break; } } public void timerExpired(Timer source) { if(source == tmRedraw) { repaint(); //タイマの処理 } } }
ImageReferenceの使用
- Imageの代わりに画像の描画に使用できるクラス
- MediaImage経由で使用する場合に比べてヒープの消費量を抑えられる
- ヒープの少ないミニアプリに向いた機構
- MediaImageはオリジナルデータと内部データを保持し続ける必要がある
- ImageReferenceは必要に応じて内部データへの展開や開放などを行う
- 描画のたびに画像データの展開を行うため処理速度は遅くなる
- ただしキャッシュ指定すると次回からは展開データのキャッシュを使用するため高速になる(キャッシュは約512KB)
- 内部的にMediaImage#use()とMediaImage#unuse()を自動で行っている?
- MediaImage経由で使用する場合に比べてヒープの消費量を抑えられる
/* MediaImageを使う場合 */ //画像のロード MediaImage mi = MediaManager.getImage("resource:///screen.gif"); mi.use(); Image iScreen = mi.getImage(); //画像の描画 g.drawImage(iScreen, 0, 0); /* ImageReferenceを使う場合 */ //画像のロード ImageReference irScreen = ImageReference.createImageReference("resource:///screen.gif"); //画像の描画 g.drawImageReference(irScreen, 0, 0, false); //キャッシュしない場合は最後をtrueにする
フルアプリ関連
フルアプリのプロジェクト作成(Eclipse)
- ファイル→新規→Star-1.0プロジェクトを選択
- プロジェクト名とロケーションを設定
- 「アプリケーション種別」から「フルアプリ」を選択して「終了」
- アプリを起動すると通常のエミュレータが起動する
描画エリア(ADFのDrawArea)の仕様
- 何も指定しなかった場合は480x480になる
- 全ての機種で整数倍に拡大表示されるのは240x240、240x320、320x240のみ
- 設定可能な値は幅が96以上画面の幅以下、高さが72以上画面の高さ以下
ソフトキーのラベル設定
- ラベルはソフトキー1~4、決定キーに設定可能
- ソフトキー1~4は全角4文字まで
- 決定キーは全角2文字まで
ミニアプリ関連
ミニアプリのプロジェクト作成(Eclipse)
- ファイル→新規→Star-1.0プロジェクトを選択
- プロジェクト名とロケーションを設定
- 「アプリケーション種別」から「ミニアプリ」を選択して「終了」
- アプリを起動するとWidgetViewが起動する
アプリサイズの制限
- JARファイルのサイズは50KB以下
- スクラッチパッドは200KB以下
- 先頭のブロック(scratchpad:///0)のみ使用可能
- 上記領域はフル+ミニアプリ(ミニ+フルアプリ)の場合はフルアプリからもアクセス可能(共有される)
描画エリア(ADFのPallet)の仕様
- 「:」で区切って5つの値を指定する
- 指定しない場合は空文字とする(:が連続する)
パレット幅xパレット高さ:描画領域幅x描画領域高さ:描画領域オフセットX:描画領域オフセットY:フェイス画像
- 描画はパレット、フェイス画像、描画領域の3つが順に重なるようにして行われる
- パレットはミニアプリの最大描画サイズを示す透明な領域
- 大きさは「パレット幅xパレット高さ」の部分で指定する
- 指定可能な値は「160x160」「240x320」「320x240」「440x80」の4つのみ
- 省略すると160x160になる
- フェイス画像はパレットの上に描画される画像
- 透過GIFを使用することも可能
- パレットが透明なので、画像で透過にした部分はWidgetViewでも透明になる
- これによってウィンドウの形を長方形以外にできる
- 画像は「フェイス画像」の部分にファイル名を指定する
- 省略するとフェイス画像は使用されない
- 透過GIFを使用することも可能
- 描画領域は実際にGraphicsクラスで描画する領域
- 大きさは「描画領域幅x描画領域高さ」で指定する
- パレットの大きさ以下なら任意の値が可能
- 省略するとパレットと同じ大きさになる
- この領域外には(パレット内あっても)描画はできない
- 位置(パレット左上からのオフセット)は「描画領域オフセットX」「描画領域オフセットY」で指定する
- 省略するとそれぞれ0になる
- この領域は
透過しない
ので注意が必要
- フェイス画像で透過にした領域に重ねると透過ではなくなってしまう
- 大きさは「描画領域幅x描画領域高さ」で指定する
複数のミニアプリを同時に起動してテストする
- Eclipseの場合は「構成および実行」の起動種別で「WidgetView起動」を選択し実行する
- iαppliTool for Star-1.0(C:\iDKStar1.0\bin\star.exe)を実行し「起動」ボタンの下の「iWV」を押す
- 現在のワークスペースのミニアプリが起動可能になる(実機と同じ表示)
ソフトキーのラベル設定
- ラベルはソフトキー1、ソフトキー2、決定キーに設定可能
- ソフトキー1とソフトキー2は全角4文字まで
- 決定キーは全角2文字まで
取得できないキー
- ソフトキー3、ソフトキー4、クリアキーは取得できない(WidgetViewが使用する)
フル+ミニアプリ(ミニ+フルアプリ)関連
フルアプリのプロジェクト作成(Eclipse)
- あらかじめフルアプリとミニアプリのプロジェクトを作成しておく
- ファイル→新規→Star-1.0プロジェクトを選択
- プロジェクト名とロケーションを設定
- 「アプリケーション種別」から「ミニ+フルアプリ」を「選択」
- 「フルアプリを選択してください」の「参照」でプロジェクトを選択
- 「ミニアプリを選択してください」の「参照」でプロジェクトを選択して「終了」
- このプロジェクトで起動しないとフルアプリ⇔ミニアプリの連携起動はできない
- 基本的に次の作業のみを行える(アプリの作成は各アプリのプロジェクトで行う)
- ADFの編集
- resディレクトリにアイコン用の画像を格納する
ADFの設定について
- フル+ミニアプリでのADFは「フル+ミニアプリ」プロジェクトのものが使用される
- フルアプリとミニアプリのADFは使用されない
- 両アプリのADFの内容を全て(ORで)設定する必要がある
- フルでアプリ起動、ミニでブラウザ起動するならLaunchAppとUseBrowserの両方にチェックが必要
- フルアプリの描画領域はDrawArea、ミニアプリの描画領域はPalletで指定する
- 通常の起動でフルアプリとミニアプリのどちらを起動するかはAppTypeで指定
アプリの起動順
- フル+ミニアプリの場合
- 通常起動ではフルアプリが起動する
- WidgetViewからだとフルアプリに関係なくミニアプリが起動できる
- 先にミニアプリが起動されることを考慮する必要がある(特にスクラッチパッド)
- ミニ+フルアプリの場合
- 通常起動ではミニアプリが起動する
- フルアプリはミニアプリから指示が無いと起動できない
フル+ミニ(ミニ+フル)アプリの使いどころ
- フル+ミニアプリ
- ミニアプリにフルアプリの内容の一部を表示する
- ミニアプリをアプリ/サイト用の更新情報表示に使う
- そこからアプリの更新を行うなど
- ミニアプリをフルアプリのミニゲームに使う
- スクラッチパッドの共有を利用する
- ミニアプリを広告として使う
- フルアプリ起動時にミニアプリを起動→ミニアプリからフルアプリを起動
- ミニアプリが起動した時点でWidgetViewに貼りつくのを利用
- WidgetViewに貼りついているかは判定できないので若干鬱陶しいかも
- ミニアプリにQVGAアプリを移植したものを使う
- 関係の無いミニアプリをおまけとして付属させる
- ミニ+フルアプリ
- フルアプリをミニアプリの設定に使う
- 画面が広い&Panelが使用できるため
- フルアプリからミニアプリで使用できない機能を使う
- アプリの更新や画像選択など
- フルアプリをミニアプリの詳細情報表示に使う
- フルアプリをミニアプリの設定に使う
フルアプリ⇔ミニアプリの連携起動
- StarApplication#changeAppType()を使用する
- 第1引数に起動するアプリのタイプを指定する
- フルアプリ:STAR_TYPE_FULLAPPLI
- ミニアプリ:STAR_TYPE_MINIAPPLI
- 第2引数でアプリにパラメータを渡すことができる
- 渡さない場合はnull
- 渡す場合は制限付きのHashtableを使う
- キーと値はString
- キーは16個以内
- キーと値はデフォルトエンコーディングで20480バイト以内
//ミニアプリからフルアプリを起動 StarApplication.getThisStarApplication().changeAppType( StarApplication.STAR_TYPE_FULLAPPLI, null);
ミニアプリからフルアプリを連携起動するとDrawArea不正で落ちる場合の対処
- iαppliTool for Star-1.0(C:\iDKStar1.0\bin\star.exe)を実行し設定を変更
- メニューの「端末」から、現在のDrawAreaにあったものを選択する
- 上記の端末が480x854の時に、フル+ミニアプリのADFが480x864かつ起動端末も480x864でEclipseから実行すると、
フルからミニは問題なく起動できるが、ミニからフルを起動するとDrawAreaがあわないので落ちてしまう