复习 activity 的生命周期 手机锁屏时生命周期变化

来源:互联网 发布:mysql having 编辑:程序博客网 时间:2024/05/30 05:07

onCreat() 不可见不可交互 创建时调用

onStart()是activity界面被显示出来的时候执行的,用户可见,包括有一个activity在他上面,但没有将它完全覆盖,用户可以看到部分activity但不能与它交互      创建时或者从后台重新回到前台时调用


下面这三个状态是静态(static)的,意味着activity只有在这三个状态下能停留一段时间:

onResume()是该activity与用户能进行交互时被执行,用户可以获得activity的焦点,能够与用户交互。

                       创建或者从被覆盖、后台重新回到前台时被调用  

onPause() 可见不可交互(部分可见),不能接收用户输入也不能执行代码,另一个半透明或者小的activity正挡在前面。

                                                被覆盖到下面或者锁屏时被调用  

onStop() 不可见不可交互失去焦点,activity完全被遮挡,不能被用户看到,activity被认为在background,当Stopped的时候,activity实例的状态信息被保留,但是不能执行任何代码。

                                                 退出当前Activity或者跳转到新Activity时被调用  


onRestart() 从不可见到可见    

onDestory() 销毁activity         退出当前Activity时被调用,调用之后Activity就结束了

还是上图吧:



介绍一下集中情况的生命周期的调用,我在Myapplication添加了监测activity生命周期的回调方法(可参考http://blog.csdn.net/tongcpp/article/details/40344871),最近在看kotlin 所以不是用的Java代码,不过测试代码很简单,这里就不转为Java来看了,看一下我的application代码

onRestart() 方法在这个回调中没有就添加到了activity内部

class Myapplication : Application() {    override fun onCreate() {        super.onCreate()        this.registerActivityLifecycleCallbacks(object : Application.ActivityLifecycleCallbacks {            override fun onActivityResumed(activity: Activity?) {                /**                 * 打印出activity的名称和生命周期方法                 */                Log.e("Activity Life", "${activity?.localClassName}  onActivityResumed ")            }            override fun onActivityStarted(activity: Activity?) {                Log.e("Activity Life", "${activity?.localClassName}  onActivityStarted")            }            override fun onActivityDestroyed(activity: Activity?) {                Log.e("Activity Life", "${activity?.localClassName}  onActivityDestroyed")            }            override fun onActivitySaveInstanceState(activity: Activity?, outState: Bundle?) {                Log.e("Activity Life", "${activity?.localClassName}  onActivitySaveInstanceState")            }            override fun onActivityStopped(activity: Activity?) {                Log.e("Activity Life", "${activity?.localClassName}  onActivityStopped")            }            override fun onActivityCreated(activity: Activity?, savedInstanceState: Bundle?) {                Log.e("Activity Life", "${activity?.localClassName}  onActivityCreated")            }            override fun onActivityPaused(activity: Activity?) {                Log.e("Activity Life", "${activity?.localClassName}  onActivityPaused")            }        })    }    }

 目前我的MainActivity随便写了点代码,启动APP,看日志

情景一:启动MainActivity 的时候调用的生命周期方法结果如下


create--->start--->resume

二(三星手机为例):此时手机进入锁屏状态调用的生命周期方法结果如下


pause--->stop

 随后打开锁屏


restart--->start--->resume


其它:锁屏时只会调用onPause(),而不会调用onStop方法,开屏后则调用onResume()


:直接按home返回主界面


pause--->stop

再次打开app


restart--->start---resume

:按back键返回主界面


puse--->stop--->destory

这是可以看到activity直接销毁了,毫无疑问再次打开APP的时候activity就调用了和情况一启动是相同的方法

:启动另一个activity



可以看见MainActivity首先进入pause状态,新activity启动,原activity进入stop状态,此时按back键返回MainActivity


:在MainActivity运行状态下有电话打来,生命周期是如何调用的呢?下面看一下测试结果


挂断电话后回到该界面调用的方法


restart--->start--->resume


:看一下activity弹出dialog时生命周期是怎么调用的吧!!!大笑大笑大笑想到的情况有限,可能会一直补充的

稍候加,想集成个dialog去测试

测试结果空空如也( ⊙ o ⊙ )!

发现dialog在依赖activity显示和消失的过程中不调用任何生命周期方法



情景八:横竖屏切换

1、不设置Activity的android:configChanges时,切屏会重新调用各个生命周期,切横屏时会执行一次,切竖屏时会执行两次

2、设置Activity的android:configChanges="orientation"时,切屏还是会重新调用各个生命周期,切横、竖屏时只会执行一次

3、设置Activity的android:configChanges="orientation|keyboardHidden"时,切屏不会重新调用各个生命周期,只会执行onConfigurationChanged方法(据说用模拟器是这个结果)


但我用OPPO7 真机测试发现上述三种情况都掉用了一次生命周期,且屏幕切换的时候原有的activity是被销毁了的,而重新创建了一个,就想不销毁之前的activity,然后找到 了这个http://blog.csdn.net/javensun/article/details/6793552  ,我没有时间去测试,等测试了在附上结果



除去上述生命周期以外,还有几个方法onWindowFocusChanged、onSaveInstanceState、onRestoreInstanceState方法

onWindowFocusChanged()    在 Activity窗口获得或失去焦点时被调用,在onResume之后或onPause之后调用

          例如创建时首次呈现在用户面前;当前Activity被其他Activity覆盖;当前Activity转到其他Activity或按Home键回到主屏,自身退居后台;用户退出当前Activity。以上几种情况都会调用onWindowFocusChanged,并且当Activity被创建时是在onResume之后被调用,当Activity被覆盖或者退居后台或者当前Activity退出时,它是在onPause之后被调用

onSaveInstanceState()            Activity被系统杀死时被调用.例如:屏幕方向改变时,Activity被销毁再重建;当前Activity处于后台,系统资源紧张将其杀死. 另外,当跳转到其他Activity或者按Home键回到主屏时该方法也会被调用,系统是为了保存当前View组件的状态.在onStop()之前被调用

onRestoreInstanceState()       Activity被系统杀死后再重建时被调用. 例如:屏幕方向改变时,Activity被销毁再重建;当前Activity处于后台,系统资源紧张将其杀死,用户又启动该Activity. 这两种情况下onRestoreInstanceState都会被调用,在onStart之后.