Activity生命周期小节

Activity被设计用来与用户进行交互,界面元素的展示、交互动效、业务逻辑等都将在这里依赖业务逻辑以及其间的关系进行编码。
Activity是整个应用生命周期的重要组成部分。所有的activity都会被 Activity Stack进行管理,当一个新的Activity被启动,它将会被系统放入Activity Stack 并且处于栈顶,而之前的Activity依然停留在Activity Stack中,处于新的Activity之下。

Activity的几种状态

  • running Activity对用户可见,处于屏幕的最前,即Activity Stack的栈顶
  • paused 当前Activity被dialog和或者非全屏的Activity覆盖,此时,Activity对于用户可能可见,且不再具有与用户交互的能力。
  • stopped 另一个Activity来到了前台,当前的Activity完全被覆盖对用户不可见。
  • destroyed Activity处于 paused或者stopped状态时被系统回收了。

Activity向开发者提供了一整个完整的生命周期hook函数

Activity生命周期图

onCreate(bundle) -> onStart() -> onResume() -> onPause() ->onStop() -> onDestroy()

可见的生命周期:onStart() 与onStop() 两个函数调用之前的这段时间,Activity对于用户是可见的。

前台生命周期:onResume() 与 onPause() 两个函数发生调用的这段时间内,Activity是处于前台的。

  • onCreate() 所有的Activity对需要实现onCreate(bundle)方法,在这里为window 设置ui,绑定数据。

  • onStart () Activity 即将进入前台被用户可见。

  • onResume() Activiy进入前台且能够与用户交互。

  • onPause() 系统开始调用另一个Activity的生命周期;可以在在这里进行数据的保存,持久化,停止动画,释放CPU资源等的轻量级操作。只有当这个方法放回之后系统才会调用另一个Activity的生命周期,所以请不要在该方法里执行耗时的操作,以避免造成UI卡顿。

  • onStop() Activity 不在被用户可见,新的Activity已经处于running状态,可以在这里了持久化一些数据,释放内存资源。

  • onDestroy() Activity 进入了destroyed的状态 ,被调用了finish方法或者被系统回收内存而被清理。

  • onRestart() Activity 进入stopped 状态时,重新被带入前台。

    在实现这些生命周期hook函数时,总是需要调用父类的方法

各种情况下Activity生命周期的调用顺序###

  • 当Activity被启动时各个生命周期方法的调用顺序

    启动Activity

  • 当Activity处于running状态按下返回键时

    按下返回键

  • 当Activity处于running状态按下Home键时

    按下Home键时

  • 从多任务切换器切换时

  • 当Activity处于running状态切换到另一个Activity时

  • 从另一个Activity切换回时

  • 按下锁屏键

    按下Home键时

  • 解锁时

Configuration changes 对生命周期的影响

设备的configuration 发生改变时,都会最先通知到Activity处,系统会将Activity执行destroy操作,然后重新激活Activity,会重走一遍生命周期。

在新的系统版本里,由竖屏切换到横屏,或者横屏切换到竖屏都只会重走一遍生命周期,这个时候控件的一些状态会被保存,重走生命周期的时候状态会被恢复,但是用户的输入等数据不会被系统保存,需要开发者自己处理。

有些时候需要我们绕过重走生命周期的流程,Manifest文件中,为Activity配置属性:android:configChanges;可以为该属性指定很多种值,已达到当这些值对应的情况改变打的时候,不重走生命周期,而是回调到Activity的onConfigurationChanged方法。

以下配置可以达到横竖屏切换时,不重启Activity的效果:

1
android:configChanges="orientation|keyboardHidden|screenSize"