You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Android Nougat版本中相机拍照后Activity A重建恢复问题求助

解决Android Nougat中Activity A因相机启动被重建的问题

这个问题我之前在Android 7.0(Nougat)版本上踩过坑!核心原因是Nougat引入的后台内存优化机制:当你在Activity B中启动相机这类占用系统资源较高的组件时,系统为了释放内存,会把处于后台的Activity A销毁掉。等你从B返回A时,系统会重新创建Activity A的实例,导致你之前保存的变量被重新初始化。下面给你几个靠谱的解决方案:

方案一:用onSaveInstanceState()和onRestoreInstanceState()手动保存恢复变量

这是Android提供的标准生命周期方法,专门用来处理Activity被系统销毁后重建的场景,不仅适用于相机问题,屏幕旋转、内存不足等情况也能覆盖。

在Activity A中重写这两个方法:

@Override
protected void onSaveInstanceState(Bundle outState) {
    super.onSaveInstanceState(outState);
    // 保存你需要保留的变量,比如字符串、整数
    outState.putString("KEY_MY_STRING", mMyStringVariable);
    outState.putInt("KEY_MY_INT", mMyIntVariable);
    
    // 如果是自定义对象,需要让对象实现Parcelable或Serializable接口
    outState.putParcelable("KEY_CUSTOM_OBJECT", mMyCustomObject);
}

@Override
protected void onRestoreInstanceState(Bundle savedInstanceState) {
    super.onRestoreInstanceState(savedInstanceState);
    // 从Bundle中恢复变量
    mMyStringVariable = savedInstanceState.getString("KEY_MY_STRING");
    mMyIntVariable = savedInstanceState.getInt("KEY_MY_INT");
    mMyCustomObject = savedInstanceState.getParcelable("KEY_CUSTOM_OBJECT");
}

注意:onRestoreInstanceState()会在onStart()之后调用,你也可以直接在onCreate()中通过传入的savedInstanceState参数恢复数据。

方案二:用ViewModel持久化数据(推荐)

如果你用的是Android Jetpack组件,ViewModel是更优雅的解决方案——它的生命周期独立于Activity的销毁重建,即使Activity被系统干掉,ViewModel里的数据也会保留。

  1. 先创建一个ViewModel类:
import androidx.lifecycle.ViewModel;

public class ActivityAViewModel extends ViewModel {
    // 在这里定义你需要保留的所有变量
    public String mUserInput;
    public int mCounter;
    public CustomObject mCustomData;
}
  1. 在Activity A中获取ViewModel实例:
import androidx.lifecycle.ViewModelProvider;

public class ActivityA extends AppCompatActivity {
    private ActivityAViewModel mViewModel;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_a);
        
        // 获取ViewModel,即使Activity重建,这个实例也不会被销毁
        mViewModel = new ViewModelProvider(this).get(ActivityAViewModel.class);
        
        // 只有第一次创建Activity时才初始化变量
        if (mViewModel.mUserInput == null) {
            mViewModel.mUserInput = "默认值";
        }
    }
}

之后你在Activity A中操作的所有变量都存在ViewModel里,不管Activity怎么重建,数据都不会丢。

额外提示:避免不必要的Activity销毁

你也可以尝试给Activity A的Manifest配置添加android:configChanges="orientation|screenSize|keyboardHidden",不过这个主要是解决屏幕旋转导致的重建,对相机触发的内存回收效果有限,但可以作为辅助手段试试:

<activity
    android:name=".ActivityA"
    android:configChanges="orientation|screenSize|keyboardHidden" />

内容的提问来源于stack exchange,提问作者Muhammad Fahad

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.25 03:26:43