Galaxy Tab 10.1で向き固定のActivityから向き固定のActivityを呼び出す場合の注意点

Galaxy Tab 10.1で向き固定のActivityから向き固定のActivityを呼び出す場合の注意点です。
おもに、カメラを使用するアプリを呼び出したり標準のカメラを呼び出したりするときの注意点でしょうか。
もっと絞って言うなら縦(Portrait)専用のアクティビティからカメラを呼び出すときの注意かもしれません。
と、思ったらエミュレータでも同じ症状なので3.0に共通する問題のようです。(追記)

もちろん、汎用的にタイトルのとおりの注意が必要っぽいです。

問題としては、他の端末では起きないアクティビティの再生成が発生することです。
Portrait固定ActivityからLandscape固定Activityを呼び出した場合(とその逆の時)に、呼び出し元と先の両方で無駄に画面回転でActivityの再生成が発生するのです。


解決としては以前紹介した「Galaxy Sでカメラアプリを使用する時の注意点」で、書いたとおりで「onConfigurationChanged」イベントを拾うようにするか、アクティビティが一旦破棄されても問題ないように作るしかないかもしれません。

具体的な解決は各アプリごとに違うので各々考えていただくとして、今回ちょっといやらしいのは呼び出される側も注意が必要になってしまう点です。
コレばかりは他人が作ったアプリを呼び出す場合にはどおにも出来ない場合があるのでセツナイですね。


※注意
これは、Google I/Oで入手したGalaxy Tab 10.1での情報です。
製品版でも同じ動作であるかはわかりません。
Android Version : 3.0.1
Kernel Version : 2.6.36.3 se.infra@SEP-49#1
Build no : HRI83.313 P7510XXKE3



Logcatの内容を簡単な解説付きで


PortraitのActivityからカメラ起動
05-27 07:04:37.540: DEBUG/test(12574): onCreate
05-27 07:04:37.560: DEBUG/test(12574): onStart
05-27 07:04:37.560: DEBUG/test(12574): onResume
05-27 07:04:40.960: DEBUG/test(12574): start camera
05-27 07:04:40.960: DEBUG/test(12574): onPause
05-27 07:04:41.630: DEBUG/test(12574): onStop
//このへんでカメラ起動してるので写真とってる
//が、縦持ちのままだと保存をしても戻らないので横持ちにして
//写真をとって戻る
05-27 07:04:56.900: DEBUG/test(12574): onDestroy : getChangingConfigurations=128
//カメラがfinishで終了して戻ってきたんだけど
//画面が回転したことを理由にActivityが破棄されて再生成される
05-27 07:04:56.900: DEBUG/test(12574): onCreate
05-27 07:04:56.910: DEBUG/test(12574): onStart
05-27 07:04:56.910: DEBUG/test(12574): onActivityResult
05-27 07:04:58.150: DEBUG/test(12574): /external/images/media/557,
05-27 07:04:58.150: DEBUG/test(12574): onResume
05-27 07:04:58.550: DEBUG/test(12574): onPause
05-27 07:04:58.550: DEBUG/test(12574): onStop
05-27 07:04:58.550: DEBUG/test(12574): onDestroy : getChangingConfigurations=128
//再生成されたActivityで結果を取得できるけど
//さらに画面が回転してActivityが破棄されて再生成される
05-27 07:04:58.550: DEBUG/test(12574): onCreate
05-27 07:04:58.560: DEBUG/test(12574): onStart
05-27 07:04:58.560: DEBUG/test(12574): onResume

LandscapeのActivityからカメラ起動
説明がいらないくらい普通なライフサイクル
05-27 07:23:45.230: DEBUG/test(13208): onCreate
05-27 07:23:45.260: DEBUG/test(13208): onStart
05-27 07:23:45.260: DEBUG/test(13208): onResume
05-27 07:23:46.940: DEBUG/test(13208): start camera
05-27 07:23:46.960: DEBUG/test(13208): onPause
05-27 07:23:47.440: DEBUG/test(13208): onStop
//このあたりで撮影して戻ってくる
05-27 07:23:57.660: DEBUG/test(13208): onActivityResult
05-27 07:23:58.470: DEBUG/test(13208): /external/images/media/561,test.jpg
05-27 07:23:58.470: DEBUG/test(13208): onStart
05-27 07:23:58.470: DEBUG/test(13208): onResume

PortraitのActivityからLandscapeのActivityを起動
05-27 07:34:27.780: DEBUG/test(13387): onCreate
05-27 07:34:27.810: DEBUG/test(13387): onStart
05-27 07:34:27.810: DEBUG/test(13387): onResume
05-27 07:34:31.920: DEBUG/test(13387): start landscape activity
05-27 07:34:31.930: DEBUG/test(13387): onPause
05-27 07:34:31.940: DEBUG/test(13387): LandscapeActivity::onCreate
05-27 07:34:31.940: DEBUG/test(13387): LandscapeActivity::onStart
05-27 07:34:31.940: DEBUG/test(13387): LandscapeActivity::onResume
05-27 07:34:32.310: DEBUG/test(13387): LandscapeActivity::onPause
05-27 07:34:32.310: DEBUG/test(13387): LandscapeActivity::onStop
05-27 07:34:32.340: DEBUG/test(13387): LandscapeActivity::onDestroy : getChangingConfigurations=128
//Activityが起動したと思ったら回転が発生して再生成されている
05-27 07:34:32.340: DEBUG/test(13387): LandscapeActivity::onCreate
05-27 07:34:32.350: DEBUG/test(13387): LandscapeActivity::onStart
05-27 07:34:32.350: DEBUG/test(13387): LandscapeActivity::onResume
05-27 07:34:32.370: DEBUG/test(13387): onStop
05-27 07:34:33.930: DEBUG/test(13387): LandscapeActivity::onClick(call finish)
//ボタンを押してfinish()呼び出した
05-27 07:34:33.940: DEBUG/test(13387): LandscapeActivity::onPause
05-27 07:34:33.950: DEBUG/test(13387): onDestroy : getChangingConfigurations=128
//呼び出したActivityがfinishで終了して戻ってきたんだけど
//画面が回転したことを理由にActivityが破棄されて再生成される
05-27 07:34:33.950: DEBUG/test(13387): onCreate
05-27 07:34:33.970: DEBUG/test(13387): onStart
05-27 07:34:33.970: DEBUG/test(13387): onActivityResult
05-27 07:34:33.970: DEBUG/test(13387): onResume
05-27 07:34:34.350: DEBUG/test(13387): onPause
05-27 07:34:34.350: DEBUG/test(13387): onStop
05-27 07:34:34.350: DEBUG/test(13387): onDestroy : getChangingConfigurations=128
//と、思ったらもう一度回転が理由で再生成
05-27 07:34:34.360: DEBUG/test(13387): onCreate
05-27 07:34:34.390: DEBUG/test(13387): onStart
05-27 07:34:34.390: DEBUG/test(13387): onResume
05-27 07:34:34.390: DEBUG/test(13387): LandscapeActivity::onStop
05-27 07:34:34.390: DEBUG/test(13387): LandscapeActivity::onDestroy : getChangingConfigurations=0

PortraitのActivityからPortraitのActivityを起動
説明がいらないくらい普通なライフサイクル
05-27 07:35:45.910: DEBUG/test(13423): onCreate
05-27 07:35:45.940: DEBUG/test(13423): onStart
05-27 07:35:45.940: DEBUG/test(13423): onResume
05-27 07:35:49.430: DEBUG/test(13423): start portrait activity
05-27 07:35:49.440: DEBUG/test(13423): onPause
05-27 07:35:49.450: DEBUG/test(13423): PortraitActivity::onCreate
05-27 07:35:49.450: DEBUG/test(13423): PortraitActivity::onStart
05-27 07:35:49.450: DEBUG/test(13423): PortraitActivity::onResume
05-27 07:35:49.790: DEBUG/test(13423): onStop
05-27 07:35:51.290: DEBUG/test(13423): PortraitActivity::onClick(call finish)
//ボタンを押してfinish()呼び出した
05-27 07:35:51.300: DEBUG/test(13423): PortraitActivity::onPause
05-27 07:35:51.300: DEBUG/test(13423): onActivityResult
05-27 07:35:51.300: DEBUG/test(13423): onStart
05-27 07:35:51.300: DEBUG/test(13423): onResume
05-27 07:35:51.610: DEBUG/test(13423): PortraitActivity::onStop
05-27 07:35:51.610: DEBUG/test(13423): PortraitActivity::onDestroy : getChangingConfigurations=0



参考情報
HTC Ariaで同じことをした場合、どっちのActivityでも回転は起きません。

PortraitのActivityからLandscapeのActivityを起動
05-27 23:38:22.820: DEBUG/test(2535): onCreate
05-27 23:38:23.260: DEBUG/test(2535): onStart
05-27 23:38:23.270: DEBUG/test(2535): onResume
05-27 23:38:26.120: DEBUG/test(2535): start landscape activity
05-27 23:38:26.160: DEBUG/test(2535): onPause
05-27 23:38:26.330: DEBUG/test(2535): LandscapeActivity::onCreate
05-27 23:38:26.360: DEBUG/test(2535): LandscapeActivity::onStart
05-27 23:38:26.360: DEBUG/test(2535): LandscapeActivity::onResume
05-27 23:38:26.370: DEBUG/test(2535): onStop
05-27 23:38:28.100: DEBUG/test(2535): LandscapeActivity::onClick(call finish)
//ボタンを押してfinish()呼び出した
05-27 23:38:28.100: DEBUG/test(2535): LandscapeActivity::onPause
05-27 23:38:28.460: DEBUG/test(2535): onActivityResult
05-27 23:38:28.460: DEBUG/test(2535): onStart
05-27 23:38:28.460: DEBUG/test(2535): onResume
05-27 23:38:28.480: DEBUG/test(2535): LandscapeActivity::onStop
05-27 23:38:28.510: DEBUG/test(2535): LandscapeActivity::onDestroy : getChangingConfigurations=0



画面の向きなんて固定してんじゃねーよって天のお告げかもしれませんね。