在我的项目中,我使用名为PassengerInformation.java的片段。在该片段中,我使用onSaveInstanceState和onCreate方法。在onCreate方法中,如果没有从onSaveInstanceState传递的包,我应该清除sharedPreferences,如果onSaveInstanceState传递一个bundle,我就不需要清除sharedPreferences。我的问题是当我按回来时,onSaveInstanceState没有被调用我应该记录它但是日志不会打印任何内容。
由于
@Override
public void onCreate(Bundle savedInstanceState) {
// TODO Auto-generated method stub
super.onCreate(savedInstanceState);
//clear sharedpreferences PassengerInformation is firsttime loaded
if( savedInstanceState == null ) {
Log.i("clear PassengerInformation", "sharedPreferences clear");
edit.clear().commit();
}
}
@Override
public void onSaveInstanceState(Bundle outState) {
// TODO Auto-generated method stub
super.onSaveInstanceState(outState);
outState.putBoolean("clearPreferences", false);
Log.i("saveInstanceState PassengerInformation", "save");
}
答案 0 :(得分:6)
通常,当您将方向从纵向更改为横向时,将调用保存实例状态。
例如:您正在显示结果,如果用户更改方向,则需要显示相同的结果,
onresume - > SavedinstanceState(您将使用键和值来存储数据) - >破坏
and onCreate->恢复savedInstanceState(您将使用密钥的方法getExtra(),并显示存储在restoreSavedInstance状态的结果。
你可以Read a good explanation from this
例如: public static final String key =“Hello”;
// you can get the data here.
@Override
protected void onRestoreInstanceState(Bundle savedInstanceState) {
// TODO Auto-generated method stub
super.onRestoreInstanceState(savedInstanceState);
savedInstanceState.getString(key);
Toast.makeText(this, "Restore state"+ savedInstanceState.getString(key), Toast.LENGTH_SHORT)
.show();
text.setText(key); // here the output will be Good morning.
}
// orientation change where from on resume-> destroy state, if you need to handle any saved data
@Override
protected void onSaveInstanceState(Bundle outState) {
// TODO Auto-generated method stub
super.onSaveInstanceState(outState);
Toast.makeText(this, "saved state", Toast.LENGTH_SHORT)
.show();
outState.putString(key, "Good morning");
}
答案 1 :(得分:2)
onSaveInstanceState()
。
原因:
如果您正在进行活动并点击设备上的“返回”按钮,则您的活动已完成(),下次启动应用时,它会再次启动(听起来像是重新创建的,不是吗? )但是这次没有保存状态,因为当你点击Back按钮时你故意退出它。
当用户更改配置(例如,旋转屏幕)时,如果Android认为活动存在被破坏的风险,同时仍然可以在堆栈上访问,并且可能还有其他一些情况,则会调用它。
答案 2 :(得分:1)
在以下情况下会调用片段onSaveInstanceState(@NonNull Bundle outState)
1)在屏幕orientation is changed
2)使用FragmentStatePagerAdapter
时:在这种情况下,默认OffscreenPageLimit
为1。如果您越过OffscreenPageLimit
并使用过FragmentStatePagerAdapter
,则在ViewPager中刷片段时,超出此限制的片段将被销毁并执行分离的i.e onStop(), onSaveInstanceState(), onDestroyView(), onDestroy() annd onDetach()
。