Mar 072011
 

In Android teilt sich eine App in Activities auf. In der Android API fehlt die Möglichkeit eine App komplett zu beenden. Meine Lösung verwendet startActivityForResultonActivityResultsetResult und finish.

In meiner Tower Defense App durchläuft der Benutzer drei Activities: WelcomeActivity, WorldSelectActivity und WorldActivity = Spielen. Die Klassenhierarchie wie folgt:

Die im folgenden beschriebenen Methoden sind Bestandteil des Layer-Supertypes AbstractActivity. Der Nutzer drückt “quit” im Menu der WorldActivity, dann soll die aktuelle und alle vorher aufgerufenen Activities der App beendet werden.

  public boolean onOptionsItemSelected(final MenuItem _item) {
    switch (_item.getItemId()) {
      case R.id.menuEntryQuit:
        quitApp();
        return true;
      default:
    }
 
    return super.onOptionsItemSelected(_item);
  }

Beim Beenden der Activity muss ein entsprechender Result-Code gesetzt werden, …

  protected void quitApp() {
    setResult(RESULT_QUIT_APP);
    finish();
  }

…damit die aufrufende Activity das Beenden der App erkennt und sich ebenfalls beendet.

  protected void onActivityResult(final int _requestCode,
      final int _resultCode, final Intent _data) {
    if (_resultCode == RESULT_QUIT_APP) {
      quitApp();
    } else {
      super.onActivityResult(_requestCode, _resultCode, _data);
    }
  }

Obwohl die aufrufende Activity kein echtes Ergebnis der Folge-Activity erwartet, muss es die folgende Actvity in Erwartung eines Ergebnisses starten um das Result-Ergebnis RESULT_QUIT_APP über onActivityResult zu erhalten:

startActivityForResult(intent, REQUEST_WORLD);

Drückt also der Nutzer “quit” so beenden sich alle Activities im Stack der App. Dieser Blog-Post zerstört sich im Übrigen auch in 10 Sekunden selbst ;-)