当前位置: 首页 > news >正文

【Android Activity】生命周期深入理解

文章目录

  • 一. 基础知识
    • 1. 生命周期图
    • 2. 生命周期方法详解
    • 3. 生命周期方法调用源码简析
  • 二. 场景分析
    • 1. 异常场景
      • 1.1 资源相关的系统配置发生改变导致Activity被杀死并重新创建
      • 1.2 资源内存不足导致低优先级的Activity被杀死
    • 2. 经典具体场景
      • 2.1 从Activity A启动Activity B
      • 2.2 按 Back 键返回上一个 Activity
      • 2.3 按 Home 键(Activity 进入后台)
      • 2.4 启动 Activity 但被其他应用抢占焦点
  • 四. 常用结论
    • 1. 不要在onPause方法中做重量级的操作
    • 2. 按Home键返回桌面,onDestroy方法不一定会调用
    • 3. 按 Back 键返回上一个 Activity,onDestroy() 方法一定会被调用
    • 4. onDestroy方法是在Activity finish之后不是立即执行的

参考文献

  • https://blog.csdn.net/2301_81193552/article/details/149632957
  • https://blog.csdn.net/studyForMokey/article/details/148962943?spm=1011.2124.3001.6209

一. 基础知识

1. 生命周期图

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

注意点:

  • 当用户打开新的Activity或者切换到桌面时,回调如下:onPause->onStop。特殊场景,如果新Activity用了透明主题,那就不会回调onStop(此时原来的activity还是部分可见)
  • Activity A启动Activity B,先是A的onPause方法调用后,才执行B的onResume方法。(官方文档中写着:不要再onPause方法中做重量级的操作)

2. 生命周期方法详解

在这里插入图片描述
注意点:
onRestart:通常用户行为导致,比如用户按Home键切换到桌面或者用户打开了一个新的activity,接着用户又回到了这个activity;

3. 生命周期方法调用源码简析

启动Activity的请求会交给Instrumentation处理,然后它通过Binder向AMS发送请求,AMS内部维护一个ActivityStack并负责栈内的Activity的状态同步,AMS向ActivityThread去同步Activity的状态从而完成生命周期方法的调用

二. 场景分析

1. 异常场景

1.1 资源相关的系统配置发生改变导致Activity被杀死并重新创建

在这里插入图片描述

  • onSaveInstanceState和onRestoreInstanceState触发时机:
  •  onCreate() → onStart() → onRestoreInstanceState() → onResume()onPause() → onSaveInstanceState() → onStop()
    

在这里插入图片描述

  • 可以通过android:configChanges="orientation|keyboardHidden|screenSize"来其避免重建,而是通过重写onConfigurationChanged方法写做一些处理

1.2 资源内存不足导致低优先级的Activity被杀死

优先级顺序(高到低):

  • 前台Activity —— 正在和用户交互的Activity,优先级最高
  • 可见但非前台Activity —— 比如Activity中弹出了一个对话框,导致Activity可见但是位于后台无法和用户直接交互
  • 后台Activity —— 已经暂停了的Activity,如执行了onStop,此时优先级最低

2. 经典具体场景

2.1 从Activity A启动Activity B

当前Activity.onPause() → 新Activity.onCreate() → 新Activity.onStart() → 新Activity.onResume() → 当前Activity.onStop()
  • 当前 Activity 必须先暂停(onPause 完成),新 Activity 才能启动。
  • 若新 Activity 为透明主题,当前 Activity 不会调用 onStop ()(仍可见但不可交互)。

2.2 按 Back 键返回上一个 Activity

当前Activity.onPause() → 上一个Activity.onRestart() → 上一个Activity.onStart() → 上一个Activity.onResume() → 当前Activity.onStop() → 当前Activity.onDestroy()
  • 上一个 Activity 从停止状态恢复,需调用onRestart()
  • 当前 Activity 被销毁,资源完全释放

2.3 按 Home 键(Activity 进入后台)

onPause()onStop()
  • Activity 进入后台,但未被销毁(保留在 Activity 栈中)。
  • 若系统内存不足,可能被回收(触发onDestroy())

2.4 启动 Activity 但被其他应用抢占焦点

场景:启动 Activity A 时,突然收到电话或系统弹窗。
A 的启动流程被中断,需等用户返回后继续完成。

A.onPause() → (系统抢占焦点) → A.onStop() → (用户返回) → A.onRestart()A.onStart()A.onResume()

四. 常用结论

1. 不要在onPause方法中做重量级的操作

原因:若是Activity A启动Activity B,需要等A的pause方法执行完,才会执行B的生命周期方法

2. 按Home键返回桌面,onDestroy方法不一定会调用

3. 按 Back 键返回上一个 Activity,onDestroy() 方法一定会被调用

4. onDestroy方法是在Activity finish之后不是立即执行的

Activity 的 onStop/onDestroy 是依赖 IdleHandler 来回调的,正常情况下当主线程空闲时会调用。但是由于某些特殊场景下的问题(比如在启动第二个activity时,进行大量动画的场景,源源不断的向主线程消息队列塞消息),导致主线程迟迟无法空闲,onStop/onDestroy 也会迟迟得不到调用但这并不意味着 Activity 永远得不到回收,系统提供了一个兜底机制,当 onResume() 回调 10s 之后,如果仍然没有得到调用,会主动触发。

http://www.dtcms.com/a/561092.html

相关文章:

  • 哪些资产最适合RFID技术管理?
  • 如何做网站的书籍建设部网站 专业评估
  • 网站排名下降东莞纸箱定制 技术支持 东莞网站建设
  • 组合数学第六章 容斥定理
  • vscode 安装Jupiter以后,终端无法切换conda环境了
  • 潍坊网站制作最低价格wordpress现在还慢吗
  • 785.力扣LeetCode_ 判断二分图
  • 如何使用表格做网站百度开户推广
  • Go语言设计模式:抽象工厂模式详解
  • 网站建设 东营远见网络公司做电脑网站步骤
  • 开发实战 - ego商城 - 7 地址管理模块
  • dz网站源码流量卡套餐
  • Kruskal 算法深入
  • 学习RT-thread(RT-thread定时器)
  • 基于整数MCU的FOC电机控制深度解析:从浮点到定点的工程实践
  • 在整数MCU上实现快速除法计算:原理、方法与优化
  • 南昌外贸网站建设网站建设faq
  • 杭州网站建设官方蓝韵网络网站开发授权书
  • 机器学习周报二十
  • 在 Jest 结合 Vue Test Utils 进行组件测试时,`shallowMount` 是一个常用的方法,用于创建组件的**浅渲染实例**
  • 深入理解 NAT、代理服务与内网穿透:解决网络通信的关键技术
  • Redisson 与 Spring Boot 3.4 整合指南
  • 建设房地产公司网站的费用程序员网站开发框架
  • wordpress 新闻类网站什么网站可以免费做护师题
  • C++笔记-14-结构体
  • .NET周刊【10月第3期 2025-10-19】
  • 视频时间基 (time_base) 详解:时间的“刻度单位”
  • 网站开发最佳实践wordpress连接公众号
  • 数据库-基础命令
  • 蚌埠做企业网站wordpress外网访问不了