真的onRestoreInstanceState()是如何工作的?

时间:2015-02-09 00:54:43

标签: java android android-activity activity-lifecycle onrestoreinstancestate

我需要你的帮助。我正在创建一个应用程序,我使用方法onSaveInstanceState()onRestoreInstanceState(),但第二种方法不起作用。

我可以看到当按下主页按钮时程序如何访问onSaveinstancestate(),但当我返回应用程序时,代码不会调用onRestoreInstanceState()onCreate()

结果,应用程序从头开始。我不知道原因......你能帮助我吗?

这是我的代码:

public class MainActivity extends ActionBarActivity {

MyView myView;

protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        myView = new MyView(this);
        setContentView(myView);

    if (savedInstanceState != null) {
        myView .SetScore(savedInstanceState.getInt("Id"));
        myView .SetNivel(savedInstanceState.getInt("Valor"));  
    }
} 

.....

 @Override
    protected void onRestart(){
        super.onRestart();
        myView = new MyView(this);
        setContentView(myView );
    }

@Override
protected void onRestoreInstanceState(Bundle savedInstanceState){
    super.onRestoreInstanceState(savedInstanceState);
    if (savedInstanceState != null) {
        myView.SetScore(savedInstanceState.getInt("Id"));
        myView.SetNivel(savedInstanceState.getInt("Valor"));
   }
}

@Override
protected void onSaveInstanceState(Bundle savedInstanceState){
    savedInstanceState.putInt("Score",myView.GetId());
    savedInstanceState.putInt("Nivel",muView.GetValor());
    super.onSaveInstanceState(savedInstanceState);
}
}

3 个答案:

答案 0 :(得分:1)

当系统开始停止您的活动时,它会调用onSaveInstanceState(),以便您可以指定要在必须重新创建Activity实例时保存的其他状态数据。如果活动被销毁并且必须重新创建相同的实例,系统会将定义的状态数据传递给onCreate()方法和onRestoreInstanceState()方法。

您可以查看https://developer.android.com/training/basics/activity-lifecycle/recreating.html

您可以在方法中查看Toast会发生什么。

并查看此https://stackoverflow.com/a/4967491/3653989

答案 1 :(得分:0)

仅当活动在后台销毁时才会调用

onRestoreInstanceState(...)。如果您打开“不要保存活动”,可以强制执行此操作。开发者选项。

但这并不能解释为什么你的应用似乎从头开始重启。您确定要正确恢复数据吗?在onRestoreInstanceState(...)中添加一些日志记录,以确保它被调用并做正确的事情。你确定你不会在finish()之外的某个地方打电话给onPause()吗?

答案 2 :(得分:-2)

尝试使用setRetainInstance(true)的片段。

<强>被修改

在Fragment(http://developer.android.com/guide/components/fragments.html)中声明所有UI,就像在Activity中一样。

public static class ExampleFragment extends Fragment {
    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup Bundle savedInstanceState) {
        setRetainInstance(true);
        return new MyView(getActivity());
    }
}

public static class MainActivity extends ActionBarActivity {
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        getSupportFragmentManager().beginTransaction().add(new ExampleFragment(), R.id.layout_where_you_want_to_display_fragment).commit();
    }
}