In diesem Kapitel befassen wir uns mit den Grundlagen der Android Klassen Activity und Intent.
Ein Activity stellt eine Bildschirmseite in einer App dar. In einer Email-App wären zum Beispiel die Liste der empfangen Emails, die Leseansicht und die Ansicht zum Verfassen neuer Emails jeweils ein eigenes Activity.
Die Android Intent Klasse wird zum Starten von Activities und zum Datenaustausch zwischen Activities verwendet.

Zu den Hauptmerkmalen von Activities zählen:

  • Android-Apps bestehen in der Regel aus mehreren Activities.
  • Activities werden auf einem Stack (Stapel) verwaltet.
    • Wenn ein neues Activity gestartet wird, wird es oben auf den Stapel gelegt.
    • Wenn die Zurück-Taste gedrückt wird, wird das zuvor aktive Activity wieder aktiv.
  • Im Falle von Ressourcenknappheit werden inaktive Activities von der VM beendet.
  • Die Benutzerschnittstelle (Userinterface) kann in XML oder im Java Programmcode erstellt werden. Bei der Erstellung des Userinterface in XML steht ein grafischer Editor zur Verfügung. Ausserdem bietet XML den Vorteil der Trennung von UI Code und Programmcode.
  • Aktivities verfügen über Methoden, die in den unterschiedlichen Phasen des Lebenszyklus aufgerufen werden:
    Der Android Activity Lebenszyklus. Activities werden mit der Android Intent Klasse gestartet.

Android Activity Beispiel App:

Die folgenden Beispiele zeigen die Anwendung von Activities und Intents. Dafür bitte ein neues Android Application Projekt in Eclipse erstellen. Als Namen Activity Beispiel angeben und bei der Wahl des zu erstellenden Activity Empty Activity wählen. Die daraufhin generierte Datei MainActivity.java sieht wie folgt aus:

package com.individuapp.activitybeispiel;

import com.individuapp.activitybeispiel.R;

import android.app.Activity;
import android.os.Bundle;

public class MainActivity extends Activity {

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);
	}
}
  • Die Methode onCreate() muss in jedem Android Activity implementiert sein. Sie erzeugt das Activity sowie dessen Ansicht/View.
  • super.onCreate(savedInstanceState);
    ruft onCreate() der Vaterklasse auf. Android verlangt, dass in einer überschriebenen Lifecycle-Methode die Implementierung aus der Vaterklasse aufgerufen wird.
  • setContentView(R.layout.activity_main);
    lädt die Benutzerschnittstelle aus der Datei res/layout/activity_main.xml.

Wechsel zwischen zwei Activities:

Im nächsten Schritt wird die zuvor erstellte App um ein zweites Activity erweitert und das Wechseln zwischen Activities gezeigt. Führen Sie dazu bitte die folgenden Schritte aus:

  1. Dem Projekt ein neues Activity hinzufügen:
    Über das Menü File -> New -> Other im Dialog unter Android den Eintrag Android Activity wählen.
    Als Name ZweitesActivity angeben.
  2. Eine neue Schaltfläche (Button) zur Benutzerschnittstelle des Main Activity (res/layout/activity_main.xml) hinzufügen und dem Button eine id zuweisen, z.B.: @+id/buttonZumZweitenActivity
    Wichtig: Die id muss mit @+id/ beginnen!
    • @+id/buttonZumZweitenActivity definiert eine neue id mit der Bezeichnung buttonZumZweitenActivity.
    • @id/buttonZumZweitenActivity referenziert die id buttonZumZweitenActivity.
  3. Die Methode onCreate() in MainActivity.java um den Code zum Wechseln des Activity erweitern:
    package com.individuapp.activitybeispiel;
    
    import com.individuapp.activitybeispiel.R;
    
    import android.app.Activity;
    import android.os.Bundle;
    import android.content.Intent;
    import android.view.View;
    import android.view.View.OnClickListener;
    import android.widget.Button;
    
    public class MainActivity extends Activity {
    
    	@Override
    	protected void onCreate(Bundle savedInstanceState) {
    		super.onCreate(savedInstanceState);
    		setContentView(R.layout.activity_main);
    		
    		Button b = (Button) findViewById(R.id.buttonZumZweitenActivity);
    		b.setOnClickListener(new OnClickListener() {
    		    @Override
    		    public void onClick(View v) {
    		    	startActivity(new Intent(MainActivity.this, ZweitesActivity.class));
    		    }
    		});
    	}
    }
    

    Hier passiert folgendes:

    • findViewById() liefert eine Referenz auf eine View mit der Id buttonZumZweitenActivity. Im obigen Beispiel ein Button.
    • setOnClickListener meldet einen Listener an, dessen onClick() Methode bei einem Klick auf den Button aufgerufen wird.
    • onClick() wird aufgerufen, wenn der Button geklickt wird.
    • startActivity() startet ein neues Activity über einen Intent.
    • Ein Intent ist eine abstrakte Beschreibung einer auszuführenden Aktion. In diesem Fall das Starten eines neuen Activity.
    • MainActivity.this ist der aktuelle Kontext (das derzeit ausgeführte Activity).
    • Activity2.class ist das Activity zu dem gewechselt werden soll.

Zum Beenden eines Activity wird dessen Methode finish() aufgerufen.

Die Android Intent Klasse

Intents aktivieren Komponenten der App bzw. des Android Betriebssystems. Es gibt zwei Arten von Intents:

  • Explizite Intents aktivieren eine bekannte Komponente einer App. Zum Starten eines Activity wird ein expliziter Intent verwendet.
  • Implizite Intents führen eine Aktion aus, ohne die dazu verwendete Komponente zu kennen. Nehmen wir als Beispiel das Versenden eines Bildes. Sind mehrere Apps, die Bilder empfangen können, installiert (z.B. Bildbearbeitungsprogramme, Email Clients, Cloud-Speicher… ), kann der Benutzer beim Versenden eines Bildes die App, die das Bild empfangen soll, wählen. Implizite Intents werden im nächsten Kapitel noch genauer behandelt.

Datenübergabe zwischen Activities mittels der Android Intent Klasse

Zur Datenübergabe zwischen Activities werden die Methoden putExtra() und getExtra() der Android Intent Klasse verwendet. Das folgende Beispiel erweitert die vorherige App um die Datenübergabe zwischen den beiden Activities.

  1. Das Layout von MainActivity (res/layout/activity_main.xml) um ein EditText Feld erweitern. Die id editText1 beibelassen.
  2. Die Methode onCreate() in MainActivity.java um den Programmcode zur Datenübergabe an das zu startende Activity erweitern:
    package com.individuapp.activitybeispiel;
    
    import com.individuapp.activitybeispiel.R;
    
    import android.app.Activity;
    import android.os.Bundle;
    import android.content.Intent;
    import android.view.View;
    import android.view.View.OnClickListener;
    import android.widget.Button;
    import android.widget.EditText;
    
    public class MainActivity extends Activity {
    	public static final String KEY = "TEXTEINGABE";
    
    	@Override
    	protected void onCreate(Bundle savedInstanceState) {
    		super.onCreate(savedInstanceState);
    		setContentView(R.layout.activity_main);
    
    		final EditText edit = (EditText) findViewById(R.id.editText1);
    
    		Button b = (Button) findViewById(R.id.buttonZumZweitenActivity);
    		b.setOnClickListener(new OnClickListener() {
    			@Override
    			public void onClick(View v) {
    				Intent i = new Intent(MainActivity.this, ZweitesActivity.class);
    				i.putExtra(KEY, edit.getText().toString());
    				startActivity(i);
    			}
    		});
    	}
    }
    
  3. Die Datei res/layout/activity_zweites.xml um ein TextView Element erweitern und die id @+id/textView2 zuweisen.
  4. Die Methode onCreate() von ZweitesActivity.java um das Anzeigen des in Schritt 2 übergebenen Text erweitern:
    package com.individuapp.activitybeispiel;
    
    import android.app.Activity;
    import android.os.Bundle;
    import android.widget.TextView;
    
    public class ZweitesActivity extends Activity {
    
    	@Override
    	protected void onCreate(Bundle savedInstanceState) {
    		super.onCreate(savedInstanceState);
    		setContentView(R.layout.activity_zweites);
    		
    		TextView textView = (TextView) findViewById(R.id.textView2);
    		textView.setText(getIntent().getExtras().getString(MainActivity.KEY));
    	}
    }
    

Datenrückgabe aus einem Activity mittels der Android Intent Klasse

Im folgendem Beispiel wird die bestehende App um die Rückgabe von Daten aus dem aufgerufenem Activity erweitert.

  1. Hierzu wird der Aufruf von startActivity(Intent i);
    duch die Methode startActivityForResult(Intent i, int requestCode); ersetzt.
    Der im zweiten Parameter übergebene int Wert requestCode wird, nachdem das zu startende Activity wieder beendet wurde, dem aufrufendem Activity über die Methode onActivityResult() zurückgeliefert. Dazu wird die Klasse MainActivity.java wie folgt erweitert:
    package com.individuapp.activitybeispiel;
    
    import com.individuapp.activitybeispiel.R;
    
    import android.app.Activity;
    import android.content.Intent;
    import android.os.Bundle;
    import android.view.View;
    import android.view.View.OnClickListener;
    import android.widget.Button;
    import android.widget.EditText;
    
    public class MainActivity extends Activity {
    	public static final String KEY = "TEXTEINGABE";
    	public static final int REQUEST_ID = 1;
    
    	@Override
    	protected void onCreate(Bundle savedInstanceState) {
    		super.onCreate(savedInstanceState);
    		setContentView(R.layout.activity_main);
    
    		final EditText edit = (EditText) findViewById(R.id.editText1);
    
    		Button b = (Button) findViewById(R.id.buttonZumZweitenActivity);
    		b.setOnClickListener(new OnClickListener() {
    			@Override
    			public void onClick(View v) {
    				Intent i = new Intent(MainActivity.this, ZweitesActivity.class);
    				i.putExtra(KEY, edit.getText().toString());
    				startActivityForResult(i, REQUEST_ID);
    			}
    		});
    	}
    
    	@Override
    	public void onActivityResult(int requestCode, int resultCode, Intent data) {
    		if (requestCode == REQUEST_ID) {
    			if (resultCode == RESULT_OK) {
    				String retValue = data.getStringExtra(ZweitesActivity.RETVAL_KEY); 
    				EditText edit = (EditText) findViewById(R.id.editText1);
    				edit.setText(retValue);
    			}
    		}
    	}
    }
    

    Die Konstante REQUEST_ID ermöglicht dem aufrufendem Aktivity die Zuordnung der über onActivityResult() empfangenen Daten. Die REQUEST_ID wird an das zu startende Activity übergeben und nach dessen Beendigung zusammen mit den zurückgelieferten Daten in der Methode onActivityResult() empfangen.

  2. Nun der Benutzerschnittstelle von res/layout/activity_zweites.xml eine neue Schaltfläche hinzufügen und dessen onClick() Methode wie im folgendem Beispielcode implementieren:
    package com.individuapp.activitybeispiel;
    
    import android.app.Activity;
    import android.content.Intent;
    import android.os.Bundle;
    import android.view.View;
    import android.view.View.OnClickListener;
    import android.widget.Button;
    import android.widget.TextView;
    
    public class ZweitesActivity extends Activity {
    	public static final String RETVAL_KEY = "RETURN STRING";
    
    	@Override
    	protected void onCreate(Bundle savedInstanceState) {
    		super.onCreate(savedInstanceState);
    		setContentView(R.layout.activity_zweites);
    		
    		final TextView textView = (TextView) findViewById(R.id.textView2);
    		textView.setText(getIntent().getExtras().getString(MainActivity.KEY));
    		
    		Button buttonZurueck = (Button) findViewById(R.id.buttonZurueck);
    		buttonZurueck.setOnClickListener(new OnClickListener() {
    			@Override
    			public void onClick(View v) {
    				Intent resultData = new Intent();
    				resultData.putExtra(RETVAL_KEY, "retValData: "+textView.getText());
    				setResult(Activity.RESULT_OK, resultData);
    				finish();
    			}
    		});
    	}
    }
    

    In onClick() wird vor dem Beenden der Rückgabewert des Android Activity über die Methode putExtra() der Android Klasse Intent gesetzt. Die Konstante RETVAL_KEY wird von beiden Activities zur Identifikation der Rückgabedaten verwendet.

Links zur Android Dokumentation (Englisch)

Android Activity
Android Intent