AndroidSDKに含まれる”application components”にはActivity、Service、Broadcast Intent Receiver、Content Providerという4種類があります。例えばServiceはViewをもたないので、アプリケーションをバックグラウンドで動作させたいときなどに使います。詳しい説明は、ドキュメントを見てもらうとして、さっそくServiceを使ったアプリケーションを作ってみようとしたところ、つまずいた初歩的なミスです。
Serviceのサブクラスを作って、例えばAPI DemoesのLocalServiceあたりを見ながら適当にソースコードをいじってビルドすると、以下のようなエラーが出てしまうことがあると思います。
こうなったときは、まずAndroidManifest.xmlをチェックしましょう。呼び出し元のActivityだけでなく、呼び出し先のServiceも記入されているでしょうか。
<service android:name=".HogeClass" />
これがないと、指定のクラスを認識しないような状況になるみたいです。初歩の初歩だと思いますが、僕の場合は、これに気づくのに相当時間がかかりました。気をつけましょう・・・。AndroidManifest.xmlについては、しっかり勉強しておかないとこれからも変なところでひっかかりそうですな。
Serviceのサブクラスを作って、例えばAPI DemoesのLocalServiceあたりを見ながら適当にソースコードをいじってビルドすると、以下のようなエラーが出てしまうことがあると思います。
WARN/ActivityManager(57): Unable to start service Intent { comp={呼び出し元のActivity/呼び出し先のService} }: not found
こうなったときは、まずAndroidManifest.xmlをチェックしましょう。呼び出し元のActivityだけでなく、呼び出し先のServiceも記入されているでしょうか。
<service android:name=".HogeClass" />
これがないと、指定のクラスを認識しないような状況になるみたいです。初歩の初歩だと思いますが、僕の場合は、これに気づくのに相当時間がかかりました。気をつけましょう・・・。AndroidManifest.xmlについては、しっかり勉強しておかないとこれからも変なところでひっかかりそうですな。
2009/02/18: Androidで扱えるセンサー
ドキュメントでセンサーの項を見ると、様々なセンサーが扱えることが分かります。
・SENSOR_ACCELEROMETER (加速度)
・SENSOR_MAGNETIC_FIELD (方位)
・SENSOR_LIGHT (輝度)
・SENSOR_ORIENTATION (傾き)
・SENSOR_PROXIMITY (近接)
・SENSOR_TEMPERATURE (温度)
・SENSOR_TRICORDER (??)
・STANDARD_GRAVITY (重力)
面白いのが、重力値の定数に地球以外の値も含まれている点。
GRAVITY_DEATH_STAR_I
GRAVITY_EARTH
GRAVITY_JUPITER
GRAVITY_MARS
GRAVITY_MERCURY
GRAVITY_MOON
GRAVITY_NEPTUNE
GRAVITY_PLUTO
GRAVITY_SATURN
GRAVITY_SUN
GRAVITY_THE_ISLAND
GRAVITY_URANUS
GRAVITY_VENUS
なんに使うんだ?という感じもしますが。
あと、輝度の定義値にもいろいろあります。これは、地域によって違わないものかという気も。
LIGHT_CLOUDY
LIGHT_FULLMOON
LIGHT_NO_MOON
LIGHT_OVERCAST
LIGHT_SHADE
LIGHT_SUNLIGHT
LIGHT_SUNLIGHT_MAX
LIGHT_SUNRISE
輝度とか近接とかはiPhoneにもあるみたいですね。(輝度は環境光で画面の明るさ調節のため、近接は通話中かどうかの判別用だと思うので、スピーカーの近くにあるのかな?)
一番不可解なのがTRICORDERです。スタートレックに出てくるものらしいんだけど。見たことないので何なのかさっぱり。。。
まあ、なんとなく遊び心は感じます。
・SENSOR_ACCELEROMETER (加速度)
・SENSOR_MAGNETIC_FIELD (方位)
・SENSOR_LIGHT (輝度)
・SENSOR_ORIENTATION (傾き)
・SENSOR_PROXIMITY (近接)
・SENSOR_TEMPERATURE (温度)
・SENSOR_TRICORDER (??)
・STANDARD_GRAVITY (重力)
面白いのが、重力値の定数に地球以外の値も含まれている点。
GRAVITY_DEATH_STAR_I
GRAVITY_EARTH
GRAVITY_JUPITER
GRAVITY_MARS
GRAVITY_MERCURY
GRAVITY_MOON
GRAVITY_NEPTUNE
GRAVITY_PLUTO
GRAVITY_SATURN
GRAVITY_SUN
GRAVITY_THE_ISLAND
GRAVITY_URANUS
GRAVITY_VENUS
なんに使うんだ?という感じもしますが。
あと、輝度の定義値にもいろいろあります。これは、地域によって違わないものかという気も。
LIGHT_CLOUDY
LIGHT_FULLMOON
LIGHT_NO_MOON
LIGHT_OVERCAST
LIGHT_SHADE
LIGHT_SUNLIGHT
LIGHT_SUNLIGHT_MAX
LIGHT_SUNRISE
輝度とか近接とかはiPhoneにもあるみたいですね。(輝度は環境光で画面の明るさ調節のため、近接は通話中かどうかの判別用だと思うので、スピーカーの近くにあるのかな?)
一番不可解なのがTRICORDERです。スタートレックに出てくるものらしいんだけど。見たことないので何なのかさっぱり。。。
まあ、なんとなく遊び心は感じます。
2009/02/17: リソースのン名前は小文字と数字のみ
リソースフォルダ下のファイル名には、a-z0-9_.しか使えない!
これを知らずにMP3の名前に大文字を使っていて、時間を食いました。EclipseのIDE上コピペの方法を変えたりリネームしたりBuild Pathとかいうコマンドして変になったり、R.javaを強制編集もしくは強制生成させる方法を探してたんですが。実はコンソール見たらちゃんと警告でてたー!全然気づかなかった・・・
不慣れとはいえ、先入観を持たないようにしよう。注意深くならないと。
あと、今日はドキュメントの一部が古かったりして、それを自力で何とかしようとして挫折したりで、開発全然進みませんでした。まぁ、こんな日もあるかぁ。
これを知らずにMP3の名前に大文字を使っていて、時間を食いました。EclipseのIDE上コピペの方法を変えたりリネームしたりBuild Pathとかいうコマンドして変になったり、R.javaを強制編集もしくは強制生成させる方法を探してたんですが。実はコンソール見たらちゃんと警告でてたー!全然気づかなかった・・・
不慣れとはいえ、先入観を持たないようにしよう。注意深くならないと。
あと、今日はドキュメントの一部が古かったりして、それを自力で何とかしようとして挫折したりで、開発全然進みませんでした。まぁ、こんな日もあるかぁ。
2009/02/16: screenOrientationで画面の向きを設定
画面の向きの設定はAndroidManifest.xmlの中で設定できます。コードの中で直接いじれないものかやってみましたが、挫折しました。もしかして出来ないのかも。
Activity要素の中のscreenOrientationで設定します。
ドキュメントにある設定値は下記。
・unspecified (システムで判断?)
・landscape (横長の向き)
・portrait (縦長の向き)
・user (ユーザに従う?)
・behind (親のActivityに従う)
・sensor 傾き検知)
・nosensor (傾き検知を常に無視?)
いまいち謎なものもありますが、練習がてらテストできるアプリを作りました。behindなど、Activityのネストにも関係あるものがあったので、一つ目の画面(=FirstActivity)でSecoundActivityの設定、2つ目の画面(=SecoundActivity)でthirdActivityの設定をするようにしてみました。(分かりにくっ)
こんな感じ↓
FirstActivity(ListView) ←screenOrientation = user
└SecoundActivity(ListView)
└ThirdActivity(FinalView)
Activityのネストや、Intentを使ったActivity間でデータの受け渡しなどの勉強になりました。ActivityはControllerと考えればよいのかな?という印象。
ちなみにFirstActivityのscreenOrientationはuserにしてます。
1)FirstActivity
親ActivityのscreenOrientationを設定
2)SecoundActivity
子ActivityのscreenOrientationを設定
3)ThirdActivity
子Activityのの表示結果
RotateTest(ソース)
ソース公開しといてですが、インストールするとアプリケーションの名前が「RotateTest」ではなく、「Choose parent activity's screenOrientation」と表示されます。
これは、メインのActivityのラベル名になってしまっているためです。ちゃんとstrings.xmlでapp_nameを定義してるのに謎・・・
Activity要素の中のscreenOrientationで設定します。
<activity android:label="Label Name" android:name=".ClassName" android:screenOrientation="landscape">
ドキュメントにある設定値は下記。
・unspecified (システムで判断?)
・landscape (横長の向き)
・portrait (縦長の向き)
・user (ユーザに従う?)
・behind (親のActivityに従う)
・sensor 傾き検知)
・nosensor (傾き検知を常に無視?)
いまいち謎なものもありますが、練習がてらテストできるアプリを作りました。behindなど、Activityのネストにも関係あるものがあったので、一つ目の画面(=FirstActivity)でSecoundActivityの設定、2つ目の画面(=SecoundActivity)でthirdActivityの設定をするようにしてみました。(分かりにくっ)
こんな感じ↓
FirstActivity(ListView) ←screenOrientation = user
└SecoundActivity(ListView)
└ThirdActivity(FinalView)
Activityのネストや、Intentを使ったActivity間でデータの受け渡しなどの勉強になりました。ActivityはControllerと考えればよいのかな?という印象。
ちなみにFirstActivityのscreenOrientationはuserにしてます。
1)FirstActivity
親ActivityのscreenOrientationを設定
2)SecoundActivity
子ActivityのscreenOrientationを設定
3)ThirdActivity
子Activityのの表示結果
RotateTest(ソース)
ソース公開しといてですが、インストールするとアプリケーションの名前が「RotateTest」ではなく、「Choose parent activity's screenOrientation」と表示されます。
これは、メインのActivityのラベル名になってしまっているためです。ちゃんとstrings.xmlでapp_nameを定義してるのに謎・・・