记得之前参加了一场面试,其中一个问题;横竖屏切换的生命周期变化?
无奈平时开发没有接触到横竖屏切换,所以当时还真不清楚。
到底如何变化,还是自己手动写代码测试来的更舒服。
关于Activity周期不清楚的可以参见:
http://blog.csdn.net/demonliuhui/article/details/65631920
代码很简单,重写Activity几个生命周期的方法即可。
public class MainActivity extends AppCompatActivity {
private static final String TAG = "MainActivity";
@Override
protected void onCreate(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
Log.i(TAG, "onCreate------------");
setContentView(R.layout.activity_main);
}
@Override
protected void onRestart() {
super.onRestart();
Log.i(TAG, "onRestart: --------------");
}
@Override
protected void onResume() {
super.onResume();
Log.i(TAG, "onResume: -----------------");
}
@Override
protected void onPause() {
super.onPause();
Log.i(TAG, "onPause: -----------------");
}
@Override
protected void onStop() {
super.onStop();
Log.i(TAG, "onStop: -------------------");
}
@Override
protected void onDestroy() {
super.onDestroy();
Log.i(TAG, "onDestroy: -----------------");
}
@Override
public void onConfigurationChanged(Configuration newConfig) {
super.onConfigurationChanged(newConfig);
Log.i(TAG, "onConfigurationChanged: ");
}
}
关于onConfigurationChanged以及onConfigurationChanged 未被调用的问题
<activity
android:name=".MainActivity"
android:configChanges="orientation|screenSize">
<intent-filter>
<action android:name="android.intent.action.MAIN"/>
<category android:name="android.intent.category.LAUNCHER"/>
intent-filter>
activity>
根据上图的结果可知:
横竖屏切换的过程中生命周期的变化为:
onPause()----->onStop()------>onDestroy()-------->onCreate(Bundle savedInstanceState)------>onResume()
1、不设置Activity的android:configChanges时,切屏会重新调用各个生命周期.
3、设置Activity的android:configChanges=”orientation|screenSize”时,切屏不会重新调用各个生命周期,只会执行onConfigurationChanged方法。
添加如下代码,onSaveInstanceState(Bundle outState)在活动回收前一定会调用。
@Override
protected void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);
Log.i(TAG, "onSaveInstanceState: ----------------");
String s = "hello world!";
outState.putString("text", s);
}
看到onSaveInstanceState(Bundle outState)的函数名及参数类型,你一定会感到特别熟悉,没错,onSaveInstanceState(Bundle outState)中的outState参数,就是onCreate(Bundle savedInstanceState)中的savedInstanceState。
我们在在onCreate(Bundle savedInstanceState)中添加如下代码:
if (savedInstanceState != null) {
String s = savedInstanceState.getString("text");
System.out.println(s);
}
根据上图可知,在进行横竖屏切换的过程中,也会调用onSaveInstanceState(Bundle outState)保存状态。然后在onCreate(Bundle savedInstanceState)中便可恢复状态。