App Shortcuts: Schnellzugriffe direkt vom Launcher
App Shortcuts bieten Nutzern Schnellzugriffe direkt vom Launcher. Der Artikel zeigt, wie statische und dynamische Shortcuts in Kotlin umgesetzt werden.
Wenn Nutzer deine App regelmäßig für dieselben Aktionen öffnen – eine neue Nachricht verfassen, zur Kamera wechseln oder einen Favoriten aufrufen – dann sind App Shortcuts das richtige Werkzeug. Mit einem langen Druck auf das App-Icon erscheint ein Kontextmenü mit Schnellzugriffen, die den üblichen Navigationspfad abkürzen. Seit Android 7.1 (API-Level 25) gehören Shortcuts zur Plattform; mit Jetpack’s ShortcutManagerCompat kannst du sie abwärtskompatibel ab API 19 nutzen.
Was ist das?
App Shortcuts sind direkte Verknüpfungen zu bestimmten Zielen oder Aktionen innerhalb deiner App. Der Launcher stellt sie über einen Long-Press auf das App-Icon bereit, und der Google Assistant kann sie als Vorschlag für Sprachbefehle aufgreifen. Das macht Shortcuts zu einem der wenigen Android-Features, die gleichzeitig in der Launcher-Oberfläche und auf Sprachassistenten-Surfaces sichtbar werden.
Android kennt drei Shortcut-Typen:
Statische Shortcuts werden in einer XML-Ressource (res/xml/shortcuts.xml) beschrieben und über das App-Manifest eingebunden. Sie sind unveränderlich zwischen App-Releases und ideal für Aktionen, die jeder Nutzer dauerhaft braucht – etwa „Neues Ereignis” in einer Kalender-App oder „QR-Code scannen” in einer Banking-App.
Dynamische Shortcuts erzeugst und verwaltest du zur Laufzeit per ShortcutManagerCompat-API. Sie können auf den aktuellen App-Zustand oder das Nutzerverhalten reagieren: Zeige zum Beispiel die zuletzt besuchten Kontakte oder die häufigsten Routen als Shortcuts an.
Gepinnte Shortcuts entstehen, wenn ein Nutzer einen Shortcut bewusst auf den Home-Screen zieht. Die App kann einen solchen Shortcut vorschlagen, ihn aber nie eigenständig entfernen – dazu ist immer eine explizite Nutzerinteraktion erforderlich.
Alle drei Typen erscheinen im selben Launcher-Kontextmenü. Der Launcher entscheidet eigenständig, wie viele davon gleichzeitig dargestellt werden.
Wie funktioniert es?
Statische Shortcuts bindest du mit einem <meta-data>-Eintrag in der <activity>-Deklaration deiner Launcher-Aktivität ein:
<activity android:name=".MainActivity">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
<meta-data
android:name="android.app.shortcuts"
android:resource="@xml/shortcuts" />
</activity>
In res/xml/shortcuts.xml beschreibst du Label, Icon und einen oder mehrere Intents pro Shortcut. Gibst du mehrere Intents an, wird der letzte tatsächlich gestartet; die vorherigen bauen den Back-Stack auf – so kann der Nutzer nach dem Shortcut-Aufruf normal mit der Zurück-Geste navigieren.
Dynamische Shortcuts erstellst du mit ShortcutInfoCompat.Builder und meldest sie per ShortcutManagerCompat.pushDynamicShortcut() an. Jeder Shortcut benötigt eine stabile id, ein shortLabel (maximal zehn Zeichen empfohlen, da Launcher es je nach Gerät abschneiden), ein longLabel und mindestens einen Intent. Der rank-Wert legt die Reihenfolge im Menü fest – niedrigere Werte erscheinen weiter oben.
Der Launcher zeigt maximal fünf Shortcuts gleichzeitig an; statische und dynamische zählen dabei zusammen. Überschreitest du die Grenze bei dynamischen Shortcuts, verwirft ShortcutManagerCompat automatisch die am wenigsten genutzten. Statische Shortcuts haben dabei grundsätzlich Vorrang vor dynamischen.
In der Praxis
Ein typischer Anwendungsfall ist eine Messaging-App, die beim Tippen auf den Shortcut direkt in den Compose-Screen springen soll. So legst du den dynamischen Shortcut an:
fun registerComposeShortcut(context: Context) {
val shortcut = ShortcutInfoCompat.Builder(context, "new_message")
.setShortLabel("Neue Nachricht")
.setLongLabel("Neue Nachricht schreiben")
.setIcon(IconCompat.createWithResource(context, R.drawable.ic_compose))
.setIntent(
Intent(context, ComposeActivity::class.java).apply {
action = Intent.ACTION_VIEW
}
)
.build()
ShortcutManagerCompat.pushDynamicShortcut(context, shortcut)
}
Rufe diese Funktion beim App-Start auf oder direkt nach relevanten Nutzeraktionen – etwa nachdem jemand einen neuen Kontakt angelegt hat.
Stolperfalle: veraltete Shortcuts nicht entfernen
Wenn ein Nutzer einen Kontakt löscht, der vorher als Shortcut erschien, taucht dieser trotzdem noch im Launcher-Menü auf. Ein Tap darauf führt zu einem Fehler oder einer leeren Ansicht. Entferne dynamische Shortcuts aktiv per ShortcutManagerCompat.removeDynamicShortcuts(context, listOf("contact_42")), sobald das zugehörige Datenelement nicht mehr existiert.
Verknüpfe diese Logik am besten direkt mit deiner Repository-Schicht aus dem Data Layer: Wenn das Repository einen Eintrag löscht, entfernt es zugleich den entsprechenden Shortcut. Dieser Ansatz hält Daten und UI-Oberfläche konsistent, ohne dass du in höheren Schichten daran denken musst.
Stolperfalle: fehlende Intent-Action
Jeder Shortcut-Intent muss eine explizite Action gesetzt haben – etwa Intent.ACTION_VIEW oder eine eigene App-Action. Fehlt die Action, lehnt die API den Shortcut zur Laufzeit mit einer IllegalArgumentException ab. Das passiert schnell, wenn du einen Intent aus einer anderen Stelle im Code wiederverwendest, der ursprünglich ohne Action auskam.
Fazit
App Shortcuts sind ein kleines, aber wirkungsvolles Feature: Sie reduzieren die Reibung für wiederkehrende Aktionen und machen deine App im Launcher sichtbarer, ohne dass der Nutzer sie erst öffnen muss. Für den Einstieg lohnt es sich, zunächst einen einzigen statischen Shortcut für die wichtigste Kernfunktion deiner App zu definieren und ihn im Emulator per Long-Press zu testen. Danach kannst du dynamische Shortcuts ergänzen, die sich am tatsächlichen Nutzungsverhalten orientieren. Prüfe in einem Code-Review gezielt zwei Punkte: Werden veraltete Shortcuts zuverlässig entfernt, sobald die zugehörigen Daten verschwinden? Und besitzen alle Shortcut-Intents eine explizite Action? Diese zwei Fragen decken die häufigsten Laufzeitfehler in der Praxis ab.