おもに、カメラを使用するアプリを呼び出したり標準のカメラを呼び出したりするときの注意点でしょうか。
もっと絞って言うなら縦(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
画面の向きなんて固定してんじゃねーよって天のお告げかもしれませんね。
コメント