画面の向きの設定と 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*が詳しい。