一、Activity完整生命周期
1. 核心生命周期方法
| 方法 | 触发时机 | 典型操作 |
|---|---|---|
onCreate() | Activity首次创建 | 初始化布局、绑定数据 |
onStart() | Activity可见但未获得焦点 | 注册广播接收器 |
onResume() | Activity可交互 | 启动动画、恢复视频播放 |
onPause() | 失去焦点但仍可见 | 暂停耗时操作 |
onStop() | 完全不可见 | 释放UI相关资源 |
onDestroy() | 最终销毁前 | 清理线程、反注册监听 |
2. 生命周期流程图
启动 → onCreate → onStart → onResume → 运行中
↑ ↓ ↓
onRestart ← onStop ← onPause
↓
onDestroy
二、Activity销毁的三种方式
1. 用户主动销毁
-
返回键:自动调用
finish() -
从最近任务划掉:系统强制销毁
-
代码调用:
finish(); // 标准销毁 finishAndRemoveTask(); // 同时移除任务栈(API 21+)
2. 配置变更销毁重建
-
场景:屏幕旋转、语言切换等
-
流程:
onPause() → onSaveInstanceState() → onStop() → onDestroy() → onCreate() → onStart() → onRestoreInstanceState() → onResume() -
禁用重建:
<activity android:configChanges="orientation|screenSize"/>
3. 系统资源回收
-
场景:内存不足时后台Activity被回收
-
特点:
-
可能不调用
onDestroy() -
必须通过
onSaveInstanceState()保存状态 -
恢复时Bundle可能为null(需判空)
-
三、正确销毁Activity的实践
1. 资源释放清单
-
必须释放:
-
广播接收器(
unregisterReceiver()) -
文件描述符/数据库连接
-
动画(
animator.cancel())
-
-
推荐操作:
@Override protected void onDestroy() { super.onDestroy(); // 1. 取消网络请求 requestManager.cancelAllRequests(); // 2. 反注册监听 sensorManager.unregisterListener(this); // 3. 停止异步任务 handler.removeCallbacksAndMessages(null); }
2. 状态保存与恢复
保存关键状态:
@Override
protected void onSaveInstanceState(Bundle outState) {
outState.putString("EDIT_TEXT_VALUE", editText.getText().toString());
// 必须调用super
super.onSaveInstanceState(outState);
}
恢复状态:
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
// 先初始化视图
editText = findViewById(R.id.edit_text);
// 再恢复状态
if (savedInstanceState != null) {
String text = savedInstanceState.getString("EDIT_TEXT_VALUE");
editText.setText(text);
}
}
四、常见问题解决方案
1. 内存泄漏预防
-
避免静态引用:
// 错误示例 static Activity sInstance; // 正确做法 WeakReference<Activity> weakActivity; -
Handler正确用法:
private static class SafeHandler extends Handler { private final WeakReference<Activity> mActivity; SafeHandler(Activity activity) { mActivity = new WeakReference<>(activity); } @Override public void handleMessage(Message msg) { Activity activity = mActivity.get(); if (activity == null || activity.isFinishing()) return; // 处理消息... } }
2. 多进程Activity问题
-
独立进程Activity:
<activity android:name=".RemoteActivity" android:process=":remote"/> -
注意事项:
-
静态变量不共享
-
需通过IPC通信
-
销毁需调用
Process.killProcess()
-
五、进阶问题
-
onSaveInstanceState()与onPause()的区别?
-
onPause():适合轻量级持久化操作 -
onSaveInstanceState():适合UI状态保存 -
系统回收时可能跳过
onPause()直接调用onSaveInstanceState()
-
-
为什么不能依赖onDestroy()释放资源?
-
系统杀进程时不会调用
-
配置变更时可能快速重建
-
建议在
onStop()中执行关键释放
-
-
如何实现Activity的优雅销毁?
-
使用
ViewModel保存UI数据 -
通过
isFinishing()区分配置变更和真实销毁 -
实现
onBackPressed()处理返回逻辑
-

2080

被折叠的 条评论
为什么被折叠?



