2

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

Я вижу, как программа получает доступ к onSaveinstancestate() при нажатии кнопки home, но когда я возвращаюсь к приложению, код не вызывает 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); 
} 
} 
+0

Этот вопрос может помочь вам http://stackoverflow.com/questions/5574462/why-onrestoreinstancestate-never-gets-called – Prudhvi

+0

Вы проверили, что их не вызывают? В вашем коде вы сохраняете с помощью разных ключей, которые вы используете для восстановления. – StenSoft

+0

Когда вы нажимаете HOME, а затем возвращаетесь в приложение, оно все равно должно находиться в том же состоянии, что и при его оставлении, поэтому нет причин для вызова 'onRestoreInstanceState()'. В чем проблема? –

ответ

1

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

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

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

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

+0

решил вашу проблему? –

+0

Спасибо за помощь. Я решил свою проблему. – Scleyth

-2

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

Edited

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

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(); 
    } 
} 
+0

Хотя это может решить проблему, вы должны уточнить, где, как и почему это делать. –

0

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

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

Смежные вопросы