先总结回忆一下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 条评论