Magren

Magren

Idealist & Garbage maker 🛸
twitter
jike

Android Activity生命周期

先上 Google 提供的经典图,是对 Activity 生命周期各个阶段之间导航转换的直观展现。
Activity 类提供了六个核心回调:onCreate()onStart()onResume()onPause()onStop()onDestroy()

生命周期.png

说明#

  • 在正常的情况下,Activity 从启动到结束会按以下的顺序经历整个生命周期:onCreate ()->onStart ()->onResume ()->onPause ()->onStop ()->onDestory ()。
  • onCreate (): 系统首次创建 Activity 的时候触发,可以做一些初始化的工作,比如初始化 Activity 所需要的数据,还有调用 setContentView 加载界面布局资源。
  • onRestart ():表示 Activity 正在重新启动。一般情况下,当当前 Activity 从不可见重新变为可见状态时,onRestart 就会被调用。这种情形一般是用户行为导致的,比如用户按 Home 键切换到桌面或打开了另一个新的 Activity,接着用户又回到了这个 Actvity。
  • onStart (): 表示 Activity 正在被启动,即将开始,这时 Activity 已经出现了,** 但是还没有出现在前台,无法与用户交互。** 这个时候可以理解为 Activity 已经显示出来,但是我们还看不到。
  • onResume (): 表示 Activity 已经可见了,并且出现在前台并开始活动。需要和 onStart () 对比,onStart 的时候 Activity 还在后台,onResume 的时候 Activity 才显示到前台。
  • onPause (): 表示 Activity 正在停止,仍可见,正常情况下,紧接着 onStop 就会被调,onPause 中不能进行耗时操作,会影响到新 Activity 的显示。因为 onPause 必须执行完,新的 Activity 的 onResume 才会执行。
  • onStop (): 表示 Activity 即将停止,不可见,位于后台。可以做稍微重量级的回收工作,同样不能太耗时。
  • onDestory (): 表示 Activity 即将销毁,这是 Activity 生命周期的最后一个回调,可以做一些回收工作和最终的资源回收。

几种普遍情况#

从 A 页面 Activity 跳转到 B 页面 Activity,然后关闭 B 页面 Activity,回到 A 页面 Activity#

  • 针对开启的 B 页面 Activity,第一次启动,回调如下:onCreate ()->onStart ()->onResume ()
  • 用户打开 B 页面 Activiy 的时候,A 页面的 Activity处于不可见的回调如下:onPause ()->onStop ()
  • 再次从 B 页面回到 A 页面原 Activity 时,A 页面从不可见到可见回调如下:onRestart ()->onStart ()->onResume ()
  • 按 back 键回退时,B 页面 Activity 回调如下:onPause ()->onStop ()->onDestory ()
  • 按 Home 键切换到桌面后又回到 A 页面该 Actitivy,回调如下:onPause ()->onStop ()->onRestart ()->onStart ()->onResume ()
  • 调用 finish () 方法后,回调如下:onDestory ()(以在 onCreate () 方法中调用为例,不同方法中回调不同,通常都是在 onCreate () 方法中调用)

Activity 的三种运行状态#

Resumed(活动状态)#

又叫 Running 状态,这个 Activity 正在屏幕上显示,并且有用户焦点。这个很好理解,就是用户正在操作的那个界面。

Paused(暂停状态)#

这是一个比较不常见的状态。这个 Activity 在屏幕上是可见的,但是并不是在屏幕最前端的那个 Activity。比如有另一个非全屏或者透明的 Activity 是 Resumed 状态,没有完全遮盖这个 Activity。

Stopped(停止状态)#

当 Activity 完全不可见时,此时 Activity 还在后台运行,仍然在内存中保留 Activity 的状态,并不是完全销毁。这个也很好理解,当跳转的另外一个界面,之前的界面还在后台,按回退按钮还会恢复原来的状态,大部分软件在打开的时候,直接按 Home 键,并不会关闭它,此时的 Activity 就是 Stopped 状态。

部分流程分支#

  • 启动 Activity: onCreate ()—>onStart ()—>onResume (),Activity 进入运行状态。
  • Activity 退居后台:当前 Activity 转到新的 Activity 界面或按 Home 键回到主屏: onPause ()—>onStop (),进入停滞状态。
  • Activity 返回前台: onRestart ()—>onStart ()—>onResume (),再次回到运行状态。
  • Activity 退居后台,且系统内存不足, 系统会杀死这个后台状态的 Activity(此时这个 Activity 引用仍然处在任务栈中,只是这个时候引用指向的对象已经为 null),若再次回到这个 Activity, 则会走 onCreate ()–>onStart ()—>onResume ()(将重新走一次 Activity 的初始化生命周期)
  • 锁屏:onPause ()->onStop ()
  • 解锁:onStart ()->onResume ()

横竖屏下切换#

第一种情况,销毁当前的 Activity:#

在横竖屏切换的过程中,Activity 会先销毁后重建,也应该避免这种情况。
这里有两个回调:

  • onSaveInstanceState 和 onRestoreInstanceState。
  • 在 Activity 由于异常情况下终止时,系统会调用 onSaveInstanceState 来保存当前 Activity 的状态。这个方法的调用是在 onStop 之前,它和 onPause 没有既定的时序关系,该方法只在 Activity 被异常终止的情况下调用。当异常终止的 Activity 被重建以后,系统会调用 onRestoreInstanceState,并且把 Activity 销毁时 onSaveInstanceState 方法所保存的 Bundle 对象参数同时传递给 onRestoreInstanceState 和 onCreate 方法。因此,可以通过 onRestoreInstanceState 方法来恢复 Activity 的状态,该方法的调用时机是在 onStart 之后。其中 onCreate 和 onRestoreInstanceState 方法来恢复 Activity 的状态的区别: onRestoreInstanceState 回调则表明其中 Bundle 对象非空,不用加非空判断。onCreate 需要非空判断。建议使用 onRestoreInstanceState。
  • 简单来说,这个过程 Activity 的生命周期为:onPause ()->onSaveInstanceState ()-> onStop ()->onDestroy ()->onCreate ()->onStart ()->onRestoreInstanceState->onResume ()

第二种情况,当前的 Activity 不销毁,但是我们需要设置 Activity 的属性:#

可以通过在 AndroidManifest 文件的 Activity 中指定如下属性:

<activity
    android:name=".activity.VideoDetailActivity"
    android:configChanges="orientation|keyboardHidden|screenSize"
    android:screenOrientation="portrait"/>

通过回调下面的方法,避免横竖屏切换的时候 Activity 的销毁和重建:

@Override
public void onConfigurationChanged(Configuration newConfig) {
    super.onConfigurationChanged(newConfig);
}

当资源不足的时候,保留 Activity 的优先级顺序:#

  • 前台 Activity—— 正在和用户交互的 Activity,优先级最高。
  • 可见但非前台 Activity—— 比如 Activity 中弹出了一个对话框,导致 Activity 可见但是位于后台无法和用户交互。
  • 后台 Activity—— 已经被暂停的 Activity,比如执行了 onStop,优先级最低。
加载中...
此文章数据所有权由区块链加密技术和智能合约保障仅归创作者所有。