- 今天我们来记录一下当Activity横竖屏变化时Activity的生命周期的变化过程,记得以前面试的时候也被问过类似的问题,当时也不太清楚,今天刚好有时间就写个demo测试一下看看在横竖屏切换时,Activity生命周期到底发生了什么变化,话不多说先上代码,代码很简单只有一个Button点击事件,然后就是生命周期回调方法的Log打印
public class ScreenActivity extends AppCompatActivity {
private static final String TAG = "ScreenActivity";
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_screen);
Log.e(TAG, "onCreate: ");
initListener();
}
/**
* 横竖屏点击事件
*/
private void initListener(){
findViewById(R.id.btn).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if (getResources().getConfiguration().orientation == Configuration.ORIENTATION_PORTRAIT) {
//横屏
setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);
} else {
//竖屏
setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
}
}
});
}
@Override
protected void onStart() {
super.onStart();
Log.e(TAG, "onStart: ");
}
@Override
protected void onResume() {
super.onResume();
Log.e(TAG, "onResume: ");
}
@Override
protected void onPause() {i
super.onPause();
Log.e(TAG, "onPause: ");
}
@Override
protected void onStop() {
super.onStop();
Log.e(TAG, "onStop: ");
}
@Override
protected void onDestroy() {
super.onDestroy();
Log.e(TAG, "onDestroy: ");
}
@Override
protected void onRestoreInstanceState(Bundle savedInstanceState) {
super.onRestoreInstanceState(savedInstanceState);
Log.e(TAG, "onRestoreInstanceState: ");
}
@Override
public void onConfigurationChanged(Configuration newConfig) {
super.onConfigurationChanged(newConfig);
Log.e(TAG, "onConfigurationChanged: ");
}
@Override
protected void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);
Log.e(TAG, "onSaveInstanceState: " );
}
}
- 我们现在来测试一下,首先是竖屏状态下切换成横屏时Activity生命周期Log打印发生了什么变化
- 首先Activity页面启动时触发的生命周期如下:
- 接着切换成横屏时触发生命周期
- 从Log中我们可以看到,在竖屏切换成横屏状态下,首先把当前Activity的实例给销毁掉,然后在重新创建实例,并且在onStop方法后有一个onSaveInstanceState方法回调,这个方法用处主要是保存当前状态,方便后面onRestoreInstanceState方法恢复状态,从这里我们可以看出竖屏切换横屏,先是将当前实例销毁,并在销毁前回调一个保存状态的方法,然后在重新创建实例并回调一个恢复状态方法
- 接着我们来看从横屏状态下切换至竖屏下的变化
- 从上图来看和我们竖屏切换横屏生命周期方法一致,这里我们并没有在Manifest文件中添加什么设置,接下来我们从Manifest中Activity标签中添加如下设置:
- 我们再次启动一下看看切换横竖屏时生命周期的变化如何,首先是创建时:
- 接着我们试试切换横屏触发什么:
- 在上图中我们可以看到,经过我们在Manifest中设置配置后,切换横屏时并不走Activity的生命周期方法,而是回调了一个onConfigurationChanged方法,这个方法是当系统的配置信息发生改变时,系统会调用此方法。注意,只有在配置文件 AndroidManifest 中处理了 configChanges属性 对应的设备配置,该方法才会被调用。如果发生设备配置与在配置文件中设置的不一致,则Activity会被销毁并使用新的配置重建。
- 在Manifest文件中设置了configChanges属性时,横屏切换至竖屏也是如此,这里就不在重复了,该属性配置不同时,Activity横竖屏切换时的生命周期也不不同,有兴趣的小伙伴可以自己去写个Demo测试一下,这里就不在一一陈述了。