面試被問到橫豎屏切換時Activity的生命周期,正好記錄一下驗證過程~
橫豎屏切換涉及到的是Activity的android:configChanges屬性,而與其android:launchMode屬性沒有關系;
android:configChanges可以設置的屬性值有:
- orientation:消除橫豎屏的影響
- keyboardHidden:消除鍵盤的影響
- screenSize:消除屏幕大小的影響
驗證步驟
新建Activity,重寫各個生命周期方法:
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
Log.d("TAG", "onCreate()");
setContentView(R.layout.activity_main);
}
@Override
protected void onStart() {
super.onStart();
Log.d("TAG", "onStart()");
}
@Override
protected void onResume() {
super.onResume();
Log.d("TAG", "onResume()");
}
@Override
protected void onStop() {
super.onStop();
Log.d("TAG", "onStop()");
}
@Override
protected void onPause() {
super.onPause();
Log.d("TAG", "onPause()");
}
@Override
protected void onRestart() {
super.onRestart();
Log.d("TAG", "onRestart()");
}
@Override
protected void onDestroy() {
super.onDestroy();
Log.d("TAG", "onDestroy()");
}
@Override
protected void onRestoreInstanceState(@NonNull Bundle savedInstanceState) {
super.onRestoreInstanceState(savedInstanceState);
Log.d("TAG", "onRestoreInstanceState()");
}
@Override
protected void onSaveInstanceState(@NonNull Bundle outState) {
super.onSaveInstanceState(outState);
Log.d("TAG", "onSaveInstanceState()");
}
@Override
public void onConfigurationChanged(@NonNull Configuration newConfig) {
super.onConfigurationChanged(newConfig);
Log.d("TAG", "onConfigurationChanged()");
}
}
運行Activity,生命周期如下:
image
切換橫屏,生命周期如下:
image
再切回豎屏,生命周期如下:
image
修改AndroidManifest.xml,添加android:configChanges="orientation"
并切換橫屏,生命周期如下:
image
再切換豎屏,生命周期如下:
image
修改AndroidManifest.xml,屬性改為android:configChanges="orientation|keyboardHidden|screenSize"
,切換橫屏,生命周期如下:
image
再切換回豎屏,生命周期如下:
image
結論
- 設置Activity的android:configChanges屬性為orientation或者orientation|keyboardHidden或者不設置這個屬性的時候,橫豎屏切換會重新調用各個生命周期方法,切橫屏時會執行1次,切豎屏時會執行1次;
- 設置Activity的屬性為
android:configChanges="orientation|keyboardHidden|screenSize"
時,橫豎屏切換不會重新調用各個生命周期方法,只會執行onConfigurationChanged方法; - 當然在顯示中我們可以屏蔽掉橫豎屏的切換操作,這樣就不會出現切換的過程中Activity生命周期重新加載的情況了,具體做法是,在Activity中加入如下語句:
android:screenOrientation="portrait" 始終以豎屏顯示
android:screenOrientation="landscape" 始終以橫屏顯示
作者:sybil052
鏈接:http://www.lxweimin.com/p/479457823277
來源:簡書
著作權歸作者所有。商業轉載請聯系作者獲得授權,非商業轉載請注明出處。