画面の向きの設定と Activity のライフサイクル (android アプリ)
iPhoneより多彩なAndroidのセンサをアプリで操作 (1/3):Androidで動く携帯Javaアプリ作成入門(13) - @IT を参考に加速度センサのテストアプリを作成したのだが、ドロイド君を動かしている途中でフリーズする。
原因は、画面の回転を禁止し、その向きを固定してなかったことにあった。
画面を回転させるべく、筐体を動かすと、フリーズする。
デバッガで、ログを見ると、
Unexpected resume of com.example.android.sensor while already resumed in com.example.android.sensor
とあり、旧画面が resume 状態にあるにもかかわらず、新画面が create -> resume されたことに問題があるようだ。
今までの経験では、画面が回転されると、
- 旧画面は pause -> stop -> destroy され、そして
- 新画面が create されるのだが、
どうやら、このアプリの Activity はそうでない。
AndroidManifest.xml で画面の向きを固定
新画面が create されないよう、画面の方向を固定するには、AndroidManifest.xml で
<activity android:name=".AccelerometerDemo" android:label="Accelerometer Demo" android:screenOrientation="portrait"/>
のように screenOrientation を指定して書く。
フリーズせずにうまく動いた。
追記:他の解決策
- Activity の onConfigurationChanged メソッドをオーバライドする。
@Override public void onConfigurationChanged(Configuration newConfig) { super.onConfigurationChanged(newConfig); }
- AndroidManifest.xml は screenOrientation を設定する代わりに
android:configChanges="orientation|keyboardHidden" >
と書く。
参考資料
画面の向きの設定については、画面の向き(ScreenOrientation) - Android Wiki*が詳しい。