Поток onCreate продолжается после завершения ()

Я хотел бы завершить действие внутри метода onCreate. Когда я вызываю finish(), onDestroy() не вызывается сразу, код продолжает проходить мимо finish(). onDestroy() вызывается только после закрывающей скобки onCreate().

Согласно описанию onCreate() на странице developer.android.com/reference.

Вы можете вызвать finish() из этой функции, и в этом случае onDestroy() будет немедленно вызван без выполнения какой-либо остальной части жизненного цикла активности (onStart(), onResume(), onPause() и т. д.).

Причина, по которой я спрашиваю: я хотел бы проверить данные из пакета, переданного onCreate(). Конечно, я контролирую то, что передается onCreate, но я все же считаю, что это следует проверять в момент доставки.

Мой код содержит класс A, который запускает действие B. Я считаю, что последние два тега «вне предложения if» не должны вызываться, потому что метод finish в операторе if должен был уничтожить действие. Это не имеет ничего общего с предложением if, потому что строка тега после второго вызова finish() также читается.

Мой код:

Класс А

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);

    // goToBButton: when pressed sends message to class B.    
    Button goToBButton = (Button)this.findViewById(R.id.go_to__b_btn);
    goToBButton.setOnClickListener(new OnClickListener() {
        @Override
        public void onClick (View v) {      
            Log.i(TAG,"A Class: goToBButton, onClick");
            Intent i = new Intent(A.this, B.class);
            startActivityForResult(i,REQ_TO_B);
        }       
    });                
} // end onCreate

Мой код ClassB

    public class B extends Activity{

private static final String TAG = "tag";

@Override
   public void onCreate(Bundle savedInstanceState) {
  super.onCreate(savedInstanceState);
  setContentView(R.layout.layoutb);

  // set as true, should always print Tag: one line before first finish"
  if (true)  {

    Log.i(TAG,"B Class: one line before 1st finish");
    finish();
  }

  // shouldn't get here after first finish
  Log.i(TAG,"B Class: outside of if clause, before second finish");
  finish();
  // shouldn't get here after second finish
  Log.i(TAG,"B Class: outside of if clause, after finish");                  
   } // end onCreate


@Override
public void onStart () {
    super.onStart();
    Log.i(TAG,"B Class: onStart");
}

@Override
public void onRestart() {
    super.onRestart();
    Log.i(TAG,"B Class: onRestart");
}

@Override
public void onResume () {
    super.onResume();
    Log.i(TAG,"B Class: onResume");
}

@Override
public void onPause () {
    super.onPause();
    Log.i(TAG,"B Class: onPause");
}

@Override
public void onStop () {
    super.onStop();
    Log.i(TAG,"B Class: onStop");
}

@Override
public void onDestroy () {
    super.onDestroy();
    Log.i(TAG,"B Class: onDestroy");
}

 } // end B Class

Вот результаты моих тегов:

11-26 15:53:40.456: INFO/tag(699): Класс A: goToBButton, onClick

11-26 15:53:40.636: INFO/tag(699): Класс A: onPause

11-26 15:53:40.865: INFO/tag(699): Класс B: одна линия до 1-го финиша

11-26 15:53:40.896: INFO/tag(699): Класс B: вне предложения if, перед вторым финишем

11-26 15:53:40.917: INFO/tag(699): Класс B: вне предложения if, после завершения

11-26 15:53:41.035: INFO/tag(699): Класс A: onResume

11-26 15:53:41.165: INFO/tag(699): B Class: onDestroy


person flobacca    schedule 26.11.2011    source источник
comment
сразу был очень плохой выбор слова в документах...   -  person Karu    schedule 08.02.2016


Ответы (2)


Я предполагаю, что это связано с тем, что finish() не вызывает возврат метода onCreate. Вы можете попробовать просто добавить

finish();
return;

Или используйте if else

@Override
public void onCreate(Bundle savedInstanceState) {
  super.onCreate(savedInstanceState);
  setContentView(R.layout.layoutb);
  if(good data){
      //do stuff
  }else{
      finish();
  }
}
person triggs    schedule 27.11.2011
comment
Первое предложение просто добавить return сработало! После того, как он возвращается, вызывается ClassA при возобновлении, затем вызывается Class B onDestroy. - person flobacca; 28.11.2011
comment
Просто добавление возврата; после этого показывает ошибки для недостижимого кода. Чтобы обойти это, используйте возврат в if - person Onimusha; 17.09.2015

Похоже, что finish() не работает, пока onCreate() не вернет управление системе. Пожалуйста, обратитесь к этому сообщению: о завершении() в Android. Вы должны рассмотреть эту проблему, если вы не хотите, чтобы какой-либо ваш код выполнялся после вызова finish.

Надеюсь, поможет.

person Hicham    schedule 27.11.2011