onSaveInstanceState() и onRestoreInstanceState (Parcelable state) не вызываются?

У меня есть пользовательский вид, который расширяет 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);
  }

Ответ 1

После копания в android os я, наконец, понял это. Как я подозревал: в этих двух методах нет ничего плохого. Их просто не называют. В Интернете вы можете прочитать, что "onRestoreInsatnceState вызывается, когда активность воссоздана". Хорошо, это создает ощущение, но это не совсем так. Да, onRestoreInstanceState() вызывается, когда активность воссоздана, но только iff:

он был убит ОС. "Такая ситуация возникает, когда:

  • ориентация устройства изменяется (ваша деятельность разрушена и воссоздана)
  • есть еще одна активность перед вашей, и в какой-то момент ОС убивает вашу активность, чтобы освободить память (например). В следующий раз, когда вы начнете свою деятельность onRestoreInstanceState(), вызывается. "

Итак, если вы находитесь в своей деятельности, и вы нажимаете кнопку "Назад" на устройстве, ваша деятельность заканчивается() ed, и в следующий раз, когда вы запустите свое приложение, оно снова запускается (похоже, что оно воссоздано, не так?), Но на этот раз без сохранения состояния, потому что вы намеренно вышли из него, когда вы нажмете кнопку "Назад".

Ответ 2

Как упоминалось в комментарии Стивена Байле, пользовательский View должен иметь идентификатор, назначенный ему для onSaveInstanceState. Я выполнил это, установив id в свой собственный конструктор View:

public class BoxDrawingView extends View {
    private int BOX_DRAWING_ID = 555;
    …

    public BoxDrawingView(Context context, AttributeSet attrs) {
        …
        this.setId(BOX_DRAWING_ID);
    }
    …

}