Ein Intent ist ein Message-Objekt, mit dem Sie eine Aktion von einer anderen App-Komponente anfordern können
Intent-Typen
Explizite Intents
- Definiert welche App den Intent verarbeiten soll
- Paketname der App oder Klassenname wird angegeben
- Verwendung: Activity in der eigenen App starten
Implizite Intents
- Definieren Aktion
- Bearbeitung der Aktion kann von verschiedenen Komponenten übernommen werden
Anwendungsfälle
Starten einer Aktivität
- Starten einen neuen Bildschirm (Activity) der selben App
- Kann mit oder ohne Rückgabewert gestartet werden
startActivity()startActivityForResult() -> onActivityResult()
Starten eines Services
- Deprecated ab API Level 21 (Seitdem Job Scheduler Objekte)
- Hintergrundservices
startService()- immer Explizite Intents verwenden
Versenden von Broadcasts
- Kann jede App erhalten
- Systemereignisse (z.B. Akkustand)
sendBroadcast()sendOrderedBroadcast()
Intent Filter
- Legt fest welche Typen von Intents eine Komponente erwartet
- wird in
AndroidManifest.xmlfestgelegt - Ist ein Intent Filter definiert, kann die Activity über einen Impliziten Intent gestartet werden
Attribute
Name
- Name der zu startenden Komponente
- Mit Name: Expliziter Intent
- Ohne Name: Impliziter Intent
- Kann festgelegt werden mit
setComponent()setClass()setClassName()- Konstruktor
Action
- Gibt an welche Aktion auszuführen ist
- Definiert welche Extras enthalten sind
- Aktionen zum starten einer Aktivität
ACTION_VIEWACTION_SEND
- Kann festgelegt werden mit
- Konstruktor
setAction()
Data
- Art der Daten wird i.d.R. durch Action bestimmt
- URI zu den Daten
setData()
- MIME Typ der Daten
setType()
Category
- Es können mehrere Kategorien enthalten sein
Extras
- Key-Value
- Einzelnes Paar:
putExtra() - Bundle erstellen und mit
putExtras()hinzufügen - Eigene Keys mit Package name
static final String EXTRA_GIGAWATTS = "com.example.EXTRA_GIGAWATTS";
Flags
- Metadaten
Explizite Intents
Beispiel: DetailActivity
AndroidManifest.xml
<activity android:name=".DetailActivity">
<intent-filter>
<action android:name="DetailActivity" />
</intent-filter>
</activity>Andere Activity starten
MainActivity.java
public void startStep1(View v){
Intent i = new Intent(this,DetailActivity.class);
i.setAction(Intent.ACTION_VIEW);
startActivity(i);
}Andere Activity starten und Werte übergeben
MainActivity.java
public void startActivity(View v){
Intent i = new Intent(this, DetailActivity.class);
i.putExtra("CALL_MESSAGE",txtInput.getText().toString());
startActivity(i);
}DetailActivity.java
protected void onCreate(Bundle savedInstanceState) {
Bundle bundle = getIntent().getExtras();
txtInOut.setText(bundle.getString("CALL_MESSAGE"));
}Andere Activity starten und Werte zurückbekommen
MainActivity.java
detailLauncher = registerForActivityResult(
new ActivityResultContracts.StartActivityForResult(), new ActivityResultCallback() {
@Override
public void onActivityResult(ActivityResult result) {
if (result.getResultCode() == Activity.RESULT_OK) {
Intent data = result.getData();
Bundle bundle = data.getExtras();
txtInput.setText(bundle.getString("RESPONSE_MESSAGE"));
}
}
}
);
//Auslösen per Button o.ä.
public void startActivityForResult(View v){
Intent i = new Intent(this, DetailActivity.class);
i.putExtra("CALL_MESSAGE",txtInput.getText().toString()); detailLauncher.launch(i);
}DetailActivity.java
//Auslösen per Button o.ä.
public void backWithData(View v) {
Intent i = new Intent();
i.putExtra("RESPONSE_MESSAGE",txtInOut.getText().toString()); setResult(RESULT_OK, i);
super.finish();
}Implizite Intents
https://developer.android.com/guide/components/intents-common
Beispiel: URL im Browser öffnen
AndroidManifest.xml
<!-- Berechtigung -->
<uses-permission android:name="android.permission.INTERNET"/>MainActivity.java
public void showUrl(View v){
try{
Uri webpage = Uri.parse(txtUrl.getText().toString());
Intent intent = new Intent(Intent.ACTION_VIEW, webpage);
startActivity(intent);
} catch(ActivityNotFoundException e){
Toast.makeText(getApplicationContext(),"Keine passende Aktivität!",
Toast.LENGTH_LONG).show();
}
}Beispiel: Create Alarm
AndroidManifest.xml
<!-- Berechtigung -->
<uses-permission android:name="com.android.alarm.permission.SET_ALARM" />MainActivity.java
public void createAlarm(View v){
try{
Intent intent = new Intent(AlarmClock.ACTION_SET_ALARM)
.putExtra(AlarmClock.EXTRA_HOUR, 11)
.putExtra(AlarmClock.EXTRA_MINUTES, 5);
startActivity(intent);
}
catch(ActivityNotFoundException e){
Toast.makeText(getApplicationContext(),"Keine passende Aktivität!" ,
Toast.LENGTH_LONG).show();
}
}