Androidアプリ/日記7
エミュレートしてみよう
画面レイアウトの作業が済んだあたりから、実際にActivityがどんな風な見栄えになっているのか確認したいという欲求がでてきました。Googleの提供するAndroidのエミュレータを使って実機での動作をPC上でエミュレートして内容を確認していこうと思います。
エミュレータ側の設定
Androidエミュレータの設定は「Android SDK and AVD Manager」から行いました。詳細は省きますが、Virtual Device画面で新しい端末を「New...」ボタンから追加するだけです。Android OSのバージョンや端末のハードウェアデバイスの設定、SDカードの容量など細かく指定できるので、いろいろな端末を想定した設定ができそうです。現在、自分の手持ちの端末のOSバージョンが2.1なので、とりあえずそれに合わせたエミュレータでエミュレーションしてみたいと思います。他にも、バージョン1.6端末向けにビルドしていたり、将来的に2.2にバージョンアップする予定があったりするので、余裕があったらいくつかの端末で確認を行うことにしましょう。
Activityの設定
続いて動作を確認したいActivity「InputWeight」の設定に少し手を加えます。Androidプロジェクトを生成した段階では、アプリの起動時に最初に発生するActivityが「ManageWeight」に指定されていましたが、現状でManageWeightは何もない空っぽの状態ですので、「InputWeight」を最初から呼び出せるようにしてあげないといけません。
そこでやるべきことは、「AndroidManifest.xml」の編集です。このファイルには、アプリの中にどんなActivityが含まれているか全て記載してありますが、Activityがどんな条件で動くのかなどの設定は特に行っていませんでした。「ManageWeight」Activityの設定を参考に「InputWeight」Activityにも適切な設定をしてみます。
「AndroidManifest.xml」の編集画面を開き、「Application」タグの中の「Application Nodes」の一覧をみると「ManageWeight」や「InputWeight」のActivityが並んでいます。ですが、「ManageWeight」の横にだけ小さなシェブロンがついてます。それをクリックするとManageWeightの中にある子要素「Intent Filter」が表示され、その中にさらに「Action」と「Category」の子要素が入っています。どうやらこれが起動時に実行されるActivityを特定するのに関係しているようです。Intent Filter、ActionやCategoryがどういう意味なのかは後で調べるとして、とりあえず同じ内容を「Input Weight」Activityの中にも追加してあげました。追加後のソースは以下の通り。追加方法はもう書きません。GUIは言葉で説明するよりも実際に見てもらった方が早いですね。
<activity android:label="@string/app_name" android:name="InputWeight">
<intent-filter>
<action android:name="android.intent.action.MAIN"></action>
<category android:name="android.intent.category.LAUNCHER"></category>
</intent-filter>
</activity>
Intent Filterって何?
Intent Filterの話をする前に本来ならIntentの話をしなくてはならないのだと思いますが、どうやって説明していいのやら・・・もう少し自分の中で理解が進んでから説明したい部分です。
Intentを今の自分の言葉で説明するとすれば、「何かやりたい」っていう欲求をクラス定義したものです。「計算したい」とか「地図がみたい」とかAndroid端末への要求を抽象的に表現するのがIntentです。
それで、Intent Filterはそういった要求を掬いあげる網の役割ってとこですかね。今、動作を確認しようとしている「InputWeight」Activityは最終的に「体重を記録したい」というIntent(要求)を掬ってあげられるようになるはずです。逆にそれ以外のIntent(要求)を叶えることはできないので、Intent Filterにひっかからないように適切に設定する必要があります。
Intentを構成する要素にはAction、Category、Dataというのがあるらしいです。今回はDataは出てきませんね。この3つの構成要素を判断して、Intent Filterは、そのIntentをかなえられるかどうかを決定する・・・というイメージを持ってます。必然、Intent FilterもActionとCategoryとDataがどんな組み合わせなら受け入れられるのかを判断するための情報を持っています。
Actionって何?
Intentの中のActionは、Intentが行う活動を意味する文字列が入ります。予め類型化された値を入れることも、自分で独自に定義した値を入れることも可能です。今回Intent Filterに追加したAction「android.intent.action.MAIN」は、「アプリを実行した際に最初に行われるべきActivityである」という条件です。Intentがそのような要求を含んでいれば、Intent Filterにひっかかります。
Categoryって何?
Intentの中のCategoryは、Action以外のいろいろな条件を指定する文字列が入ります。予め類型化されたカテゴリの他自分で独自に定義した値を入れることも可能ですが、Actionと違って複数指定することが可能なようです。また、Intent FilterにActionを指定しなかった場合、そのIntent Filterを持つActivityは、IntentのActionが何であれ受け入れるのに対し、Categoryの指定がないIntent FilterはCategoryの指定がないIntentのみを受け入れるといった違いがあるらしいです。まだ、その辺の複雑な条件については用がないので、深くは考えないでおきます。
今回Intent Filterに追加したCategory「android.intent.category.LAUNCHER」は「アプリのランチャーから開始されるアプリ」というメタ情報を表しているそうです。
eclipseの設定
最後にeclipseからAndroidエミュレータにアプリを渡す設定を済ませます。
eclipseがコンパイラを叩いて生成された実行ファイルやリソースファイルは「WeightManager.apk」という名前でbinディレクトリに一つのファイルとしてパッケージングされています。このファイルをAndroidエミュレータに渡す場合、メニューから「Run」→「Run Configurations」をクリックして、アプリ実行設定用のダイアログを開きます。
ダイアログの左手の実行種別から「Android Application」を右クリックして「New」を選択すると、新しいAndroidアプリの実行設定が追加されます。「New_configuration」という名前がついていてもわかりにくいので、「AndroidTest」とかなんかわかりやすい名前を画面の左側のName欄につけ、Project欄にテストしたいプロジェクトを入力します。「Browse」ボタンを押すとプロジェクトの一覧が出てくるのでそこから「WeightManager」を選択しました。
続いて、Launch Actionで「Launch Default Activity」が選択されていますが、このままだと標準のActivityが実行されてしまうので、「Launch:」を選択して、テストしたいActivityである「InputWeight」を明示的に指定します。
さらにTargetタブを開くとどのAndroidエミュレータでテストするか指定することができます。エミュレータ環境の通信スピードを制限したり、ユーザデータを毎回リセットしたり、いろいろな実行テスト条件を設定することもできるようですが、今回は必要なさそうなので、これ以上触れません。
ここまで設定してしまえば、名前を付けた実行テスト環境でメニューから「Run」すれば、実機をエミュレートした画面が確認できます。
無事表示されました。エミュレータ側で日本語表示するように設定を変えたら、ちゃんと日本語用のリソースが表示されていますね。DatePickerやTimePickerが思ったより大きくてびっくりしましたが、やっぱりタッチインターフェイスは面積がものをいうのでこんなものでしょうかね。EditTextの上にラベルを用意した方がいいかなとか、単位を表示した方がいいかなとか、いろいろ実画面をみて思いつくこともありますね。
それでは、下準備も整ったので、次回いよいよjavaでActivityの中身の実装をはじめてみましょう。