android生命周期深入分析(一)
程序员文章站
2023-12-15 11:33:22
android 系统在activity 生命周期中加入一些钩子,我们可以在这些系统预留的钩子中做一些事情。 例举了 7 个常用的钩子: protected void onc...
android 系统在activity 生命周期中加入一些钩子,我们可以在这些系统预留的钩子中做一些事情。
例举了 7 个常用的钩子:
protected void oncreate(bundle savedinstancestate)
protected void onstart()
protected void onresume()
protected void onpause()
protected void onstop()
protected void onrestart()
protected void ondestroy()
简要说明:
oncreate(bundle savedinstancestate):创建activity时调用。设置在该方法中http://www.myexception.cn/,还以bundle中可以提出用于创建该 activity 所需的信息。
onstart():activity变为在屏幕上对用户可见时,即获得焦点时,会调用。
onresume():activity开始与用户交互时调用(无论是启动还是重新启动一个活动,该方法总是被调用的)。
onpause():activity被暂停或收回cpu和其他资源时调用,该方法用于保存活动状态的。。
onstop():activity被停止并转为不可见阶段及后续的生命周期事件时,即失去焦点时调用。
onrestart():重新启动activity时调用。该活动仍在栈中,java.io.unsupportedencodingexception而不是启动新的活动。
ondestroy():activity被完全从系统内存中移除时调用,该方法被调用可能是因为有人直接调用 finish()方法 或者系统决定停止该活动以释放资源。
横竖屏切换
1 切换到横屏
onsaveinstancestate
onpause
onstop
ondestroy
oncreate
onstart
onrestoreinstancestate
onresume
2 切换到竖屏,销毁了两次
onsaveinstancestate
onpause
onstop
ondestroyoncreate
onstart
onrestoreinstancestate
onresume
onsaveinstancestate
onpause
onstop
ondestroy
oncreate
onstart
onrestoreinstancestate
onresume
3 修改androidmanifest.xml,把该activity添加 android:configchanges="orientation",切横屏,只销毁一次
onsaveinstancestate
onpause
onstop
ondestroy
oncreate
onstart
onrestoreinstancestate
onresume
4 再切回竖屏,发现不会再打印相同信息,但多打印了一行onconfigchanged
onsaveinstancestate
onpause
onstop
ondestroy
oncreate
onstart
onrestoreinstancestate
onresume
onconfigurationchanged
5 更改 android:configchanges="orientation" 改成 android:configchanges="orientation|keyboardhidden",切横屏,就只打印onconfigchanged
onconfigurationchanged
6 切回竖屏
onconfigurationchanged
onconfigurationchanged
总结:
1、不设置activity的android:configchanges时,切屏会重新调用各个生命周期,切横屏时会执行一次,切竖屏时会执行两次
2、设置activity的android:configchanges="orientation"时,切屏还是会重新调用各个生命周期,切横、竖屏时只会执行一次
3、设置activity的android:configchanges="orientation|keyboardhidden"时,切屏不会重新调用各个生命周期,只会执行onconfigurationchanged方法
例举了 7 个常用的钩子:
protected void oncreate(bundle savedinstancestate)
protected void onstart()
protected void onresume()
protected void onpause()
protected void onstop()
protected void onrestart()
protected void ondestroy()
简要说明:
oncreate(bundle savedinstancestate):创建activity时调用。设置在该方法中http://www.myexception.cn/,还以bundle中可以提出用于创建该 activity 所需的信息。
onstart():activity变为在屏幕上对用户可见时,即获得焦点时,会调用。
onresume():activity开始与用户交互时调用(无论是启动还是重新启动一个活动,该方法总是被调用的)。
onpause():activity被暂停或收回cpu和其他资源时调用,该方法用于保存活动状态的。。
onstop():activity被停止并转为不可见阶段及后续的生命周期事件时,即失去焦点时调用。
onrestart():重新启动activity时调用。该活动仍在栈中,java.io.unsupportedencodingexception而不是启动新的活动。
ondestroy():activity被完全从系统内存中移除时调用,该方法被调用可能是因为有人直接调用 finish()方法 或者系统决定停止该活动以释放资源。
横竖屏切换
1 切换到横屏
onsaveinstancestate
onpause
onstop
ondestroy
oncreate
onstart
onrestoreinstancestate
onresume
2 切换到竖屏,销毁了两次
onsaveinstancestate
onpause
onstop
ondestroyoncreate
onstart
onrestoreinstancestate
onresume
onsaveinstancestate
onpause
onstop
ondestroy
oncreate
onstart
onrestoreinstancestate
onresume
3 修改androidmanifest.xml,把该activity添加 android:configchanges="orientation",切横屏,只销毁一次
onsaveinstancestate
onpause
onstop
ondestroy
oncreate
onstart
onrestoreinstancestate
onresume
4 再切回竖屏,发现不会再打印相同信息,但多打印了一行onconfigchanged
onsaveinstancestate
onpause
onstop
ondestroy
oncreate
onstart
onrestoreinstancestate
onresume
onconfigurationchanged
5 更改 android:configchanges="orientation" 改成 android:configchanges="orientation|keyboardhidden",切横屏,就只打印onconfigchanged
onconfigurationchanged
6 切回竖屏
onconfigurationchanged
onconfigurationchanged
总结:
1、不设置activity的android:configchanges时,切屏会重新调用各个生命周期,切横屏时会执行一次,切竖屏时会执行两次
2、设置activity的android:configchanges="orientation"时,切屏还是会重新调用各个生命周期,切横、竖屏时只会执行一次
3、设置activity的android:configchanges="orientation|keyboardhidden"时,切屏不会重新调用各个生命周期,只会执行onconfigurationchanged方法