先总结回忆一下Activity的生命周期的几个方法:
1.打开Activity
会依次执行onCreate、onStart、onResume方法
2.关闭Activity
会依次执行onPause、onStop、onDestroy方法

Android15平台测试-关于根Activity的生命周期
但是注意android程序第一个启动的Activity,在back键盘回退消失时,它没有销毁,而是等价于按下Home键。会依次执行onPause、onStop方法,而不会执行onDestroy方法。
而点击桌面图标重新打开Activity时,不会再执行onCreate方法,而是执行onStart、onResume方法。
见:http://xinyiworld.top/wordpress_it/?p=15766

问题1:A打开B,两者的生命周期方法。

看日志:

2025-07-18 10:52:23.420  3170-3170  MainActivity            com.cz.webviewtest                   I  onPause: 
2025-07-18 10:52:23.430  3170-3170  MainActivity2           com.cz.webviewtest                   I  onCreate: 
2025-07-18 10:52:23.433  3170-3170  MainActivity2           com.cz.webviewtest                   I  onStart: 
2025-07-18 10:52:23.434  3170-3170  MainActivity2           com.cz.webviewtest                   I  onResume: 
2025-07-18 10:52:23.979  3170-3170  MainActivity            com.cz.webviewtest                   I  onStop: 

因为是单线程,所以日志打印的顺序是准确的。
A执行onPause方法
B执行onCreate、onStart、onResume方法
A执行onStop方法

问题2:A打开B。B退出后,两者的生命周期方法。

2025-07-18 10:55:21.120  3170-3170  MainActivity2           com.cz.webviewtest                   I  onPause:
2025-07-18 10:55:21.126  3170-3170  MainActivity            com.cz.webviewtest                   I  onStart:
2025-07-18 10:55:21.126  3170-3170  MainActivity            com.cz.webviewtest                   I  onResume:
2025-07-18 10:55:21.679  3170-3170  MainActivity2           com.cz.webviewtest                   I  onStop:
2025-07-18 10:55:21.680  3170-3170  MainActivity2           com.cz.webviewtest                   I  onDestroy:

B执行onPause方法
A执行onStart、onResume方法
而后B执行onStop、onDestroy方法

问题3:转屏执行的生命周期方法

看日志

2025-07-18 11:39:49.533  8967-8967  MainActivity2           com.cz.webviewtest                   I  onPause:
2025-07-18 11:39:49.534  8967-8967  MainActivity2           com.cz.webviewtest                   I  onStop:
2025-07-18 11:39:49.535  8967-8967  MainActivity2           com.cz.webviewtest                   I  onSaveInstanceState
2025-07-18 11:39:49.535  8967-8967  MainActivity2           com.cz.webviewtest                   I  onDestroy:
2025-07-18 11:39:49.559  8967-8967  MainActivity2           com.cz.webviewtest                   I  onCreate:
2025-07-18 11:39:49.573  8967-8967  MainActivity2           com.cz.webviewtest                   I  onStart:
2025-07-18 11:39:49.574  8967-8967  MainActivity2           com.cz.webviewtest                   I  onRestoreInstanceState
2025-07-18 11:39:49.577  8967-8967  MainActivity2           com.cz.webviewtest                   I  onResume:

可以看到Activity会销毁重建

1. **`onPause()`**
   - Activity 失去焦点(转屏动画开始前)。
2. **`onStop()`**
   - Activity 完全不可见。
3. **`onSaveInstanceState(Bundle outState)`**
   - **在 `onStop()` 之后、`onDestroy()` 之前调用**,用于保存临时数据(如 UI 状态)。
   - *(这是关键修正点:`onSaveInstanceState()` 的调用时机是在 `onStop()` 之后,而非之前!)*
4. **`onDestroy()`**
   - Activity 被销毁(释放资源)。
5. **`onCreate(Bundle savedInstanceState)`**
   - 重建 Activity,通过 `savedInstanceState` 恢复数据。
6. **`onStart()`**
   - Activity 可见但未获得焦点。
7. **`onRestoreInstanceState(Bundle savedInstanceState)`**
   - *(可选)* 在 `onStart()` 之后调用,提供另一种恢复数据的途径。
8. **`onResume()`**
   - Activity 重新获得焦点,可交互。
  • 如果希望 Activity 不销毁重建,可以通过以下方式:

在 AndroidManifest.xml 中声明:

<activity android:name=".MyActivity"
    android:configChanges="orientation|screenSize|screenLayout|keyboardHidden">
</activity>

此时系统会调用 onConfigurationChanged() 代替销毁重建:

@Override
public void onConfigurationChanged(Configuration newConfig) {
    super.onConfigurationChanged(newConfig);
    if (newConfig.orientation == Configuration.ORIENTATION_LANDSCAPE) {
        // 处理横屏逻辑
    }
}

注意:从 Android 3.2(API 13)开始,必须包含 screenSize,因为设备尺寸也可能变化。


0 条评论

发表回复

您的电子邮箱地址不会被公开。