赞
踩
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() 方法中;
- onCreate-->
- onStart-->
- onResume-->
- onPause-->
- onStop-->
- onDestroy-->
- onCreate-->
- onStart-->
- onRestoreInstanceState-->
- onResume-->
- onPause-->
- onStop-->
- onDestroy-->
- onCreate-->
- onStart-->
- onRestoreInstanceState-->
- onResume-->
把该Activity添加android:configChanges="orientation"
,
执行步骤3(切换成横屏时)
- onPause-->
- onStop-->
- onDestroy-->
- onCreate-->
- onStart-->
- onRestoreInstanceState-->
- onResume-->
- onPause-->
- onStop-->
- onDestroy-->
- onCreate-->
- onStart-->
- onRestoreInstanceState-->
- onResume-->
android:configChanges="orientation"
对于4.04.0以上版本不生效
把该Activity添加 android:configChanges="orientation|screenSize"
,
执行步骤3(切换成横屏时)
onConfigChanged-->
只打印onConfigChanged
onConfigChanged-->
把android:configChanges="orientation|screenSize"
改成android:configChanges="orientation|keyboardHidden|screenSize"
执行步骤3(切换横屏幕)
只打印
onConfigChanged-->
执行步骤4(切换竖屏幕)
只打印onConfigChanged
切记一定要加上后边的screenSize否则在4.0以上版本生命周期执行不生效。
Android实现屏幕旋转方法
1、AndroidManifest.xml设置横竖屏,那么只需要添加横竖屏代码:
android:screenOrientation="landscape"横屏设置;
android:screenOrientation="portrait"竖屏设置;
这种方法的优点:即使屏幕旋转,Activity也不会重新onCreate。
缺点:屏幕只有一个方向。
2、代码动态设置
如果你需要动态改变横竖屏设置,那么,只需要在代码中调用setRequestedOrientation()函数:
- //横屏设置
- setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);
- //竖屏设置
- setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
- //默认设置
- setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_UNSPECIFIED);
优点:可以随意动态设置,满足我们人为改变横竖屏的要求,同时满足横竖屏UI不同的设计需求;
缺点:如果改变设置,那么,Activity会被销毁,重新构建,即重新onCreate;
3、重写onConfigurationChanged
如果你不希望旋转屏幕的时候Activity被不断的onCreate(这种情况往往会造成屏幕切换时的卡顿),那么,可以使用此方法:
首先,在AndroidMainfest.xml中添加configChanges:
- android:name=".OrientationActivity"
- android:configChanges="orientation|keyboard"
这个方法的优点:我们可以随时监听屏幕旋转变化,并对应做出相应的操作;
缺点:它只能一次旋转90度,如果一下子旋转180度,onConfigurationChanged函数不会被调用。
4、设置方向的其他方式
在AndroidManifest.xml设置横向显示,但是基于设备传感器,既可以是按正常方向显示,也可以反向显示,在API Level 9中被引入。
android:screenOrientation="sensorLandscape"
纵向显示,但是基于设备传感器,既可以是按正常方向显示,也可以反向显示,在API Level 9中被引入。
android:screenOrientation="sensorLandscape"
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。