onCreate flow wird nach finish () fortgesetzt

76

Ich möchte eine Aktivität innerhalb der onCreateMethode beenden . Wenn ich anrufe finish(), onDestroy()nicht sofort aufgerufen wird, fließt der Code weiter vorbei finish(). onDestroy()wird erst nach der onCreate()schließenden Klammer aufgerufen .

Gemäß der onCreate()Beschreibung unter developer.android.com/reference.

Sie können finish () innerhalb dieser Funktion aufrufen. In diesem Fall wird onDestroy () sofort aufgerufen, ohne dass der Rest des Aktivitätslebenszyklus (onStart (), onResume (), onPause () usw.) ausgeführt wird.

Der Grund, den ich frage, ist: Ich möchte Daten aus dem an übergebenen Bundle überprüfen onCreate(). Natürlich habe ich die Kontrolle darüber, was weitergegeben wird onCreate, aber ich denke immer noch, dass es zum Zeitpunkt der Lieferung überprüft werden sollte.

Mein Code enthält eine Klasse A, die Activity startet B. Ich glaube, die letzten beiden "außerhalb der if-Klausel" -Tags sollten nicht aufgerufen werden, da die finishMethode in der ifAnweisung die Aktivität hätte zerstören sollen. Es hat nichts mit der if-Klausel zu tun, da die Tag-Zeile nach dem zweiten finish()Aufruf auch noch gelesen wird.

Mein Code:

Klasse 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

Mein Code 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

Hier sind die Ergebnisse meiner Tags:

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

11-26 15: 53: 40.636: INFO / tag (699): Eine Klasse: onPause

11-26 15: 53: 40.865: INFO / Tag (699): B Klasse: eine Zeile vor dem 1. Ziel

11-26 15: 53: 40.896: INFO / tag (699): B Klasse: außerhalb der if-Klausel vor dem zweiten Ziel

11-26 15: 53: 40.917: INFO / tag (699): B Klasse: außerhalb der if-Klausel nach Beendigung

11-26 15: 53: 41.035: INFO / tag (699): Eine Klasse: onResume

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

Flobacca
quelle
"sofort" war eine sehr schlechte Wortwahl in den Dokumenten ...
Karu

Antworten:

122

Ich vermute, dass es daran liegt, dass finish () die onCreate-Methode nicht zurückgibt. Sie könnten versuchen, einfach hinzuzufügen

finish();
return;

Oder verwenden Sie ein if else

@Override
public void onCreate(Bundle savedInstanceState) {
  super.onCreate(savedInstanceState);
  setContentView(R.layout.layoutb);
  if(good data){
      //do stuff
  }else{
      finish();
  }
}
Triggs
quelle
4
Der erste Vorschlag, "einfach die Rendite hinzuzufügen", hat funktioniert! Nach der Rückkehr wird ClassA on resume aufgerufen, dann Class B onDestroy.
Flobacca
1
Einfach Return hinzufügen; zeigt danach Fehler für nicht erreichbaren Code. Um dies zu umgehen, verwenden Sie die Rückkehr inif
Onimusha
23

Es scheint, als würde finish()es nicht funktionieren, bis onCreate()die Kontrolle an das System zurückgegeben wird. Bitte beziehen Sie sich auf diesen Beitrag: about finish () in android . Sie müssen dieses Problem berücksichtigen, wenn Sie nicht möchten, dass Ihr Code nach dem Aufruf von finish ausgeführt wird.

Ich hoffe es hilft.

Hicham
quelle