美文网首页
浅析Activity生命周期

浅析Activity生命周期

作者: AndrLin | 来源:发表于2018-01-04 16:30 被阅读0次
    activity_lifecycle

    实践出真知

    了解Activity生命周期,最好的方法当然是写个Demo,自己试一试了。
    首先自己创建一个Application,在其中使用registerActivityLifecycleCallbacks注册对Activity生命周期回调的监听。

    registerActivityLifecycleCallbacks(object : ActivityLifecycleCallbacks {
                override fun onActivityPaused(activity: Activity) {
                    Log.d(activity.localClassName, "onPause")
                }
    
                override fun onActivityResumed(activity: Activity) {
                    Log.d(activity.localClassName, "onResume")
                }
    
                override fun onActivityStarted(activity: Activity) {
                    Log.d(activity.localClassName, "onStart")
                }
    
                override fun onActivityDestroyed(activity: Activity) {
                    Log.d(activity.localClassName, "onDestroy")
                }
    
                override fun onActivitySaveInstanceState(activity: Activity, outState: Bundle?) {
                    Log.d(activity.localClassName, "onActivitySaveInstanceState")
                }
    
                override fun onActivityStopped(activity: Activity) {
                    Log.d(activity.localClassName, "onStop")
                }
    
                override fun onActivityCreated(activity: Activity, savedInstanceState: Bundle?) {
                    Log.d(activity.localClassName, "onCreate")
                }
    
            })
    

    然后创建多个Activity,这样就可以开始愉快的玩耍了。

    1.正常启动->正常关闭

    onCreate -> onStart -> onResume -> onPause -> onStop -> onDestroy

    2.OldActivity启动NewActivity

    OldActivity

    onPause

    NewActivity

    onCreate
    onStart
    onResume

    OldActivity

    onSaveInstanceState
    onStop

    3.关闭NewActivity,回到OldActivity

    NewActivity

    onPause

    OldActivity

    onRestart
    onStart
    onResume

    NewActivity

    onStop
    onDestroy

    4.OldActivity启动透明主题NewActivity

    OldActivity

    onPause

    NewActivity

    onCreate
    onStart
    onResume

    OldActivity不会走onStop

    5.关闭透明主题NewActivity,回到OldActivity

    NewActivity

    onPause

    OldActivity

    onResume

    NewActivity

    onStop
    onDestroy

    因为启动透明主题NewActivity时,NewActivity没走onStop,同样现在也不会走onStart

    6.Activity切换到后台

    onPause -> onSaveInstanceState -> onStop

    7.Activity从后台切换到前台

    onRestart -> onStart -> onResume

    8.横竖屏切换

    onPause -> onSaveInstanceState -> onStop -> onDestroy -> onCreate -> onStart -> onRestoreInstanceState -> onResume

    竖屏切换横屏和横屏切换竖屏,都会导致Activity的重启,走上面描述的生命周期流程。

    解决方法:在清单文件相应Activity加上android:configChanges="orientation|screenSize"

    应用面向 API 级别 13 或更高级别,必须要添加screenSize才会生效,达到Activity不重启,且横竖屏相互切换都能触发onConfigurationChanged。因为当设备在横向与纵向之间切换时,该配置也会发生变化。

    测试发现sdk为26和27,只设置orientation就能达到效果。(官方文档未找到相应说明)

    测试均在模拟器上进行,测试sdk版本19~27。

    阐述各生命周期方法

    onCreate

    Activity创建启动时调用。

    onStart

    完成onCreate后调用,或者activity处于停止再次被启动时调用。

    onResume

    在 Activity 即将开始与用户进行交互之前调用。onResume执行了,Activity才会显示到前台,从而与用户进行交互

    onPause

    Activity正在停止时调用。不可处理太耗时操作,否则会影响新activity显示的快慢(当OldActivity的onPause执行完了时,NewActivity的onResume才会执行,NewActivity才能显示到前台)

    onStop

    Activity对用户不再可见时调用。如果启动新的Activity是透明主题(此时OldActivity任然可见),将不会走onStop。不能做太耗时的操作,可稍微处理一些重量级的回收工作。

    onDestroy

    Activity被销毁前调用,也是Activity生命周期结束前调用的最后一个方法。处理一些回收工作和资源释放。

    onRestart

    在 Activity 已停止并即将再次启动前调用。NewActivity处于可见状态时,OldActivity处于onStop状态时,返回OldActivity将触发OldActivity的onRestart方法。

    Activity的整个生命周期发生在onCreate和onDestroy之间。

    Activity的可见生命周期发生在onStart和onStop之间。

    Activity的前台生命周期发生在onResume和onPause之间。

    保存Activity状态

    onSaveInstanceState

    在第一节中,我们发现当运行时配置发生变更和启动新的Activity时,会触发onSaveInstanceState方法,此方法就是用来保存Activity当前状态的。为了便于Activity异常关闭,回到此Activity时页面状态恢复,给用户更友好的体验,可以在此方法中进行相应状态的保存。

    注:

    1.onSaveInstanceState如果被调用,会在onStop之前执行,与onPause没有一定的时序关系。

    2.因onSaveInstanceState默认实现也会恢复部分UI状态,所以重写时一定要调用超类实现。

    3.由于无法保证系统调用onSaveInstanceState必然性,所以不适合在其中进行大数据持久化操作。可在onPause中进行。

    onRestoreInstanceState

    有保存状态的方法,当然有用于恢复状态的方法。当Activity重建时,系统会将Bundle传递给onCreateonRestoreInstanceState。在onCreateonRestoreInstanceState任一方法中都可进行状态恢复。

    注:

    1.当Activity被重建时,onRestoreInstanceState会在onStart后调用。

    2.和onSaveInstanceState一样,在重写onRestoreInstanceState时,也需要调用超类实现。

    3.onCreateonRestoreInstanceState都可以进行状态恢复,只是onCreateBundle可能是空的(在Activity第一次创建启动时)。

    参考文案

    1. 《Android开发艺术探索》—— 任玉刚
    2. 官方开发文档 —— Activity
    3. 官方configChanges说明
    4. 运行时配置变更

    相关文章

      网友评论

          本文标题:浅析Activity生命周期

          本文链接:https://www.haomeiwen.com/subject/shlhnxtx.html