У меня есть 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"
к действию в манифесте без разницы. Опять же, любые предложения оценили.
'onCreate' вызывается, когда действие должно быть (повторно) создано, и вы не можете остановить это. Исходное намерение полезно, и поэтому вы получаете 2 разных намерения, которым вы должны управлять таким образом, чтобы их не перезаписывать. – zapl
записывают измененные переменные в намерение (или сохраняют их каким-либо другим способом). Затем проверьте измененные значения и загрузите их вместо значений по умолчанию в своем OnCreate. – NameSpace
Когда я делаю 'getIntent()' in ** B **, я всегда получаю тот, который я отправил из A. Это потому, что я называю 'finish()', а не 'startActivity()' в ** C ** , Итак, я должен просто пойти и удалить 'onResume()', 'onActivityResult()' и т. Д.? – rgamber