关于Android切换横竖屏调用生命周期,我在网上搜索一下,基本上都是一个统一的说法,分为以下三种情形。
1. 默认状态下:
切换横屏时会调用一次生命周期,切换竖屏时会调用两次生命周期,其中不会调用onConfigurationChanged()方法。
2. 设置android:configChanges=“orientation”时:
切换横竖屏均会调用一次生命周期,其中在切换竖屏时会调用onConfigurationChanged()方法。
3. 设置android:configChanges="orientation|keyboardHidden"
切换横竖屏均不会调用生命周期,但是都会调用onConfigurationChanged()方法。
然而,我在测试时发现并非如此,经过测试可分为以下情形。
1. 设置android:configChanges="orientation|keyboardHidden|screenSize"时:
换横竖屏均不会调用生命周期,但是只有在切竖屏的时候会调用onConfigurationChanged()方法。
运行结果为:
11-03 16:50:00.160 19375-19375/com.example.simple2 I/Message1: 竖屏------------onConfigurationChanged
11-03 16:50:02.233 19375-19375/com.example.simple2 I/Message1: 竖屏------------onConfigurationChanged
11-03 16:50:06.291 19375-19375/com.example.simple2 I/Message1: 竖屏------------onConfigurationChanged
11-03 16:50:07.947 19375-19375/com.example.simple2 I/Message1: 竖屏------------onConfigurationChanged
11-03 16:50:09.457 19375-19375/com.example.simple2 I/Message1: 竖屏------------onConfigurationChanged
2. 默认设置、设置android:configChanges=“orientation”android:configChanges= "orientation|keyboardHidden"时:
切换横竖屏均会调用一次生命周期,其中在切换竖屏时不会调用onConfigurationChanged() 方法。
运行结果为:
切横屏
11-03 16:48:01.148 17941-17941/com.example.simple2 I/Message1: 竖屏------------onPause
11-03 16:48:01.149 17941-17941/com.example.simple2 I/Message1: 竖屏------------onStop
11-03 16:48:01.149 17941-17941/com.example.simple2 I/Message1: 竖屏------------onDestroy
11-03 16:48:01.221 17941-17941/com.example.simple2 I/Message1: 横屏------------onStart
11-03 16:48:01.246 17941-17941/com.example.simple2 I/Message1: 横屏------------onResume
切竖屏
11-03 16:48:54.490 17941-17941/com.example.simple2 I/Message1: 横屏------------onPause
11-03 16:48:54.491 17941-17941/com.example.simple2 I/Message1: 横屏------------onStop
11-03 16:48:54.491 17941-17941/com.example.simple2 I/Message1: 横屏------------onDestroy
11-03 16:48:54.549 17941-17941/com.example.simple2 I/Message1: 竖屏------------onStart
11-03 16:48:54.559 17941-17941/com.example.simple2 I/Message1: 竖屏------------onResume
测试代码如下:
public class FullActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_full);
}
@Override
protected void onRestart() {
super.onRestart();
log("onRestart");
}
@Override
protected void onStart() {
super.onStart();
log("onStart");
}
@Override
protected void onResume() {
super.onResume();
log("onResume");
}
@Override
protected void onPause() {
super.onPause();
log("onPause");
}
@Override
protected void onStop() {
super.onStop();
log("onStop");
}
@Override
protected void onDestroy() {
super.onDestroy();
log("onDestroy");
}
private String state;
private void log(String str) {
if (state == null) {
Configuration mConfiguration = this.getResources()
.getConfiguration(); // 获取设置的配置信息
int ori = mConfiguration.orientation; // 获取屏幕方向
if (ori == mConfiguration.ORIENTATION_LANDSCAPE) {
state = "横屏";
} else if (ori == mConfiguration.ORIENTATION_PORTRAIT) {
state = "竖屏";
}
}
Log.i("Message1", state+"------------" + str);
}
@Override
public void onConfigurationChanged(Configuration newConfig) {
super.onConfigurationChanged(newConfig);
log("onConfigurationChanged");
}
}
为了确保正确性,特此在API 19、API 8上运行均为此,在Android Studio、Eclipse上编译也均为此,如果哪位读者能够找出真正的原因还望给予指教。