Activity生命周期全流程详解

一、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()

五、常见问题与解决方案
  1. 启动卡顿
    方案:在 onCreate 中避免耗时操作,使用异步任务或启动页预加载。

  2. 屏幕旋转数据丢失
    方案

    • 简单数据:通过 onSaveInstanceState 保存
    • 复杂数据:使用 ViewModel 持久化
    public class MyViewModel extends ViewModel {
        private MutableLiveData<List<String>> mData = new MutableLiveData<>();
        public LiveData<List<String>> getData() { return mData; }
    }
    
  3. 内存泄漏
    方案:使用 Android Studio 的 Profiler 工具检测,确保在 onDestroy 中释放所有资源。


六、总结与扩展建议

通过合理运用生命周期方法,你可以:

  • 🚀 优化应用性能(及时释放资源)
  • 💾 提升用户体验(自动保存/恢复状态)
  • 🛡️ 避免内存泄漏和崩溃

扩展学习

  • 使用 LifecycleObserver 实现生命周期感知组件
  • 掌握 Fragment 与 Activity 生命周期的关联
  • 学习 ProcessLifecycleOwner 监听应用前后台状态

建议在开发中通过 Logcat 观察生命周期日志,结合断点调试加深理解。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值