onSaveInstanceState()和onRestoreInstanceState(Parcelable状态)不被调用?

我有一个扩展LinearLayout的自定义视图。 我已经实现onSaveInstanceState()和onRestoreInstanceState()来保存当前的视图状态。 但是没有采取任何行动。 当我在这两个方法中放置一个日志时,Log Cat中也不会出现任何内容。 我假设这两种方法甚至没有被调用。 有人可以解释问题在哪里吗? 谢谢。

@Override public Parcelable onSaveInstanceState() { Bundle bundle = new Bundle(); bundle.putParcelable("instanceState", super.onSaveInstanceState()); bundle.putInt("currentPage", currentPage); return bundle; } @Override public void onRestoreInstanceState(Parcelable state) { if (state instanceof Bundle) { Bundle bundle = (Bundle) state; currentPage = bundle.getInt("currentPage"); Log.d("State", currentPage + ""); super.onRestoreInstanceState(bundle.getParcelable("instanceState")); return; } super.onRestoreInstanceState(state); } 

Solutions Collecting From Web of "onSaveInstanceState()和onRestoreInstanceState(Parcelable状态)不被调用?"

在Android操作系统中挖掘后,我终于明白了。 正如我怀疑:这两种方法没有错。 他们只是不叫。 在Web上,你可以读取'onRestoreInsatnceState在重新创build活动时被调用'好吧,它使感觉,但它不完全正确。 是的,在重新创build活动时调用onRestoreInstanceState(),但仅在以下情况下调用:

它被操作系统杀死了 “这种情况发生在:

  • 设备的方向改变(你的活动被破坏和重新创build)
  • 在你面前还有另一个活动,在某些时候,操作系统会杀死你的活动,以便释放内存(例如)。 下一次,当你开始你的活动时,将会调用RestoreInstanceState()。

所以,如果你正在进行你的活动,并且你点击了设备上的“ 返回”button ,你的活动就完成了(),下一次你启动你的应用程序,它会再次启动(这听起来像重新创build,不是吗? 没有保存的状态,因为当你点击返回button时你故意退出它。

正如Steven Byle的评论所提到的,一个自定义的View必须有一个分配给它的id来调用onSaveInstanceState 。 我通过在我的自定义View构造函数中设置一个id来完成此操作:

 public class BoxDrawingView extends View { private int BOX_DRAWING_ID = 555; … public BoxDrawingView(Context context, AttributeSet attrs) { … this.setId(BOX_DRAWING_ID); } … }