Действительно, как работает onRestoreInstanceState()?

Мне требуется ваша помощь. Я делаю приложение и использую методы onSaveInstanceState() и onRestoreInstanceState(), но второй метод не работает.

Я вижу, как программа обращается к 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);
}
}

person Scleyth    schedule 09.02.2015    source источник
comment
Этот вопрос может помочь вам stackoverflow.com/questions/5574462/   -  person Prudhvi    schedule 09.02.2015
comment
Вы проверили, что они не вызываются? В вашем коде вы сохраняете с разными ключами, которые вы используете для восстановления.   -  person StenSoft    schedule 09.02.2015
comment
Когда вы нажимаете HOME, а затем возвращаетесь в свое приложение, оно должно оставаться в том же состоянии, в котором вы его покинули, поэтому нет причин вызывать onRestoreInstanceState(). В чем проблема?   -  person David Wasser    schedule 09.02.2015


Ответы (3)


Когда система начинает останавливать вашу активность, она вызывает метод onSaveInstanceState(), чтобы вы могли указать дополнительные данные о состоянии, которые вы хотели бы сохранить на случай, если экземпляр Activity потребуется воссоздать. Если действие уничтожено и тот же экземпляр необходимо создать заново, система передает данные состояния, определенные как в метод onCreate(), так и в метод onRestoreInstanceState().

Вы можете проверить это https://developer.android.com/training/basics/activity-lifecycle/recreating.html

Вы можете увидеть, что происходит с Toast внутри вашего метода.

И проверьте это https://stackoverflow.com/a/4967491/3653989

person Adrian Cid Almaguer    schedule 09.02.2015

onRestoreInstanceState(...) будет вызываться только в том случае, если активность была уничтожена, когда она была в фоновом режиме. Вы можете заставить это произойти, если включите опцию разработчика «не сохранять действия».

Но это не объясняет, почему ваше приложение перезапускается с нуля. Вы уверены, что правильно восстанавливаете данные? Добавьте регистрацию в onRestoreInstanceState(...), чтобы убедиться, что он вызывается и работает правильно. И ты уверен, что не звонишь finish() туда, куда тебе не следует звонить, например, onPause()?

person Kevin Krumwiede    schedule 09.02.2015

Попробуйте использовать фрагмент с setRetainInstance(true).

Отредактировано

Объявите весь свой пользовательский интерфейс во фрагменте (http://developer.android.com/guide/components/fragments.html), как вы это делаете в Activity.

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();
    }
}
person Stepango    schedule 09.02.2015
comment
Хотя это может решить проблему, вам следует уточнить, где, как и зачем это делать. - person Esoteric Screen Name; 09.02.2015