浅析Activity生命周期

官方图片

实践出真知

了解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. 运行时配置变更
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值