2011-11-26 24 views
62

Chciałbym zakończyć działanie od wewnątrz metody onCreate. Gdy zadzwonię pod numer finish(), onDestroy() nie jest natychmiast wywoływany, kod nadal przepływa obok finish(). onDestroy() nie jest wywoływana przed zamknięciem klamrowym onCreate().onUtwórz przepływ kontynuuje po zakończeniu()

Według opisu na stronie onCreate() na stronie developer.android.com/reference.

Można zadzwonić wykończenie() od wewnątrz tej funkcji, w tym przypadku onDestroy() zostanie natychmiast wezwał bez reszty cyklu działalności (onStart(), onResume(), OnPause() itp.).

Powód, o który pytam, to: Chciałbym sprawdzić dane z Pakietu przekazanego do onCreate(). Oczywiście mam kontrolę nad tym, co jest przekazywane do onCreate, ale nadal uważam, że należy to sprawdzić w punkcie dostawy.

Mój kod zawiera klasę A, która rozpoczyna działanie B. Sądzę, że dwa ostatnie znaczniki "poza klauzulą" nie powinny być wywoływane, ponieważ metoda finish w oświadczeniu powinna zniszczyć działanie. Nie ma to nic wspólnego z klauzulą ​​if, ponieważ linia znaczników po drugim wywołaniu finish() jest nadal czytana.

mój kod:

Klasa A

@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 

mojego kodu 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 

Oto wyniki moich tagów:

11-26 15:53 : 40.456: INFO/tag (699): A Klasa: goToBButton, onClick

26/11 15: 53: 40,636: info/zakładka (699): klasa: OnPause

11-26 15: 53: 40,865: info/zakładka (699): B klasy: jedna linia przed 1-ta końca

26/11 15: 53: 40.896: info/zakładka (699): klasa B: poza jeśli klauzulą, przed drugim końca

26/11 15: 53: 40,917: informacji/znacznik (699): Klasa B: poza klauzulą ​​if, po zakończeniu

11-26 15: 53: 41.035: INFO/tag (699): A Klasa: onResume

11-26 15: 53: 41,165: INFO/tag (699): B Klasa: onDestroy

+0

"Natychmiast" był bardzo kiepskim wyborem słów w dokumentach ... – Karu

Odpowiedz

103

Zgaduję, że to dlatego, że wykończenie() nie wywołuje metodę onCreate powrót .Można spróbować po prostu dodając

finish(); 
return; 

lub użyć jeśli inny

@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.layoutb); 
    if(good data){ 
     //do stuff 
    }else{ 
     finish(); 
    } 
} 
+3

Pierwsza sugestia "po prostu dodawanie zwrotu" zadziałała! Po powrocie wywoływana jest klasa A po wznowieniu, a następnie wywoływana jest klasa B onDestroy. – flobacca

+1

Po prostu dodajemy zwrot; pokazuje następnie błędy dla nieosiągalnego kodu. Aby ominąć to użyj zwrot w 'if' – Onimusha

19

Wydaje się finish() nie działa aż onCreate() kontroli powrotnej do systemu. Proszę odnieść się do tego postu: about finish() in android. Musisz rozważyć ten problem, jeśli nie chcesz, aby któryś z twoich kodów został wykonany po zakończeniu wywoływania.

Mam nadzieję, że to pomaga.

+0

dzięki za potwierdzenie. – flobacca

Powiązane problemy