Activity生命周期与销毁机制

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

五、进阶问题

  1. onSaveInstanceState()与onPause()的区别?

    • onPause():适合轻量级持久化操作

    • onSaveInstanceState():适合UI状态保存

    • 系统回收时可能跳过onPause()直接调用onSaveInstanceState()

  2. 为什么不能依赖onDestroy()释放资源?

    • 系统杀进程时不会调用

    • 配置变更时可能快速重建

    • 建议在onStop()中执行关键释放

  3. 如何实现Activity的优雅销毁?

    • 使用ViewModel保存UI数据

    • 通过isFinishing()区分配置变更和真实销毁

    • 实现onBackPressed()处理返回逻辑

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值