codecamp

横竖屏切换时候Activity的生命周期

总结:

  1. 不设置 Activity 的 android:configChanges 时, 切屏会重新调用各个生命周期, 切横屏时会执行一次, 切竖屏时会执行两次.
  2. 设置 Activity 的 android:configChanges="orientation" 时, 切屏还是会重新调用各个生命周期, 切横\/竖屏时只会执行一次.
  3. 设置 Activity 的 android:configChanges="orientation|keyboardHidden" 时, 切屏不会重新调用各个生命周期, 只会执行onConfigurationChanged方法
Activity 会自己管理配置的变化. 当运行的时候, 配置变了, 它会自己关闭并重新启动, 但是如果设置了 android:configChanges="某一个配置", 它就不会在这个配置发生改变时重新启动.

具体过程

  1. 新建一个Activity,并把各个生命周期打印出来
  2. 运行Activity,得到如下信息onCreate-->onStart-->onResume-->
  3. 切换成横屏时onSaveInstanceState-->onPause-->onStop-->onDestroy-->onCreate-->onStart-->onRestoreInstanceState-->onResume-->
  4. 再切换成竖屏时,发现打印了两次相同的logonSaveInstanceState-->onPause-->onStop-->onDestroy-->onCreate-->onStart-->onRestoreInstanceState-->onResume-->onSaveInstanceState-->onPause-->onStop-->onDestroy-->onCreate-->onStart-->onRestoreInstanceState-->onResume
  5. 修改AndroidManifest.xml, 把该 Activity 添加 android:configChanges="orientation"onSaveInstanceState-->onPause-->onStop-->onDestroy-->onCreate-->onStart-->onRestoreInstanceState-->onResume-->
  6. 再执行步骤4, 发现不会再打印相同信息, 但多打印了一行 onConfigChangedonSaveInstanceState-->onPause-->onStop-->onDestroy-->onCreate-->onStart-->onRestoreInstanceState-->onResume-->onConfigurationChanged-->
  7. 把步骤5的 android:configChanges="orientation" 改成 android:configChanges="orientation|keyboardHidden",执行步骤3, 就只打印onConfigChangedonConfigurationChanged-->
  8. 执行步骤4onConfigurationChanged-->onConfigurationChanged-->
只竖屏显示 android:screenOrientation="portrait"只横屏显示 android:screenOrientation="landscape"


Activity的四种启动模式
如何保存 Activity 的状态
温馨提示
下载编程狮App,免费阅读超1000+编程语言教程
取消
确定
目录

关闭

MIP.setData({ 'pageTheme' : getCookie('pageTheme') || {'day':true, 'night':false}, 'pageFontSize' : getCookie('pageFontSize') || 20 }); MIP.watch('pageTheme', function(newValue){ setCookie('pageTheme', JSON.stringify(newValue)) }); MIP.watch('pageFontSize', function(newValue){ setCookie('pageFontSize', newValue) }); function setCookie(name, value){ var days = 1; var exp = new Date(); exp.setTime(exp.getTime() + days*24*60*60*1000); document.cookie = name + '=' + value + ';expires=' + exp.toUTCString(); } function getCookie(name){ var reg = new RegExp('(^| )' + name + '=([^;]*)(;|$)'); return document.cookie.match(reg) ? JSON.parse(document.cookie.match(reg)[2]) : null; }