2014-02-09 2 views
0

У меня есть 3 классов , В и С.Android OnCreate() и onResume() запрос

Пропускаю некоторые объекты от A до B. В B, в onCreate(), я вытаскиваю их из намерения и сохраняю их как переменные класса. Теперь активность B позволяет пользователю редактировать эти объекты. Это происходит через startActivityForResult() путем пропуска объектов от B до C.

Теперь, когда пользователь сделан при редактировании, С передает результат Int назад к B наряду с модифицированными объектами, и отделкой. Теперь, когда я вернулся к B, в onActivityResult(), я вытаскиваю эти объекты и обновляю соответствующие переменные класса. Но onCreate() вызывается снова, а класс возвращается к объектам, которые дал В вместо того, чтобы держать те, которые C дал В.

Теперь, если сделать так, чтобы onCreate() из B совершает поездку в базу данных каждый раз, и, очевидно, он отлично работает. Но это кажется расточительным.

Итак, как мне обрабатывать этот сценарий? Если onCreate() все равно будет вызван, то кажется, что onResume(), startActivityForResult() и onActivityResult() бесполезны, и я мог бы также поместить весь код в onCreate().

Прошу совета!

Вот код, который принимает пользователя от B до С

public void goToC(View v) { 

     Intent intent = new Intent(this, C.class); 
     intent.putExtra("STUFF", stuff); 
     startActivityForResult(intent, 1); 

} 

Вот код в С, который передает данные обратно в B

long rowsUpdated = myModel.updateStuff(this, stuff); 

if (rowsUpdated == 1) { 
    Intent intent = new Intent(this, B.class); 
    // put the data in the intent 
    intent.putExtra("STUFF", stuff); 
    // set the flags to reuse B 
    intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP|Intent.FLAG_ACTIVITY_SINGLE_TOP); 
    // set result code to notify the ItemEntriesActivity 
    setResult(1, intent); 
    // finish the current activity i.e. C 
    finish(); 
} 

Вот код в B, который получает вышеуказанное da та

@Override 
    protected void onActivityResult(int requestCode, int resultCode, Intent intent) { 
     super.onActivityResult(requestCode, resultCode, intent); 
     if (intent != null) { 
      switch (resultCode) { 
      case 1: 
       // Update the class variable, so that onResume() gets the updated value 
       stuff = intent.getExtras().getParcelable("STUFF"); 
       break; 
      default: 
       break; 
      } 

     } 
    } 

Как я уже говорил, этот код работает правильно, но так как B.onCreate() запускается на выполнение после этого, деятельность В конце концов, используя старые значения снова.

Update: Я пытался использовать intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP|Intent.FLAG_ACTIVITY_SINGLE_TOP) при переходе обратно из C к B. Это все еще не работает. Нигде в B я не звоню finish(). Любое предложение оценивается !!!

Update 2: Когда я ставлю точку отладки в onStop() в B, он вызывался как только я переключаюсь на C. Неудивительно, что будет вызван onCreate() в B. Теперь мои вопросы - почему вызывается вызов onStop(). Единственная «неестественная» вещь, которую я делаю на C, показывает TextEdits без клавиатуры, используя getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_HIDDEN);. Поэтому я попытался добавить android:configChanges="keyboard|keyboardHidden" к действию в манифесте без разницы. Опять же, любые предложения оценили.

+0

'onCreate' вызывается, когда действие должно быть (повторно) создано, и вы не можете остановить это. Исходное намерение полезно, и поэтому вы получаете 2 разных намерения, которым вы должны управлять таким образом, чтобы их не перезаписывать. – zapl

+0

записывают измененные переменные в намерение (или сохраняют их каким-либо другим способом). Затем проверьте измененные значения и загрузите их вместо значений по умолчанию в своем OnCreate. – NameSpace

+0

Когда я делаю 'getIntent()' in ** B **, я всегда получаю тот, который я отправил из A. Это потому, что я называю 'finish()', а не 'startActivity()' в ** C ** , Итак, я должен просто пойти и удалить 'onResume()', 'onActivityResult()' и т. Д.? – rgamber

ответ

0

Вы создаете Intent идти, чтобы быть с

Intent intent = new Intent(this, B.class); 

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

Intent intent = new Intent(); 
// set result code to notify the ItemEntriesActivity 
setResult(1, intent); 
// finish the current activity i.e. C 
finish(); 
+0

Спасибо за ваше время, но эта модификация не изменила результат. Это имеет смысл. Мне нужно больше узнать о намерениях, я думаю. После отладки, onCreate() все еще попадает. Есть еще идеи? – rgamber

+0

Хммм ... нет в это время. Это должно было устранить его. Вы не называете 'finish()' в 'B', верно? Я сталкивался с такими вопросами раньше, и конструктор «Intent» обычно является виновником. – codeMagic

+0

Nopes, я отправил код, который берет пользователя от B до C. Это довольно просто вызывает 'startActivityForResult()' с новым Intent. Спасибо за ваше время! Я ценю это! – rgamber

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