In diesem Kapitel befassen wir uns mit impliziten Intents, die zum Ausführen von Aktionen verwendet werden. Im Gegensatz zu expliziten Intents, die das zu startende Activity kennen, haben implizite Intents kein Wissen darüber, welche Komponente sich um die Ausführung einer Aktion kümmert. Explizite Intents werden im Kapitel Die Klassen Activity und Intent behandelt.

Zu Übungszwecken erstellen wir in diesem Kapitel eine Android App die:

  • sich zum Empfangen von Bildern durch implizite Intents anmeldet
  • empfangene Bilder mittels impliziten Intents versendet

Beispiel: Android App zum Empfangen von Bildern aus impliziten Intents:

  1. Bitte erzeugen Sie ein neues Android Application Project mit dem Namen Implicit Intent und einem Activity vom Typ Empty Activity.
  2. Als nächstes wird das Activity zum Empfangen von Bildern registriert. Dazu wird dem Activity im Android Manifest ein neuer intent-filter hinzugefügt:
    <?xml version="1.0" encoding="utf-8"?>
    <manifest xmlns:android="http://schemas.android.com/apk/res/android"
        package="com.individuapp.implicitintent"
        android:versionCode="1"
        android:versionName="1.0" >
     
        <uses-sdk
            android:minSdkVersion="14"
            android:targetSdkVersion="19" />
     
        <application
            android:allowBackup="true"
            android:icon="@drawable/ic_launcher"
            android:label="@string/app_name"
            android:theme="@style/AppTheme" >  
            <activity
                android:name="com.individuapp.implicitintent.MainActivity"
                android:label="@string/app_name" >
                <intent-filter>
                    <action android:name="android.intent.action.MAIN" />
                    <category android:name="android.intent.category.LAUNCHER" />
                </intent-filter>
                 
                <intent-filter>
                    <action android:name="android.intent.action.SEND" />
                    <category android:name="android.intent.category.DEFAULT" />
                    <data android:mimeType="image/*" />
                </intent-filter>
            </activity>
        </application>
     
    </manifest>
    
  3. intent-filter informieren das System, welche Aktionen eine Komponete ausführen kann. Im obigen Beispiel registriert sich die App zum Empfangen von von Dateien vom Type image, also Bildern. Details zu den verschiedenen Parametern von intent-filter finden sich in der Dokumentation der Klasse Intent unter: https://developer.android.com/reference/android/content/Intent.html

  4. Zur Anzeige der empfangenen Bilder wird im nächsten Schritt eine ImageView zum Layout des Activity hinzugefügt und im Anschluss die Methode onCreate() wie folgt erweitert:
    package com.individuapp.implicitintent;
    
    import android.app.Activity;
    import android.content.Intent;
    import android.net.Uri;
    import android.os.Bundle;
    import android.widget.ImageView;
    
    public class MainActivity extends Activity {
    
    	@Override
    	protected void onCreate(Bundle savedInstanceState) {
    		super.onCreate(savedInstanceState);
    		setContentView(R.layout.activity_main);
    
    		final Intent i = getIntent();
    		final Bundle extras = i.getExtras();
    		if (null != extras) {
    			Uri imageUri = (Uri) extras.get(Intent.EXTRA_STREAM);
    			ImageView image = (ImageView) findViewById(R.id.imageView1);
    			image.setImageURI(imageUri);
    		}
    	}
    }
    
    

    Hier passiert folgendes:

    • Zuerst wird getestet, ob getExtras() Daten liefert. Wird die App direkt gestartet, sind keine Daten vorhanden und wir können in Folge dessen nichts empfangen.
    • Wenn getExtras() ein Bundle liefert, wird eine Referenz auf die ImageView abgefragt und das darzustellende Bild über dessen uniform resource identifier (URI) geladen.
  5. Nun muss die App einmal gestartet werden, damit sie installiert wird. Daraufhin wird lediglich das Lauchner-Icon in der ImageView angezeigt. Wird jedoch die Gallery App gestartet und auf die Share- bzw. Versenden-Schaltfläche gedrückt, kann die Beispiel-App in der Liste der Apps, die in der Lage sind Bilder zu empfangen, ausgewählt werden.
    Wenn in Reaktion auf das Drücken der Versenden-Schaltfäche automatisch eine App gestartet wird, liegt das daran, dass die gestartete App als Standard im System festgelegt wurde. Dies kann einfach geändert werden, indem im Menü Einstellungen -> Apps -> Name der Standard-App -> die Schaltfläche Aktionen auf Standard zurücksetzen gedrückt wird. Daraufhin wird beim nächsten Versenden wieder nachgefragt, mit welcher App die Datei empfangen werden soll.
  6. Android Demo App zum Versenden von Bildern durch einen impliziten Intent.Wird nun die Gallery App gestartet und ein Bild an die soeben erstellte ImplicitIntent App gesendet, erhalten wir eine Anzeige ähnlich der folgenden:
  7.  

Android Beispiel2: Versenden von Bildern mittels impliziten Intents:

In den nächsten Schritten wird die gerade erstellte Android App um das Versenden des angezeigten Bildes über einen impliziten Intent erweitert:

  1. Einen Button mit der Bezeichnung Versenden zum Layout des Activity hinzufügen.
  2. Die Methode onCreate() wie im folgendem Beispiel anpassen:
    package com.individuapp.implicitintent;
    
    import android.app.Activity;
    import android.content.Intent;
    import android.net.Uri;
    import android.os.Bundle;
    import android.view.View;
    import android.view.View.OnClickListener;
    import android.widget.Button;
    import android.widget.ImageView;
    
    public class MainActivity extends Activity {
    	public static final int REQUEST_ID = 1;
    
    	@Override
    	protected void onCreate(Bundle savedInstanceState) {
    		super.onCreate(savedInstanceState);
    		setContentView(R.layout.activity_main);
    
    		final Intent i = getIntent();
    		final Bundle extras = i.getExtras();
    		if (null != extras) {
    			Uri imageUri = (Uri) extras.get(Intent.EXTRA_STREAM);
    			ImageView image = (ImageView) findViewById(R.id.imageView1);
    			image.setImageURI(imageUri);
    		}
    
    		Button sendButton = (Button) findViewById(R.id.button1);
    		sendButton.setOnClickListener(new OnClickListener() {
    			@Override
    			public void onClick(View v) {
    
    				if (null == extras) {	// Direkter Start der App
    					return;
    				}
    
    				Intent sendIntent = new Intent();
    				sendIntent.setAction(Intent.ACTION_SEND);
    				sendIntent.putExtra(Intent.EXTRA_STREAM, (Uri) extras.get(Intent.EXTRA_STREAM));
    				sendIntent.setType(i.getType()); 
    
    				// Prüfen ob der Intent zum Aufruf eines Activity führt
    				if (sendIntent.resolveActivity(getPackageManager()) != null) {
    					startActivityForResult(sendIntent, REQUEST_ID);
    				} 
    			}
    		});
    	}
    }
    
    
  3. Beispiel eines impliziten Intent zum Versenden von Bildern.Zum Abschluss die App erneut aus Elcipse starten, um sie zu installieren. Wird im Anschluss unsere ImplicitIntent App durch das Versenden eines Bildes aus der Android Gallery App gestartet, können wir mit der Versenden Schaltfläche das empfangene Bild an eine andere App weiterleiten. Die daraufhin erscheinende Abfrage der durchzuführenden Aktion dürfte dem folgenden Screenshot ähnlich sein.