Java onRestoreInstanceState()是如何工作的?

Java onRestoreInstanceState()是如何工作的?,java,android,android-activity,activity-lifecycle,onrestoreinstancestate,Java,Android,Android Activity,Activity Lifecycle,Onrestoreinstancestate,我需要你的帮助。我正在制作一个应用程序,我使用了saveInstanceState和onRestoreInstanceState方法,但第二种方法不起作用 当按下home按钮时,我可以看到程序如何访问onSaveinstancestate,但当我返回应用程序时,代码不会调用onRestoreInstanceState或onCreate 因此,应用程序从零开始。我不知道原因。。。你能帮我吗 这是我的代码: public class MainActivity extends ActionBarAct

我需要你的帮助。我正在制作一个应用程序,我使用了saveInstanceState和onRestoreInstanceState方法,但第二种方法不起作用

当按下home按钮时,我可以看到程序如何访问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);
}
}

尝试将片段与setRetainInstancetrue一起使用

编辑

在片段中声明所有UI,就像在活动中一样

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();
    }
}

尝试将片段与setRetainInstancetrue一起使用

编辑

在片段中声明所有UI,就像在活动中一样

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();
    }
}

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

你可以查一下

你可以在你的方法中看到祝酒会发生什么


当系统开始停止您的活动时,选中此复选框,它将调用SaveInstanceState,以便您可以指定要保存的其他状态数据,以防必须重新创建活动实例。如果活动已销毁且必须重新创建同一实例,则系统会将定义的状态数据传递给onCreate方法和onRestoreInstanceState方法

你可以查一下

你可以在你的方法中看到祝酒会发生什么

并在RestoreInstanceState上选中此项。。。仅当活动在后台被销毁时才会调用。如果启用“不保存活动开发人员”选项,则可以强制执行此操作

但这并不能解释为什么你的应用程序看起来是从零开始重新启动的。您确定恢复的数据正确吗?在RestoreInstanceState中添加一些日志。。。确保它被呼叫并做正确的事情。你确定你没有在不该在的地方调用finish,比如onPause?

onrestoreinnstancestate。。。仅当活动在后台被销毁时才会调用。如果启用“不保存活动开发人员”选项,则可以强制执行此操作


但这并不能解释为什么你的应用程序看起来是从零开始重新启动的。您确定恢复的数据正确吗?在RestoreInstanceState中添加一些日志。。。确保它被呼叫并做正确的事情。你确定你没有在不该在的地方调用finish,比如onPause吗?

这个问题可以帮助你检查它们是否没有被调用?在代码中,使用不同的键进行保存,然后用于还原。当按HOME键然后返回到应用程序时,应用程序应仍处于与离开应用程序时相同的状态,因此没有理由调用onRestoreInstanceState。问题是什么?这个问题可能会帮助您检查它们是否未被调用?在代码中,使用不同的键进行保存,然后用于还原。当按HOME键然后返回到应用程序时,应用程序应仍处于与离开应用程序时相同的状态,因此没有理由调用onRestoreInstanceState。问题是什么?虽然这可以解决问题,但你应该详细说明在哪里、如何以及为什么这样做。虽然这可以解决问题,但你应该详细说明在哪里、如何以及为什么这样做。