当前位置:   article > 正文

Android 横竖屏切换时Activity生命周期变化_android 切换壁纸后就会执行onstop

android 切换壁纸后就会执行onstop

1、新建一个Activity,并把各个生命周期打印出来

onCreate,
创建activity时调用。设置在该方法中,还以Bundle中可以提出用于创建该 Activity 所需的信息。
onStart,
当前activity是用户可见状态,但没有焦点,与用户不能交互,一般可在当前方法做一些动画的初始化操作。 
onResume,
当前activity状态属于运行状态 (Running),可与用户进行交互。
onPause,
当另外一个activity覆盖当前的acitivty时,此时当前activity会进入到onPouse()方法中,当前activity是可见的,但不能与用户交互状态。 
onStop,
此时activity对用户是不可见的,在系统内存紧张的情况下,有可能会被系统进行回收。所以一般在当前方法可做资源回收。 
onDestroy,
activity被完全从系统内存中移除时调用,该方法被调用可能是因为有人直接调用 finish()方法 或者系统决定停止该活动以释放资源 。                                                                                                                 onRestart
在用户按下home()之后,再次进入到当前activity的时候调用。调用顺序onPouse()->onStop()->onRestart()->onStart()->onResume().

Activity中onSaveInstanceState()和onRestoreInstanceState()

onSaveInstanceState(Bundle outState):

onSaveInstanceState函数在Activity生命周期中执行。 
outState 参数作用 :  Activity 生命周期结束的时候, 如果需要保存 Activity 状态, 会将要保存的数据使用键值对的形式 保存在 Bundle 对象中。

调用时机 : 
Activity 被销毁的时候调用, 也可能没有销毁就调用了; 
按下Home键 : Activity 进入了后台, 此时会调用该方法; 
按下电源键 : 屏幕关闭, Activity 进入后台; 
启动其它 Activity : Activity 被压入了任务栈的栈底; 
横竖屏切换 : 会销毁当前 Activity 并重新创建;

调用注意事项 : 
用户主动销毁不会调用 : 当用户点击回退键 或者 调用了 finish() 方法, 不会调用该方法; 
调用时机不固定 : 该方法一定是在 onStop() 方法之前调用, 但是不确定是在 onPause() 方法之前 还是 之后调用; 
布局中组件状态存储 : 每个组件都 实现了 onSaveInstance() 方法, 在调用函数的时候, 会自动保存组件的状态, 注意, 只有有 id 的组件才会保存; 
关于默认的 super.onSaveInstanceState(outState) : 该默认的方法是实现 组件状态保存的;

onRestoreInstanceState(Bundle outState):

方法回调时机 : 在 Activity 被系统销毁之后 恢复 Activity 时被调用, 只有销毁了之后重建的时候才调用, 如果内存充足, 系统没有销毁这个 Activity, 就不需要调用; 
– Bundle 对象传递 : 该方法保存的 Bundle 对象在 Activity 恢复的时候也会通过参数传递到 onCreate() 方法中;

2、运行Activity,得到如下信息

  1. onCreate-->
  2. onStart-->
  3. onResume-->

3、按crtl+f12切换成横屏时

  1. onPause-->
  2. onStop-->
  3. onDestroy-->
  4. onCreate-->
  5. onStart-->
  6. onRestoreInstanceState-->
  7. onResume-->

4、再按crtl+f12切换成竖屏时,发现又打印了相同的log

  1. onPause-->
  2. onStop-->
  3. onDestroy-->
  4. onCreate-->
  5. onStart-->
  6. onRestoreInstanceState-->
  7. onResume-->

5、修改AndroidManifest.xml

把该Activity添加
android:configChanges="orientation"
执行步骤3(切换成横屏时)

  1. onPause-->
  2. onStop-->
  3. onDestroy-->
  4. onCreate-->
  5. onStart-->
  6. onRestoreInstanceState-->
  7. onResume-->

6、再执行步骤4(切换竖屏),发现再打印相同信息

  1. onPause-->
  2. onStop-->
  3. onDestroy-->
  4. onCreate-->
  5. onStart-->
  6. onRestoreInstanceState-->
  7. onResume-->

android:configChanges="orientation"对于4.04.0以上版本不生效

7、修改AndroidManifest.xml

把该Activity添加 android:configChanges="orientation|screenSize"
执行步骤3(切换成横屏时)

onConfigChanged-->

8、执行步骤4(切换成竖屏幕)

只打印onConfigChanged

onConfigChanged-->

9、修改AndroidManifest.xml

android:configChanges="orientation|screenSize"改成android:configChanges="orientation|keyboardHidden|screenSize"
执行步骤3(切换横屏幕)
只打印

onConfigChanged-->

执行步骤4(切换竖屏幕)
只打印onConfigChanged
切记一定要加上后边的screenSize否则在4.0以上版本生命周期执行不生效。

总结:

  • 1、不设置Activity的android:configChanges时,切屏会重新调用各个生命周期,切横屏时会执行1次,切竖屏时会执行1次
  • 2、设置Activity的android:configChanges="orientation"或android:configChanges="orientation|keyboardHidden"时,切屏还是会重新调用各个生命周期,切横、竖屏时只会执行一次也会执行onConfigurationChanged方法
  • 3、设置Activity的android:configChanges="orientation|keyboardHidden|screenSize"时,切屏不会重新调用各个生命周期,只会执行onConfigurationChanged方法。切屏切记要加上screenSize,否则4.0版本以上生命周期不生效

扩展

Android实现屏幕旋转方法

1、AndroidManifest.xml设置横竖屏,那么只需要添加横竖屏代码:
android:screenOrientation="landscape"横屏设置;
android:screenOrientation="portrait"竖屏设置;

这种方法的优点:即使屏幕旋转,Activity也不会重新onCreate。
缺点:屏幕只有一个方向。

2、代码动态设置
如果你需要动态改变横竖屏设置,那么,只需要在代码中调用setRequestedOrientation()函数:

  1. //横屏设置
  2. setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);
  3. //竖屏设置
  4. setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
  5. //默认设置
  6. setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_UNSPECIFIED);

优点:可以随意动态设置,满足我们人为改变横竖屏的要求,同时满足横竖屏UI不同的设计需求;
缺点:如果改变设置,那么,Activity会被销毁,重新构建,即重新onCreate;

3、重写onConfigurationChanged
如果你不希望旋转屏幕的时候Activity被不断的onCreate(这种情况往往会造成屏幕切换时的卡顿),那么,可以使用此方法:
首先,在AndroidMainfest.xml中添加configChanges:

  1. android:name=".OrientationActivity"
  2. android:configChanges="orientation|keyboard"

这个方法的优点:我们可以随时监听屏幕旋转变化,并对应做出相应的操作;
缺点:它只能一次旋转90度,如果一下子旋转180度,onConfigurationChanged函数不会被调用。

4、设置方向的其他方式
在AndroidManifest.xml设置横向显示,但是基于设备传感器,既可以是按正常方向显示,也可以反向显示,在API Level 9中被引入。
android:screenOrientation="sensorLandscape"

纵向显示,但是基于设备传感器,既可以是按正常方向显示,也可以反向显示,在API Level 9中被引入。
android:screenOrientation="sensorLandscape"

demo

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/花生_TL007/article/detail/373035
推荐阅读
相关标签
  

闽ICP备14008679号