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

文章目录

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

参考文献

一. 基础知识

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

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

2.2 按 Back 键返回上一个 Activity

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

2.3 按 Home 键(Activity 进入后台)

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

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

场景:启动 Activity A 时,突然收到电话或系统弹窗。

A 的启动流程被中断,需等用户返回后继续完成。

java 复制代码
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 之后,如果仍然没有得到调用,会主动触发。

相关推荐
千里马学框架5 天前
一起学 Android 14:ShellTransition 屏幕旋转过程深度剖析
android·智能手机·性能优化·framework·性能·屏幕旋转·rotation
美狐美颜SDK开放平台5 天前
开发直播APP时如何接入视频美颜SDK?开发流程与注意事项
android·人工智能·计算机视觉·音视频·直播美颜sdk
AFinalStone5 天前
Android7 SystemUI源码解析(七)Keyguard锁屏模块深度解析
android·systemui
致远ccc5 天前
Google Play 上架前如何测试 App?多国家 Android 环境测试
android·app测试·googleplay·多国家应用测试
ttyyttemo5 天前
Kotlin 协程中的 Job 结构化并发与取消
android
sun0077005 天前
tbox 4g/5g切换,导致wan ip 改变,导致车机旧网络不可用。需要重启车机才行
android
ai2work5 天前
ch23 综合复刻:从零做一个最小可用版本(capstone)
kotlin
其实防守也摸鱼5 天前
内网穿透与反向代理:原理、工具与实战指南
android·大数据·运维·安全·网络安全·自动化·渗透
ai2work5 天前
ch21 签名、校验与发版
kotlin
AFinalStone5 天前
Android7 SystemUI 源码解析(四)NavigationBar 导航栏与 SystemBars
android·systemui