onRestoreInstanceState() 究竟是如何工作的?
Really how onRestoreInstanceState() works?
我需要你的帮助。我正在制作一个应用程序,我使用方法 onSaveInstanceState()
和 onRestoreInstanceState()
,但第二种方法不起作用。
我可以看到按下主页按钮时程序如何访问 onSaveinstancestate(),但是当我 return 到应用程序时,代码不会调用 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);
}
}
尝试使用带有 setRetainInstance(true) 的片段。
已编辑
像在 Activity.
中那样在 Fragment(http://developer.android.com/guide/components/fragments.html) 中声明所有 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();
}
}
当系统开始停止您的 activity 时,它会调用 onSaveInstanceState() 以便您可以指定要保存的其他状态数据,以防必须重新创建 Activity 实例。如果 activity 被销毁并且必须重新创建相同的实例,系统会将定义的状态数据传递给 onCreate() 方法和 onRestoreInstanceState() 方法。
你可以检查这个https://developer.android.com/training/basics/activity-lifecycle/recreating.html
您可以看到在您的方法中使用 Toast 会发生什么。
并检查这个
onRestoreInstanceState(...)
只有在 activity 在后台被销毁时才会被调用。如果您打开 "don't save activities" 开发者选项,您可以强制执行此操作。
但这并不能解释为什么您的应用程序似乎从头开始重新启动。你确定你正在正确恢复数据吗?添加一些登录 onRestoreInstanceState(...)
以确保它被调用并做正确的事情。你确定你没有在不应该去的地方打电话给 finish()
,比如 onPause()
?
我需要你的帮助。我正在制作一个应用程序,我使用方法 onSaveInstanceState()
和 onRestoreInstanceState()
,但第二种方法不起作用。
我可以看到按下主页按钮时程序如何访问 onSaveinstancestate(),但是当我 return 到应用程序时,代码不会调用 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);
}
}
尝试使用带有 setRetainInstance(true) 的片段。
已编辑
像在 Activity.
中那样在 Fragment(http://developer.android.com/guide/components/fragments.html) 中声明所有 UIpublic 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();
}
}
当系统开始停止您的 activity 时,它会调用 onSaveInstanceState() 以便您可以指定要保存的其他状态数据,以防必须重新创建 Activity 实例。如果 activity 被销毁并且必须重新创建相同的实例,系统会将定义的状态数据传递给 onCreate() 方法和 onRestoreInstanceState() 方法。
你可以检查这个https://developer.android.com/training/basics/activity-lifecycle/recreating.html
您可以看到在您的方法中使用 Toast 会发生什么。
并检查这个
onRestoreInstanceState(...)
只有在 activity 在后台被销毁时才会被调用。如果您打开 "don't save activities" 开发者选项,您可以强制执行此操作。
但这并不能解释为什么您的应用程序似乎从头开始重新启动。你确定你正在正确恢复数据吗?添加一些登录 onRestoreInstanceState(...)
以确保它被调用并做正确的事情。你确定你没有在不应该去的地方打电话给 finish()
,比如 onPause()
?