Android-Programmierung: Die Activity
Willemers Informatik-Ecke
Zurück zur Android-Hauptseite

Eine Activity verwaltet einen Bildschirm, also einen Dialog oder ein Formular. Bei Anlegen eines Projekts schlägt die IDE als erste Activity den Namen MainActivity vor. Diese Haupt-Activity wird automatisch eingetragen und übernimmt die Steuerung des ersten Bildschirms.

Eine App wird über kurz oder lang aber mehrere Activities einsetzen wollen. Jede Activity muss im Manifest eingetragen werden.

Activity und Manifest

Eine Activity muss im AndroidManifest.xml eingetragen sein. Arbeitet man mit einer IDE, wird diese es automatisch erledigen, wenn man eine Activity als solche hinzufügt (File|New|Actity| ...).

Zustände einer Activity

Da die Activity nur einen Bildschirm repräsentiert, hat sie auch keine main-Funktion, sondern sie wird durch die App aufgerufen. Eine Activity kann entstehen, verschwinden, verdeckt werden, erzeugt oder gelöscht werden. In jedem dieser Fälle wird sie informiert, indem eine der folgenden Methoden aufgerufen werden.

void onCreate(Bundle bundle)
Die Activity wurde erzeugt. Diese Methode wird typischerweise für jede Activity überschrieben, schon um den Bildschirm zu initialisieren. Dabei wird zuallererst mit super.onCreate(bundle) die Methode onCreate der Basisklasse aufgerufen.
Der Parameter Bundle enthält den Zustand der Activity, der eventuell bei einem zuvor unerwarteten Abbruch durch das Laufzeitsystem durch die Methode onSaveInstanceState noch gesichert wurde. Diesen können Sie aber auch durch Überschreiben der Methode void onRestoreInstanceState(Bundle bundle) erlangen.

Im weiteren Verlauf wird typischerweise die XML-Layout-Datei mit setContentView geladen.

void onDestroy()
Diese Methode wird aufgerufen, wenn die App endgültig beendet wird. Es entspricht also dem Gegenstück zu onCreate(), wird aber nicht immer verlässlich vor dem Ende der Activity aufgerufen.
void onStart()
Diese Methode wird aufgerufen, wenn die Activity sichtbar wird, typischerweise nachdem eine andere App gestoppt wurde. Sie erhält dabei nicht zwingend den Fokus.
void onStop()
Eine andere App wird aktiv. Die aktuelle App wird unsichtbar, aber nicht zerstört. Hier sollten alle Aktionen gestoppt werden, die für die Darstellung erforderlich sind, wie Animationen oder Aktualisierung der Oberfläche.

Es ist möglich, dass die Anwendung nach onStop ohne weitere Vorwarung vom Laufzeitsystem beendet werden kann.

void onRestart()
Die Activity wird wieder sichtbar. Aufruf erfolgt also vor jedem Aufruf von onStart, außer dem ersten.
void onPause()
Eine andere Activity - vermutlich von der eigenen App - kommt nach vorn. Die bisherige Activity wird kurz angehalten. Der Code in der Methode sollte schlank gehalten werden, da das Ereignis oft auftreten kann.
void onResume()
Eine pausierte Activity wird wieder in den Vordergrund geschoben und tritt mit dem Benutzer in Interaktion. Der Code in der Methode sollte schlank gehalten werden, da das Ereignis oft auftreten kann.
void onSaveInstanceState(Bundle bundle)
Hier sollte der Zustand der Oberfläche in einem Objekt der Klasse Bundle zu speichern, die nach dem Ende der Activity in onRestoreInstanceState() wieder hergestellt werden kann.
void onRestoreInstanceState(Bundle bundle)
Erhält die Daten von onSaveInstanceState zurück und sollte die Oberfläche rekonstruieren.

Basisklasse Activity und AppCompatActivity

Diese Methoden werden von der Klasse Activity zur Verfügung gestellt. Für die eigene Activity wird das Programm die Standard-Activity erweitern und die Methoden überschreiben.

Wenn Android Studio eine Activity anlegt, erweitert diese AppCompatActivity. Damit erreicht es, dass die Activity auch zu älteren Android-Versionen kompatibel ist. Darum sollten Sie das auch machen.

package de.willemer.myapplication;

import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;

public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
    }
}

Activity und XML-Layout-Datei

Korrespondierend zu jeder Activity gibt es eine XML-Datei im Verzeichnis layout. Die IDE erzeugt im Allgemeinen sofort eine XML-Datei zur Activity. Bei der MainActivity heißt die passende Datei normalerweise activity_main.xml.

Im folgenden Listing wird beim Erzeugen der Activity mit der Funktion setContentView die XML-Datei als Basis für den eigenen Bildschirm herangezogen. Der Aufruf sorgt also für die Verbindung von XML-Datei und Activity.

import android.app.Activity;

public class MainActivity extends Activity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
         ...
}
Wird AppCompatActivity statt Activity erweitert, erhält die Activity eine App-Bar, also einen Balken, in dem sich auch ein Zugriff auf das Menü existiert. Dies ist für neuere Android-Versionen wichtig, weil dort oft bereits kein Standard-Button mehr für das Menü am Gerät existiert. Damit ist dann onOptionsItemSelected() für den Anwender nicht mehr erreichbar.

Wechsel der Activity

Um eine andere Activity zu starten, wird dessen Intent erstellt und dann mit startActivity() gestartet. Der Intent bestimmt also, welche Activity gestartet wird.

Activity bleibt auf dem Stack

Allerdings läuft die aufrufende Activity zunächst weiter. Sie wartet also nicht auf das Ende der eben gestarteten Activity. Sie bleibt auf dem Activity-Stack. Wird die gestartete Activity beendet, beispielsweise durch den Aufruf der Methode finish oder vom Benutzer durch Drücken der Back-Taste, erscheint die startende Activity wieder auf dem Bildschirm.

Um von der gestarteten Activity ein Ergebnis zu erlangen, verwenden Sie den Aufruf der Methode startActivityForResult.

Datenübergabe bei Activity-Wechsel

Häufig müssen an die aufgerufene Activity Daten übermittelt werden. Diese können durch den Aufruf von putExtra im Intent der Ziel-Activity hinterlegt werden. Dazu wird ein Schlüssel verwendet, damit bei mehreren Daten der richtige Wert ermittelt werden kann.
Intent intent = new Intent(this, AufgerufeneActivity.class);
// Intent mit den Daten füllen
intent.putExtra("key1", "Irgendwelcher Text");
intent.putExtra("key2", "Nochson Text");
startActivity(intent);
Die mit putExtra gesendeten Daten werden mit getStringExtra empfangen. Dabei wird der erste Parameter als Schlüssel verwendet.
...
public void onCreate(Bundle bundle) {
    ...
    Intent intent = getIntent();
    String data = intent.getStringExtra("key1");
    String andere = intent.getStringExtra("key2");
    ...
}
Um eigene Objekte zu übertragen, müssen diese Parcelable implementieren. Dann wird mit den Methoden putExtra("key", object) geschrieben und mit getParcelableExtra("key") zurückgeholt.

Die aufgerufene Activity schließt sich nach dem Start der anderen Activity durch den Aufruf von finish();.

Links