2014-02-09 2 views
0

У меня есть 2 вида деятельности: B и C.Android OnStop() вызывался unwantedly

B начинается C, а затем действие пользователя, отделок C, и у меня снова.

Вот код, который принимает пользователя от 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(); 
    // 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, который получает вышеуказанное

@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; 
      } 

     } 
    } 

Моя проблема заключается в том, что этот код работает правильно, но всякий раз, когда я иду от В к C, то onStop() на B называется. У меня нет кода, который вызывает finish() на B. Это заставляет B.onCreate() вызываться каждый раз и делает мое приложение медленным. Я также поместил android:configChanges="keyboard|keyboardHidden|orientation|screenLayout|uiMode|screenSize|smallestScreenSize" в оба действия в моем манифесте, но не повезло. Я провел 2 дня на этом, и ближе к концу своего ума. Любая помощь приветствуется.

+0

Является ли 'C' полу или полностью прозрачным? Я имею в виду, что после запуска 'C' какая-то часть' B' все еще видна? – nKn

+0

Нет. Ни одна из операций или полу или прозрачная. Когда я запускаю C, C целиком находится спереди, поэтому нет, B не видно после запуска C. – rgamber

+0

Тогда ответ Джеймса Блэка прав. Если C полупрозрачен, вместо этого будет запущен 'onPause()'. – nKn

ответ

1

Если вы читаете эту страницу

http://developer.android.com/training/basics/activity-lifecycle/stopping.html

Он объясняет, что, когда начинается ваша деятельность другой первый остановится.

Если вы хотите, чтобы первый запуск имел бизнес-логику в Сервисе.

Вот учебник по этому

http://www.vogella.com/tutorials/AndroidServices/article.html

Или из второй активности возвращают достаточно информации для продолжения, где она остановилась, возможно, какая-то информация до него останавливается.

+0

Я вижу. Спасибо за ответ. Я думаю, что я изменю код, чтобы попасть в базу данных в ** onCreate() ** ** ** **.Похоже, что это потребует меньше накладных расходов, чем обслуживание службы в фоновом режиме.! – rgamber

+0

просто из любопытства, в этой ситуации «startActivityForResult()» и «Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_SINGLE_TOP» бесполезны, верно? – rgamber

+0

Интересно, поможет ли это вам.http: //stackoverflow.com/questions/17506432/flag-activity-clear-top-destroys-target-activity-and-than-creating-it –

0

Чтобы обойти onCreate() вместо startActivityForResult вы можете просто начать activity C из B (не называйте finish() на B). Затем в C начинаются activity B с флагами Intent.FLAG_ACTIVITY_CLEAR_TOP|Intent.FLAG_ACTIVITY_SINGLE_TOP. Поместите информацию, которую хотите передать обратно B в intent bundle. Затем C будет finish и B будет перенесен на передний план, но с onNewIntent будет вызываться вместо onCreate.

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