MAD

0.0(0)
Studied by 0 people
call kaiCall Kai
learnLearn
examPractice Test
spaced repetitionSpaced Repetition
heart puzzleMatch
flashcardsFlashcards
GameKnowt Play
Card Sorting

1/112

encourage image

There's no tags or description

Looks like no tags are added yet.

Last updated 9:54 AM on 6/9/26
Name
Mastery
Learn
Test
Matching
Spaced
Call with Kai

No analytics yet

Send a link to your students to track their progress

113 Terms

1
New cards

Was ist Kotlin?

Moderne Programmiersprache, seit 2019 bevorzugte Sprache für Android-Apps, kompiliert zu Java-Bytecode (Java-kompatibel). Vorteile: expressive & concise, safer code (Null-Safety), interoperabel mit Java, Structured Concurrency

2
New cards

val vs var

val = read-only/immutable (z.B. val popcorn: Int = 5), var = mutable/veränderbar. Kotlin ist statisch typisiert; Immutabilität wird nicht erzwungen, aber empfohlen

3
New cards

Type Inference

Der Typ wird vom Compiler oft automatisch erkannt, z.B. var popcorn = 5 wird automatisch Int

4
New cards

Null Safety in Kotlin

Variablen können standardmäßig NICHT null sein. Drei Operatoren: Safe Call ?, Non-Null Assertion !!, Elvis ?:

5
New cards

Safe Call Operator ?

Erlaubt null und führt den Aufruf nur aus, wenn der Wert nicht null ist; sonst ergibt der Ausdruck null (keine NullPointerException). Bsp: var x: Int? = null

6
New cards

Non-Null Assertion !!

Erzwingt non-null und wirft eine NullPointerException, falls der Wert null ist

7
New cards

Elvis Operator ?:

Liefert einen Default-Wert, falls der linke Ausdruck null ist. Bsp: x?.dec() ?: 0

8
New cards

when (Kotlin)

Wie ein switch, aber mächtiger; kann auch als Expression einen Wert zurückgeben

9
New cards

Ranges in for-Loops

1..5 -> 12345;
5 downTo 1 -> 54321; 
3..6 step 2 -> 35; 
'd'..'g' -> defg

10
New cards

Collections: List, Set, Map

List = geordnet, Duplikate erlaubt; Set = ungeordnet, nur eindeutige Elemente; Map = Key-Value-Paare mit eindeutigen Keys

11
New cards

Read-only vs Mutable Collections

Read-only: listOf(), setOf(), mapOf(); Mutable: mutableListOf(), mutableSetOf(), mutableMapOf()

12
New cards

Lambda

Eine Funktion ohne Namen, z.B. { level: Int -> level / 2 }

13
New cards

Higher-Order Function

Eine Funktion, die eine Funktion als Parameter nimmt ODER eine Funktion zurückgibt. Function Type z.B. (Int) -> Int; Referenz auf benannte Funktion mit ::funcName

14
New cards

Last Parameter Call Syntax

Wenn der letzte Parameter einer Funktion eine Funktion ist, kann die Lambda außerhalb der Klammern (als Trailing Lambda) geschrieben werden, z.B. repeat(3) { println("Hello") }

15
New cards

Single-Expression Funktion

Kompakte Funktion mit = statt Body, z.B. fun double(x: Int): Int = x * 2

16
New cards

Unit-Funktion

Eine Funktion, die keinen sinnvollen Wert zurückgibt; der Return-Typ ist Unit (entspricht void)

17
New cards

Konstruktoren in Kotlin

Primary Constructor steht im Klassen-Header (z.B. class Circle(val radius: Double)); init { } läuft beim Erstellen (mehrfach möglich); sekundäre Konstruktoren mit constructor(…) müssen den primären via this(…) aufrufen; Default-Parameter ersetzen oft mehrere Konstruktoren

18
New cards

Extension Function

Fügt einer existierenden Klasse eine Funktion hinzu, ohne sie zu ändern. Bsp: fun Int.isOdd(): Boolean { return this % 2 == 1 }

19
New cards

Data Class

Klasse zum Speichern von Daten (Schlüsselwort data). Generiert automatisch: Getter/Setter, toString(), equals(), hashCode(), copy() und Destrukturierungs-Operatoren. Bsp: data class Player(val name: String, val score: Int)

20
New cards

Enum Class

User-definierter Typ mit festen Werten, z.B. enum class Color { RED, GREEN, BLUE }; Werte können auch Parameter haben

21
New cards

Object (Singleton)

Es gibt nur EINE Instanz. Statt class schreibt man object, z.B. object Calculator { fun add(a: Int, b: Int) = a + b }; Aufruf via Calculator.add(2, 4)

22
New cards

Companion Object

Alle Instanzen einer Klasse teilen sich diese Variablen/Funktionen (wie static in Java). Schlüsselwort companion; Zugriff via ClassName.property

23
New cards

Sealed Class

Schränkt Vererbung auf eine vordefinierte Menge von Subklassen ein, deren Typen zur Compile-Zeit bekannt sind. Mächtiger als Enums (jede Subklasse kann eigene Daten/Implementierung haben) und perfekt mit when (kein else nötig)

24
New cards

Vererbung in Kotlin

Single-Parent-Inheritance; Klassen sind final by default (mit open öffnen, um Vererbung zu erlauben); Überschreiben mit override; Interfaces erlauben Mehrfach-Implementierung

25
New cards

minSdk vs targetSdk

minSdk = minimale API-Version (möglichst viele Nutzer erreichen); targetSdk = neue Apps müssen die aktuellste Major-Version targeten (Google-Play-Anforderung)

26
New cards

Android Architektur (Layers von unten)

Linux Kernel -> HAL (Hardware Abstraction Layer) -> Native C/C++ Libraries + Android Runtime (ART) -> Java API Framework (Manager-Klassen) -> System Apps

27
New cards

Android Security Sandbox

Jede App ist ein eigener User und kann nur eigene Dateien lesen; jeder Prozess läuft in einer eigenen VM (Isolation)

28
New cards

Android SDK

Enthält alle Libraries und Tools für eine bestimmte Android-Version

29
New cards

App-Komponenten

Activity (Einstiegspunkt für User-Interaktion, ein Screen mit UI); Service (läuft im Hintergrund ohne UI, z.B. Musik); Broadcast Receiver (reagiert auf System-Events wie Akku schwach); Content Provider (verwaltet geteilte App-Daten, z.B. Kontakte)

30
New cards

Jetpack

Suite von Libraries für Best Practices, weniger Boilerplate, versionsübergreifend; "unbundled" (einzeln einbindbar); liegen im Namespace androidx.* (z.B. Compose, WorkManager, Room, Navigation, CameraX)

31
New cards

Jetpack Compose

Modernes deklaratives UI-Toolkit für Android. Vorteile: weniger Code, intuitiv, schnellere Entwicklung durch Wiederverwendung, Built-in Support für Material Design/Animationen/Themes

32
New cards

Imperativ vs Deklarativ

Imperativ (altes XML-System): XML-Layout + findViewById/setText, man sagt wie. Deklarativ (Compose): man sagt was man sehen will; Composables sind stateless, UI wird durch erneutes Aufrufen mit neuen Argumenten aktualisiert

33
New cards

Composable Function

Mit @Composable annotiert, nimmt Daten als Parameter, Rückgabetyp ist immer Unit. Bsp: @Composable fun Greeting(name: String) { Text("Hello $name") }

34
New cards

Layout-Komponenten in Compose

Column (vertikal anordnen), Row (horizontal anordnen), Box (übereinander stapeln)

35
New cards

Modifier

Kotlin-Objekte, die Composables dekorieren (Verhalten, Aussehen, User-Input verarbeiten) und Interaktionen definieren (clickable, scrollable, draggable, padding, fillMaxWidth)

36
New cards

3 Charakteristiken von Modifiern

Können geändert (changed), wiederverwendet (reused) und verkettet (chained) werden

37
New cards

LazyColumn vs Column

Column { items.forEach } für wenige Elemente ohne Scrollen; LazyColumn/LazyRow für viele/unbekannt viele Elemente, da nur sichtbare Items zusammengebaut werden (bessere Performance)

38
New cards

State (Compose)

Jeder Wert, der sich über die Zeit ändern kann (Counter, Scroll-Position, Progress). State bestimmt, was im UI angezeigt wird, und wird durch Events (Klick, Sensor, Netzwerk) geändert

39
New cards

Composition

Definiert, wie das UI aufgebaut wird, wenn Compose die Composable-Funktionen das erste Mal ausführt

40
New cards

Recomposition

Wenn sich beobachteter State ändert, ruft Compose die betroffenen Composables mit den neuen Werten erneut auf. Sie ist optimistisch (kann bei Parameteränderung abgebrochen/neu gestartet werden)

41
New cards

Skipping

Compose überspringt alle Composables, deren Eingabe-Parameter sich nicht geändert haben, und recomposed nur die wirklich betroffenen

42
New cards

mutableStateOf

Erzeugt ein observable State-Holder-Objekt, das Compose trackt; eine normale Variable löst KEINE Recomposition aus

43
New cards

remember

Erinnert sich an einen Wert über Recompositions hinweg (ohne remember würde der Wert bei jeder Recomposition zurückgesetzt)

44
New cards

rememberSaveable

Wie remember, überlebt aber zusätzlich Configuration Changes (z.B. Rotation)

45
New cards

by (Delegate in Compose)

Delegate, der direkten Zugriff auf den State-Wert ohne .value erlaubt, z.B. var name by remember { mutableStateOf("") }

46
New cards

Eigenschaften von Composables

Können in beliebiger Reihenfolge und parallel laufen, dürfen keine Side-Effects haben, können sehr häufig aufgerufen werden (z.B. jeder Animationsframe); Recomposition ist optimistisch und überspringt so viel wie möglich

47
New cards

State Hoisting

Pattern, bei dem State von einer Composable nach oben in den Caller verschoben wird -> Composable wird stateless. Statt interner Variable nutzt man value: T und onValueChange: (T) -> Unit

48
New cards

Vorteile von State Hoisting

Single Source of Truth (keine Duplikation), Shareable (von mehreren Composables nutzbar), Interceptable (Caller kann Events abfangen/ändern), Decoupled (State kann z.B. im ViewModel liegen)

49
New cards

3 Regeln des State Hoisting

1) State auf den lowest common parent aller Composables heben, die ihn lesen; 2) auf das höchste Level heben, auf dem er geändert wird; 3) zwei States, die auf dasselbe Event reagieren, auf dasselbe Level heben

50
New cards

Unidirektionaler Datenfluss (UDF)

State fließt nach unten, Events fließen nach oben

51
New cards

Navigation Back Stack

Stack von Destinations: Start-Screen ist die Basis (unten), aktueller Screen ist oben. Navigieren = Destination wird auf den Stack gepusht; Zurück = oberste Destination wird gepoppt. Der NavController verwaltet den Back Stack automatisch

52
New cards

Jetpack Navigation – 3 Hauptteile

NavController (navigiert zwischen Destinations via navController.navigate(route)); NavGraph (mappt Composables auf Routes); NavHost (Container-Composable, zeigt die aktuelle Destination)

53
New cards

Route vs Destination

Route = String, der eine Destination eindeutig identifiziert (wie eine URL); Destination = einzelnes Composable (oder Gruppe), das einen Screen darstellt

54
New cards

Warum Sealed Class statt Strings für Routes?

Strings sind tippfehleranfällig (Fehler erst zur Laufzeit); Enum/Sealed Class garantiert Compile-Time-Safety und Routes sind zentral und einfach refactorbar

55
New cards

Argumente in Navigation weitergeben

1) Placeholder in Route ("profile/{userId}"); 2) optional Typ via navArgument definieren; 3) Argument aus backStackEntry.arguments lesen; 4) beim Navigieren Wert übergeben (navController.navigate("profile/$userId"))

56
New cards

popBackStack inclusive

navController.popBackStack(route, inclusive): inclusive=true entfernt auch die angegebene Route, inclusive=false lässt sie stehen

57
New cards

AI Agents – Acceptance Bar

Vorschläge kritisch prüfen: korrekt? Failures behandelt? passt zum Architektur-Style? effizient?

58
New cards

AI Agents – Red Flags

Neue Dependencies, unsichere Patterns ("disable SSL"), catch(Exception) ohne Reaktion, viel Code für kleine Änderung, keine Tests, Blocking-Calls in async Code

59
New cards

AGENTS.md

Datei mit projektspezifischen Anweisungen, die der AI-Agent bei jeder Interaktion berücksichtigt (z.B. "Use ViewModels for business logic", "Use Hilt for DI")

60
New cards

Activity Lifecycle Callbacks

onCreate (erstellt), onStart (sichtbar), onResume (hat Fokus, interagierbar), onPause (verliert Fokus), onStop (nicht mehr sichtbar), onDestroy (zerstört)

61
New cards

Warum Lifecycle-aware?

Vermeidet Crashes (z.B. Anruf während Nutzung), spart System-Ressourcen (Kamera/Sensor stoppen im Hintergrund), verhindert Verlust des Fortschritts. Bsp: Standort-Updates stoppen, Buffering pausieren

62
New cards

Types of UI State & Logic

Screen UI State (anzuzeigende Daten, z.B. Artikel-Liste); UI Element State (Properties einzelner Elemente, z.B. expanded-Flag); Business Logic (Anforderungen an App-Daten, z.B. bookmarken+DB); UI Logic (wie State angezeigt wird, z.B. Card expandieren, Navigation)

63
New cards

ViewModel

Lifecycle-aware Komponente, die UI vom State trennt; Source of Truth für UI State; überlebt Configuration Changes; wird im Navigation-Backstack gecached und beim Verlassen aufgeräumt; gute Jetpack-Integration (Hilt, Navigation)

64
New cards

2 Aufgaben eines ViewModels

1) Zugriff auf Business Logic (oft via Repository); 2) App-Daten für die UI vorbereiten (UI State)

65
New cards

ViewModel – wichtige Regeln

Sollte keinen State aus Composables nehmen (lebt länger als die Composition); State muss trackbar sein (Compose State APIs wie mutableStateOf); im Composable via viewModel() oder hiltViewModel(); beim Konsumieren kein remember nötig

66
New cards

MVVM in Android

UI Layer = UI Elements + State Holders; UI State Management wird oft an ViewModels delegiert

67
New cards

ViewModel vs plain State Holder

Plain State Holder: UI Logic & UI Element State, überlebt KEINE Config Changes, im Composable erstellt+remembered. ViewModel: Screen UI State + Business-Logic-Zugriff, überlebt Config Changes, scoped an Activity/NavGraph

68
New cards

Lifecycle im ViewModel tracken

ViewModel implementiert DefaultLifecycleObserver (override onPause/onStart); im Composable via LocalLifecycleOwner.current + DisposableEffect den Observer hinzufügen/entfernen (onDispose)

69
New cards

3 Architektur-Prinzipien

Separation of Concerns (jeder Teil eine Aufgabe); Single Source of Truth (nur der Eigentümer verändert Daten, gibt sie immutable nach außen); Unidirectional Data Flow (State runter, Events rauf)

70
New cards

Architektur-Layer

UI Layer (Daten anzeigen, auf Interaktion reagieren); Domain Layer (optional, komplexe geteilte Business Logic / Use Cases); Data Layer (Business Logic, Daten erstellen/speichern/ändern)

71
New cards

Repository Pattern

Isoliert den Data Layer und ist dessen einziger Entry Point. Aufgaben: Daten bereitstellen, Änderungen zentralisieren, Konflikte zwischen Sources auflösen, Sources abstrahieren, Business Logic enthalten. Andere Layer dürfen NIEMALS direkt auf Data Sources zugreifen; Daten werden immutable nach außen gegeben

72
New cards

Data Source

Arbeitet je mit genau EINER Quelle (File, API oder lokale DB); ein Repository kann mehrere Data Sources kombinieren

73
New cards

Threading / main-safe

Aufrufe an Repos/Data Sources sollten main-safe sein; lange Operationen auf Background-Threads auslagern (Coroutines, suspend); Datenänderungen via Kotlin Flow beobachten

74
New cards

Storage Types in Android

App-specific Storage (nur diese App, intern verschlüsselt oder extern); Shared Storage (mit anderen Apps geteilt, via MediaStore-API); Preferences (SharedPreferences, Key-Value); Databases (strukturierte Daten, SQLite + Room)

75
New cards

SharedPreferences

Privater Key-Value-Storage für kleine, primitive User-Settings (z.B. "theme" -> "dark"). Zugriff via getPreferences + edit() + putInt(…) + apply()

76
New cards

Room

Jetpack-Library und Wrapper über SQLite. Vorteile: vereinfachtes Setup, Arbeit mit Data Classes, Compile-Time-Verifikation von SQL-Queries, annotation-basiert (weniger Boilerplate)

77
New cards

3 Hauptkomponenten von Room

Entity (repräsentiert eine Tabelle), DAO/Data Access Object (Methoden für CRUD-Operationen), Database (stellt DAO-Instanzen bereit)

78
New cards

Entity (Room)

Mit @Entity(tableName="…") annotierte Data Class; @PrimaryKey markiert den Schlüssel; @ColumnInfo(name="…") benennt eine Spalte um

79
New cards

DAO (Data Access Object)

Interface mit @Dao, das die CRUD-Methoden für den DB-Zugriff definiert. Room generiert die Implementierung zur Compile-Zeit und prüft alle SQL-Queries. Kann Flow zurückgeben für Live-Updates

80
New cards

Room-Annotationen

@Insert/@Update/@Delete sind Convenience-Annotationen (kein eigenes SQL nötig); @Query("…") für eigenes SQL; lange Operationen als suspend; Stream-Beobachtung gibt Flow

81
New cards

TypeConverters

Wenn Room einen Typ (z.B. Liste, Date) nicht unterstützt, schreibt man Converter-Methoden mit @TypeConverter und bindet sie via @TypeConverters(Converters::class) in die DB-Klasse ein

82
New cards

Data Layer einbauen – Schritte

1) Modell mit @Entity annotieren; 2) DAO-Interface mit CRUD + @Dao erstellen; 3) abstrakte DB-Klasse mit @Database (Entity + DAO verbinden); 4) Repository erstellen, das das DAO injectet

83
New cards

Dependency Injection (DI)

Klassen brauchen Referenzen auf andere Klassen (Dependencies). Statt sie selbst zu erzeugen, werden sie injiziert (als Parameter übergeben). Manuelle DI = viel Boilerplate; Libraries wie Hilt automatisieren das

84
New cards

Hilt

Offizielle DI-Lösung für Android (static, compile time). Reduziert DI-Boilerplate massiv und funktioniert nahtlos mit ViewModels

85
New cards

Hilt – Setup-Schritte

1) Application-Klasse mit @HiltAndroidApp; 2) Activities mit @AndroidEntryPoint; 3) ViewModels mit @HiltViewModel + @Inject constructor; 4) Hilt-Modul (@Module + @InstallIn) für nicht direkt injectbare Klassen (Room-DB, Retrofit); 5) im Composable hiltViewModel()

86
New cards

Hilt-Annotationen

@HiltAndroidApp (Application), @AndroidEntryPoint (Activity), @HiltViewModel (+@Inject constructor), @Module + @InstallIn (Modul), @Provides/@Singleton (bereitstellen)

87
New cards

Hilt – Vorteile

Weniger Boilerplate (kein ViewModelProvider.Factory mehr), automatische Injection, bessere Testbarkeit (Mocks), Lifecycle-Management, offizieller Android-Support

88
New cards

Retrofit

Library für RESTful APIs: mappt URI & HTTP-Methode auf Kotlin-Funktionen und JSON-Antworten auf Kotlin-Objekte. API-Methoden werden in einem Interface mit @GET/@Query etc. definiert

89
New cards

DTO & Mapping

Wenn API-Response und DB-Entity sich unterscheiden, schreibt man ein DTO + Mapping-Funktion (z.B. fun QuestionResponse.toQuestion(): Question)

90
New cards

Coroutine

Concurrency-Pattern zur Vereinfachung von async Code; verhindert, dass lange Tasks den Main-Thread blockieren. Im ViewModel via viewModelScope.launch { }

91
New cards

Suspend Function

Funktion, die blockieren kann und nur innerhalb einer Coroutine aufrufbar ist. Bsp: suspend fun expensiveComputation() { delay(1000L) }

92
New cards

Flow

Stream von Daten, der asynchron mehrere Werte über die Zeit emittiert. Wird in Coroutines konsumiert; ideal für Live-Updates aus DB oder Netzwerk (passt gut zu Room)

93
New cards

3 Teile eines Flow

Producer (erzeugt Werte, emit(…)); Intermediate Operators (verändern/filtern lazy: map, filter, onEach); Terminal Operator/Consumer (startet & konsumiert den Flow, z.B. collect { })

94
New cards

Flow in Jetpack

Room-DAO kann Flow

95
New cards

Netzwerk-Permissions (AndroidManifest)

und ACCESS_NETWORK_STATE
96
New cards

Pair Programming – Driver

Hat die Tastatur, fokussiert sich auf das aktuelle kleine Ziel und spricht laut über das, was er gerade macht

97
New cards

Pair Programming – Navigator

Beobachtet, reviewed Code on-the-go, denkt mittel- bis langfristig und notiert nächste Schritte / mögliche Probleme. Rollen regelmäßig wechseln!

98
New cards

Pair Programming – Vorteile

Wissens-Sharing, Reflektion, Code Review on-the-go, höhere Fokussiertheit, 2 Denkmodi parallel, Collective Code Ownership, weniger WIP -> höhere Qualität & besserer Team-Flow

99
New cards

ExoPlayer & Lifecycle (Altklausur)

Player in onStart()/onResume() initialisieren bzw. wieder anhängen, in onStop()/onPause() pausieren und mit player.release() freigeben. Playback-Position im ViewModel halten, damit sie Config Changes überlebt und kein Memory Leak / Crash bei Rotation entsteht

100
New cards

Warum nicht auf dem Main-Thread? (Data Layer)

Der Main-/UI-Thread zeichnet UI und verarbeitet Eingaben und muss frei bleiben (~60 fps). DB-Queries und Netzwerk-Requests sind blockierende Langläufer -> sie würden den Thread blockieren (UI friert ein, ANR-Dialog, Crash). Deshalb main-safe via Coroutines/Dispatchers.IO