注册

想搞懂Jetpack架构可以不搞懂生命周期知识吗?

1. 前言


Activity生命周期真是一个非常古老的话题,无论是10年前,还是当下。不管是面试还是工作,经常会遇到与Activity生命周期相关的问题。比如“按下返回键和Home键,生命周期方法调用顺序”、“A启动B,它们的生命周期方法调用顺序”。工作中,Jetpack Lifecycle、LiveData、ViewModel等组件都是建立在生命周期之上。


在我研究Jetpack Lifecycle、LiveData、ViewModel源码时,我发现它们与组件的生命周期有很大的关系。它们能够自动感知组件的生命周期变化。LiveData能够在onDestroy方法调用时自动将监听注销掉,ViewModel能够在Configuration发生改变时(比如旋转屏幕)自动保存数据,并且在Activity重建时恢复到Configuration发生改变之前。


本文我将从几个场景详细介绍Activity的生命周期变化。


2. 单Activity按返回按钮


触发步骤:



  • 按返回按钮
  • 或者调用finish方法
  • 重新进入Activity

该场景演示了用户启动,销毁,重新进入Activity的生命周期变化。调用顺序如图:


状态管理:



  • onSaveInstanceState没有被调用,因为Activity被销毁,没有必要保存状态
  • 当Activity被重新进入时,onCreate方法bundle参数为null

3. 单Activity按Home键


触发步骤:



  • 用户按Home键
  • 或者切换至其它APP
  • 重新进入Activity

该场景Activity会调用onStop方法,但是不会立即调用onDestroy方法。调用顺序如图:


状态管理:


当Activity进入Stopped状态,系统使用onSaveInstanceState保存app状态,以防系统将app进程杀死,重启后恢复状态。


4. 单Activity旋转屏幕


触发步骤:



  • Configuration发生改变, 比如旋转屏幕
  • 用户在多窗口模式下调整窗口大小

当用户旋转屏幕,系统会保留旋转之前的状态,能很好的恢复到之前的状态。调用顺序如图:


状态管理:



  • Activity被完全销毁掉,但是状态会被保存,而且会在新的Activity中恢复该状态
  • onCreate和onRestoreInstanceState方法中的bundle是一样的

5. 单Activity弹出Dialog


触发步骤:



  • 在API 24+上开启多窗口模式失去焦点时
  • 其它应用部分遮盖当前APP,比如弹出权限授权dialog
  • 弹出intent选择器时,比如弹出系统的分享dialog


该场景不适用于以下情况:



  • 相同APP中弹dialog,比如弹出AlertDialog或者DialogFragment不会导致Activity onPause发生调用
  • 系统通知。当用户下拉系统通知栏时,不会导致下面的Activity onPause发生调用。

6. 多个Activity跳转


触发步骤:



  • activity1 跳转到activity2
  • 按返回按钮


注意:activity1 跳转到activity2 正确的调用顺序是



->activity1.onPause


->activity2.onCreate


->activity2.onStart


->activity2.onResume


->activity1.onStop


->activity1.onSaveInstanceState



在该场景下,当新的activity启动时,activity1处于STOPPED状态下(但是没有被销毁),这与用户按Home键有点类似。当用户按返回按钮时,activity2被销毁掉。


状态管理:



  • onSaveInstanceState会被调用,但是onRestoreInstanceState不会。当activity2展示在前台时,如果发生了旋转屏幕,当activity1再次获得焦点时,它将会被销毁并且重建,这就是为什么activity1在失去焦点时为什么需要保存状态。
  • 如果系统杀死了app进程,该场景后面会介绍到

7. 多个Activity跳转,并且旋转屏幕



  • activity1 跳转到activity2
  • 在activity2上旋转屏幕
  • 按返回按钮


注意: 当返回activity1时,必须保证屏幕是保持旋转后的状态,否则并不会调用onDestroy方法。而且是在activity1回到前台时才会主动掉onDestroy


状态管理:


保存状态对所有的activity都非常重要,不仅仅是对前台activity。所有在后台栈中的activity在configuration发生改变时重建UI时都需要将保存的状态恢复回来。


8. 多个Activity跳转,被系统kill掉app



  • activity1 跳转到activity2
  • 在activity2上按Home键
  • 系统资源不足kill app


9. 总结


本文主要是从Google大佬Jose Alcérreca的文章翻译过来。他假设的这7个关于activity的生命周期场景,对了解Lifecycle有非常大的帮助。甚至对于面试都是有非常大的帮助。


后续我会写一系列关于Jetpack的文章。文风将会延续我的一贯风格,深入浅出,坚持走高质量创作路线。本文是我讲解Lifecycle的开篇之作。生命周期是Lifecycle、LiveDa、ViewModel等组件的基础。在对生命周期知识掌握不牢靠的情况,去研究那些组件,无异于空中楼阁。



作者:字节小站
链接:https://juejin.cn/post/6981965690014007327
来源:掘金
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。


0 个评论

要回复文章请先登录注册