onSaveInstanceState 在屏幕旋转后未被调用

我知道在SaveInstanceState上有很多问题,但我无法找到问题的答案。

我有一个扩展AppCompatActivity的活动;此活动使用 3 个片段,它有一个变量 'int currentStep' 来跟踪正在显示的片段。在 onSavedInstanceState 方法中,我将 currentStep 变量存储在捆绑包中,然后在 onCreate 方法中还原它。

public class MainActivity extends AppCompatActivity {
    private final String CURRENT_STEP_TAG = "current_step";
    private int currentStep;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_pedido);        

        if(savedInstanceState == null) {
            loadFirstFragment();
        } else {            
            currentStep = savedInstanceState.getInt(CURRENT_STEP_TAG);
            if(currentStep == 2){
                //Do some stuff...
            }
        }
    }

    @Override
    public void onSaveInstanceState(Bundle outState, PersistableBundle outPersistentState) {
        Log.d("deubg", "--------onsaveinstancestate--------");
        outState.putInt(CURRENT_STEP_TAG, currentStep);
        super.onSaveInstanceState(outState, outPersistentState);
    }

 ...

}

问题是,当屏幕输入更改时,onSavedInstanceState不会被调用,根据Google文档,它应该被调用。消息“----------------保存状态”不会显示在控制台中。但是,在屏幕旋转后,onCreate 方法中的捆绑包保存的InstanceState不为空,但它没有int'currentStep'。

我尝试了很多事情:将AppCompatActivity更改为ActionBarActivity,将super.onSavedInstanceState的调用移动到不同的位置,尝试存储其他变量;但无论我做什么,该方法都不会执行。

另外,我的清单中没有android:configChanges。

我的应用程序是针对 sdk 版本 22 编译的,buildToolsVersion 22.0.1


答案 1

除非您的应用在 Lollipop (API21) 版本的 Android 或更高版本上运行,否则您的

public void onSaveInstanceState (Bundle outState, PersistableBundle outPersistentState);

不会被调用,因为它根本不存在于21以下平台的早期版本上。要支持 API 21 之前的设备,您必须覆盖以下方法,而不是上述方法:

public void onSaveInstanceState (Bundle outState);

这也适用于API 21 +,因此您当然不需要覆盖这两种方法(除非您知道您需要处理新的方法)。PersistableBundle

请参阅文档


答案 2

推荐