首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Android Activity 生命周期

Android Activity 生命周期

原创
作者头像
AnRFDev
修改2021-02-03 10:28:05
9510
修改2021-02-03 10:28:05
举报
文章被收录于专栏:AnRFDevAnRFDev

Activity 生命周期

前面我们看了Activity的综述。本文我们来看它的生命周期。

Android官方文档介绍的很详细。

这里我们打一些log仔细观察一下生命周期的变化。

生命周期图示
生命周期图示

生命周期变化

执行一些常见的操作,打log看一下生命周期的变化。

启动然后退出

onCreate
onStart
onResume
onWindowFocusChanged: hasFocus: true

onWindowFocusChanged: hasFocus: false
onPause
onStop
onDestroy

启动后按home键

Act1: onCreate
Act1: onStart
Act1: onResume
Act1: onWindowFocusChanged: hasFocus: true

// 按home键
Act1: onWindowFocusChanged: hasFocus: false
Act1: onPause
Act1: onStop

// 再回来
Act1: onRestart
Act1: onStart
Act1: onResume
Act1: onWindowFocusChanged: hasFocus: true

// 按返回键退出act
Act1: onWindowFocusChanged: hasFocus: false
Act1: onPause
Act1: onStop
Act1: onDestroy

旋转手机

activity在切换横竖屏的时候的生命周期。

[Life]: onCreate
[Life]: onStart
[Life]: onResume
[Life]: onWindowFocusChanged: hasFocus: true

// 横屏
[Life]: onPause
[Life]: onStop
[Life]: onDestroy
[Life]: onCreate
[Life]: onStart
[Life]: onResume
[Life]: onWindowFocusChanged: hasFocus: true

// 竖屏
[Life]: onPause
[Life]: onStop
[Life]: onDestroy
[Life]: onCreate
[Life]: onStart
[Life]: onResume
[Life]: onWindowFocusChanged: hasFocus: true

// 返回
[Life]: onWindowFocusChanged: hasFocus: false
[Life]: onPause
[Life]: onStop
[Life]: onDestroy

整个过程并没有走onRestart方法。更像是重新启动activity。

来回切换的生命周期变化

以2个Activity启动为例。

Act1: onCreate
Act1: onStart
Act1: onResume
Act1: onWindowFocusChanged: hasFocus: true
Act1: onPause
Act1: onWindowFocusChanged: hasFocus: false
Act2: onCreate
Act2: onStart
Act2: onResume
Act2: onWindowFocusChanged: hasFocus: true
Act1: onStop
Act2: onWindowFocusChanged: hasFocus: false
Act2: onPause
Act1: onRestart
Act1: onStart
Act1: onResume
Act1: onWindowFocusChanged: hasFocus: true
Act2: onStop
Act2: onDestroy
Act1: onWindowFocusChanged: hasFocus: false
Act1: onPause
Act1: onStop
Act1: onDestroy

可以看到,启动act2的时候,act1显示失去了屏幕焦点,然后进入onPause;

Act2启动并可见后,act1来到onStop。

弹出AlertDialog

点击按钮弹出一个AlertDialog。观察发现调用了onWindowFocusChanged。

onWindowFocusChanged: hasFocus: false
onWindowFocusChanged: hasFocus: true

这里也可以用DialogFragment来做测试。

调用recreate()方法

[Life]: onCreate
[Life]: onStart
[Life]: onResume
[Life]: onWindowFocusChanged: hasFocus: true
[Life]: click [recreate]
[Life]: onPause
[Life]: onStop
[Life]: onDestroy
[Life]: onCreate
[Life]: onStart
[Life]: onResume

可以看到,调用recreate()方法后并没有走onWindowFocusChanged回调。

onCreate和onStart的区别

activity的状态区别

  • onCreate在系统首次创建 Activity 时触发。Activity 会在创建后进入已创建状态。
  • 当 Activity 进入“已开始”状态时,系统会调用此回调。onStart() 调用使 Activity 对用户可见,因为应用会为 Activity 进入前台并支持交互做准备。

onStart() 方法会非常快速地完成,并且与“已创建”状态一样,Activity 不会一直处于“已开始”状态。一旦此回调结束,Activity 便会进入已恢复状态,系统将调用 onResume() 方法。

onPause和onStop的区别

onPause() 执行非常简单,而且不一定要有足够的时间来执行保存操作。

因此,您不应使用 onPause() 来保存应用或用户数据、进行网络调用,或执行数据库事务。因为在该方法完成之前,此类工作可能无法完成。

已进入已停止状态,因此系统将调用 onStop() 回调。

举例而言,如果新启动的 Activity 覆盖整个屏幕,就可能会发生这种情况。

在 onStop() 方法中,应用应释放或调整应用对用户不可见时的无用资源。例如,应用可以暂停动画效果,或从细粒度位置更新切换到粗粒度位置更新。

使用 onStop() 而非 onPause() 可确保与界面相关的工作继续进行,即使用户在多窗口模式下查看您的 Activity 也能如此。

您还应该使用 onStop() 执行 CPU 相对密集的关闭操作。

测试机型:RedMi

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • Activity 生命周期
    • 生命周期变化
      • 启动然后退出
      • 启动后按home键
      • 旋转手机
      • 来回切换的生命周期变化
      • 弹出AlertDialog
      • 调用recreate()方法
    • onCreate和onStart的区别
      • onPause和onStop的区别
      领券
      问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档