一、Activity 生命周期核心方法及代码示例
public class MainActivity extends AppCompatActivity {
private static final String TAG = "LifecycleDemo";
private static final String KEY_COUNTER = "counter";
private int mCounter = 0; // 用于状态保存演示
private SensorManager mSensorManager;
private Sensor mAccelerometer;
//================ 核心生命周期方法 ================//
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Log.d(TAG, "onCreate");
// 恢复保存的状态(如屏幕旋转后)
if (savedInstanceState != null) {
mCounter = savedInstanceState.getInt(KEY_COUNTER, 0);
Log.d(TAG, "Restored counter: " + mCounter);
}
// 初始化传感器服务(实际应在 onResume 注册)
mSensorManager = (SensorManager) getSystemService(SENSOR_SERVICE);
mAccelerometer = mSensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER);
}
@Override
protected void onStart() {
super.onStart();
Log.d(TAG, "onStart");
// 示例:检查网络状态、注册广播接收器
}
@Override
protected void onResume() {
super.onResume();
Log.d(TAG, "onResume");
// 注册传感器监听(独占资源)
mSensorManager.registerListener(sensorListener, mAccelerometer, SensorManager.SENSOR_DELAY_NORMAL);
}
@Override
protected void onPause() {
super.onPause();
Log.d(TAG, "onPause");
// 必须释放传感器等独占资源!
mSensorManager.unregisterListener(sensorListener);
}
@Override
protected void onStop() {
super.onStop();
Log.d(TAG, "onStop");
// 示例:关闭数据库连接、停止后台任务
}
@Override
protected void onRestart() {
super.onRestart();
Log.d(TAG, "onRestart");
}
@Override
protected void onDestroy() {
super.onDestroy();
Log.d(TAG, "onDestroy");
// 清理所有资源,防止内存泄漏
mSensorManager = null;
mAccelerometer = null;
}
//================ 状态保存与恢复 ================//
@Override
protected void onSaveInstanceState(@NonNull Bundle outState) {
super.onSaveInstanceState(outState);
Log.d(TAG, "onSaveInstanceState");
outState.putInt(KEY_COUNTER, mCounter); // 保存临时数据
}
@Override
protected void onRestoreInstanceState(@NonNull Bundle savedInstanceState) {
super.onRestoreInstanceState(savedInstanceState);
Log.d(TAG, "onRestoreInstanceState");
mCounter = savedInstanceState.getInt(KEY_COUNTER);
}
//================ 其他组件 ================//
private final SensorEventListener sensorListener = new SensorEventListener() {
@Override
public void onSensorChanged(SensorEvent event) {
// 处理传感器数据
}
@Override
public void onAccuracyChanged(Sensor sensor, int accuracy) {}
};
}
二、生命周期流程与场景分析
1. 正常启动流程
onCreate() → onStart() → onResume()
- 代码表现:
onCreate
:初始化布局、恢复状态、绑定传感器服务onResume
:注册传感器监听
2. 返回桌面(Home键)
onPause() → onSaveInstanceState() → onStop()
- 代码表现:
onPause
:立即释放传感器资源onSaveInstanceState
:保存计数器数值
3. 重新回到应用
onRestart() → onStart() → onResume()
- 代码表现:
onRestart
:无特殊操作(可在此恢复复杂资源)onResume
:重新注册传感器
4. 屏幕旋转(配置变更)
onPause() → onSaveInstanceState() → onStop() → onDestroy()
→ onCreate() → onStart() → onRestoreInstanceState() → onResume()
- 关键代码:
// 在 onCreate 中恢复数据 if (savedInstanceState != null) { mCounter = savedInstanceState.getInt(KEY_COUNTER, 0); }
三、实用场景与最佳实践
场景1:表单数据临时保存
@Override
protected void onPause() {
super.onPause();
// 快速保存用户输入到 SharedPreferences
SharedPreferences.Editor editor = getSharedPreferences("TempData", MODE_PRIVATE).edit();
editor.putString("input_text", mEditText.getText().toString());
editor.apply();
}
场景2:防止内存泄漏
@Override
protected void onDestroy() {
if (mMediaPlayer != null) {
mMediaPlayer.release(); // 释放媒体资源
mMediaPlayer = null;
}
super.onDestroy();
}
场景3:处理后台回收
@Override
protected void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);
outState.putStringArrayList("key_data", mDataList); // 保存复杂数据
}
四、生命周期流程图解
关键路径说明:
- 首次启动:纵向执行
onCreate()
→onStart()
→onResume()
- 部分遮挡(如对话框):仅触发
onPause()
- 完全遮挡(跳转新 Activity):
onPause()
→onStop()
- 返回销毁:逆向执行
onPause()
→onStop()
→onDestroy()
五、常见问题与解决方案
-
启动卡顿
方案:在onCreate
中避免耗时操作,使用异步任务或启动页预加载。 -
屏幕旋转数据丢失
方案:- 简单数据:通过
onSaveInstanceState
保存 - 复杂数据:使用
ViewModel
持久化
public class MyViewModel extends ViewModel { private MutableLiveData<List<String>> mData = new MutableLiveData<>(); public LiveData<List<String>> getData() { return mData; } }
- 简单数据:通过
-
内存泄漏
方案:使用 Android Studio 的 Profiler 工具检测,确保在onDestroy
中释放所有资源。
六、总结与扩展建议
通过合理运用生命周期方法,你可以:
- 🚀 优化应用性能(及时释放资源)
- 💾 提升用户体验(自动保存/恢复状态)
- 🛡️ 避免内存泄漏和崩溃
扩展学习:
- 使用
LifecycleObserver
实现生命周期感知组件 - 掌握
Fragment
与 Activity 生命周期的关联 - 学习
ProcessLifecycleOwner
监听应用前后台状态
建议在开发中通过 Logcat
观察生命周期日志,结合断点调试加深理解。