2016-01-10 2 views
3

У меня возникают проблемы с двумя ActionBarActivities. У меня есть моя первая активность (WorkoutEditActivity), которая запускает другое действие (A2) с помощью startActivityForResult из фрагмента внутри WorkoutEditActivity. Когда я нажимаю кнопку Back на ActionBar из A2, мое первое действие получает Destroyed и сохраняет данные в onSaveInstanceState, а затем активность перезапускается, но я не могу понять, как восстановить данные. Вот соответствующий код, который не работает:Деятельность не восстанавливает данные после onDestroy

public class WorkoutEditActivity extends ActionBarActivity{ 
     int whatShouldBeSaved = -1; 

     Workout workout = null; 
     ViewPager viewpager; 
     ViewFactory factory = new ViewFactory(getSupportFragmentManager());; 

     @Override 
     public void onCreate(Bundle savedInstanceState) { 
     Log.d("onCreate", "called"); 
     super.onCreate(savedInstanceState); 

     setContentView(R.layout.workout_edit_activity); 

     viewpager = (ViewPager) findViewById(R.id.viewPager); 
     viewpager.setOffscreenPageLimit(0); 
     viewpager.setAdapter(factory); 

     viewpager.setOnPageChangeListener(
       new ViewPager.OnPageChangeListener() { 
        @Override 
        public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) { 

        } 

        @Override 
        public void onPageSelected(int position) { 
         if (position == 0) { 
          SettingsFragment.isActivated = true; 
         } else { 
          if (SettingsFragment.isActivated) { 
           SettingsFragment.isActivated = false; 
           InputMethodManager imm = (InputMethodManager) getSystemService(Activity.INPUT_METHOD_SERVICE); 
           imm.toggleSoftInput(InputMethodManager.HIDE_IMPLICIT_ONLY, 0); 
          } 
         } 
        } 

        @Override 
        public void onPageScrollStateChanged(int state) { 

        } 
       } 
     ); 

     if (savedInstanceState != null) { 
      whatShouldBeSaved = savedInstanceState.getInt("test", -1); 
      if (savedInstanceState.getSerializable("workout") != null){ 
       setWorkout((Workout) savedInstanceState.getSerializable("workout")); 
      } 
      Log.d("GOT SAVED DATA", "" + whatShouldBeSaved); 
     } 
     Log.d("CREATE", "created? " + workout); 
     Log.d("CREATE", "created? " + whatShouldBeSaved); 
     } 

     public void setWorkout(Workout w){ 
     Log.d("WORKOUT", "had workout " + workout); 
     workout = w; 
     factory.setWorkout(workout); 
     Log.d("WORKOUT", "has workout " + workout); 
     } 

     @Override 
     public void onResume() { 
     super.onResume(); 
     Log.d("RESUME", "resuming act"); 

     SettingsFragment.isActivated = true; 
     //factory.setViewPager(viewpager); 

     if (getIntent().getExtras() != null){ 
      if (getIntent().getExtras().containsKey("workout")){ 
       Log.d("RESUME", "resume has extra"); 
       setWorkout((Workout) getIntent().getSerializableExtra("workout")); 
       whatShouldBeSaved = getIntent().getIntExtra("test", -1); 
      } 
     } else { 
      Log.d("RESUME", "extras did not contain workout2"); 
     } 

     Log.d("RESUME", "created? " + workout); 
     Log.d("RESUME", "created? " + whatShouldBeSaved); 
     } 

     @Override 
     public void onPause(){ 
     super.onPause(); 
     Log.d("ONPAUSE", "called"); 
     } 


     @Override 
     public void onStart(){ 
     super.onStart(); 
     Log.d("START", "starting act"); 
     } 

     @Override 
     public void onStop(){ 
     Log.d("STOP", "stopping act"); 
     super.onStop(); 
     } 

     @Override 
     public void onActivityResult(int requestCode, int resultCode, Intent intent) { 
     super.onActivityResult(requestCode, resultCode, intent); 
     Log.d("onACTRES", "called"); 
     } 

     @Override 
     public void onSaveInstanceState(Bundle savedInstanceState) { 
     super.onSaveInstanceState(savedInstanceState); 
     Log.d("SAVEINSTANCE", "called"); 
     savedInstanceState.putInt("test", whatShouldBeSaved); 
     } 

     @Override 
     public void onRestoreInstanceState(Bundle savedInstanceState) { 
     super.onRestoreInstanceState(savedInstanceState); 

     // Restore UI state from the savedInstanceState. 
     // This bundle has also been passed to onCreate. 
     Log.d("RESTOREINSTANCE", "called"); 

     whatShouldBeSaved = savedInstanceState.getInt("test", 1); 
     Log.d("GOT SAVE", ""+ whatShouldBeSaved); 
     } 

     @Override 
     public void onRestoreInstanceState(Bundle savedInstanceState, PersistableBundle persistentState){ 
     super.onRestoreInstanceState(savedInstanceState, persistentState); 
     Log.d("RESTOREINSTANCE2", "called"); 
     } 

     @Override 
     public void onDestroy(){ 
     super.onDestroy(); 
     Log.d("DESTROY", "onDestroy called"); 
     Log.d("DESTROY", "destroying " + workout); 
     Log.d("DESTROY", "destroying " + whatShouldBeSaved); 
     Log.d("DESTROY", "was destroyed"); 
     //first = true; 
     } 
    } 

А вот отрывок из моего журнала

8151-8151/localhost.fitnessoptimizer D/STOP﹕ stopping act 
01-10 13:26:45.110 8151-8151/localhost.fitnessoptimizer D/DESTROY﹕ onDestroy called 
01-10 13:26:45.110 8151-8151/localhost.fitnessoptimizer D/DESTROY﹕ destroying Luffy 
01-10 13:26:45.110 8151-8151/localhost.fitnessoptimizer D/DESTROY﹕ destroying -1 
01-10 13:26:45.110 8151-8151/localhost.fitnessoptimizer D/DESTROY﹕ was destroyed 
01-10 13:26:45.118 8151-8151/localhost.fitnessoptimizer D/onCreate﹕ called 
01-10 13:26:45.118 8151-8151/localhost.fitnessoptimizer V/Monotype﹕ SetAppTypeFace- try to flip, app = localhost.fitnessoptimizer 
01-10 13:26:45.118 8151-8151/localhost.fitnessoptimizer V/Monotype﹕ Typeface getFontPathFlipFont - systemFont = default#default 
01-10 13:26:45.126 8151-8151/localhost.fitnessoptimizer W/ViewPager﹕ Requested offscreen page limit 0 too small; defaulting to 1 
01-10 13:26:45.126 8151-8151/localhost.fitnessoptimizer D/CREATE﹕ created? null 
01-10 13:26:45.126 8151-8151/localhost.fitnessoptimizer D/CREATE﹕ created? 1 
01-10 13:26:45.127 8151-8151/localhost.fitnessoptimizer D/START﹕ starting act 
01-10 13:26:45.129 8151-8151/localhost.fitnessoptimizer D/RESUME﹕ resuming act 
01-10 13:26:45.129 8151-8151/localhost.fitnessoptimizer D/RESUME﹕ extras did not contain workout2 
01-10 13:26:45.129 8151-8151/localhost.fitnessoptimizer D/RESUME﹕ created? null 
01-10 13:26:45.129 8151-8151/localhost.fitnessoptimizer D/RESUME﹕ created? 1 
01-10 13:26:45.152 8151-8151/localhost.fitnessoptimizer D/GOT WORKOUT﹕ null 

onRestoreInstanceState никогда не вызывается и onCreates savedInstanceState также не содержит информации. Как сохранить или восстановить тренировку (и whatShouldBeSaved, которая на самом деле является просто переменной отладки)?

PS: Я положил свой код в SNIPPET расслоение плотной тегов, потому что он получил довольно долго

ответ

0

С официального сайта onSaveInstanceState

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

Когда вы нажимаете BACK при действии, он будет закрыт, но не будет убит. «Killing» может быть выполнено системой Android, когда приложение находится в фоновом режиме, и системе необходимо освободить некоторый ресурс.

Вместо этого вы должны использовать Shared Preferences.

+0

Я пробовал это, и он действительно работает. однако я считаю, что это ужасное обходное решение, так как я должен сохранить свою тренировку в строке json, а затем перезагрузить ее и проанализировать ее из строки json, сразу после того, как я ее разместил. Я действительно не понимаю, почему активность закрывается, когда она просто перезапускается после этого. почему он не останавливается и не возобновляется? – infect

+0

@infect, пожалуйста, примите и голосуйте за ответ, если было бы полезно решить вашу текущую проблему. – gio

+0

@infect читайте в следующей статье http://developer.android.com/guide/components/activities.html#SavingActivityState, это даст вам более подробную информацию о сохранении состояния – gio

0

onSaveInstanceState() только будет вызван, когда ваша деятельность будет уничтожена неожиданно, и она не будет вызываться, когда в данный момент уничтожается активность. То же самое с onRestoreInstanceState().
Официальный сайт, Recreating an Activity

+0

В вашей ссылке указано, что файл savedInstanceState находится в параметре onCreate, который я попытался в моем примере, но он все еще не работает !? – infect

+0

@infect, пожалуйста, внимательно прочитайте всю статью, чтобы понять, как это работает, особенно блоки безопасности – gio

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