|
| 1 | += Android - Course - 1 - Introduction |
| 2 | +ifndef::imagesdir[:imagesdir: images] |
| 3 | +:icons: font |
| 4 | +:source-highlighter: highlight.js |
| 5 | +:experimental: |
| 6 | +:sectnums: |
| 7 | +:toc: |
| 8 | +ifdef::backend-html5[] |
| 9 | + |
| 10 | +// https://fontawesome.com/v4.7.0/icons/ |
| 11 | +icon:file-text-o[link=https://raw.githubusercontent.com/UnterrainerInformatik/documents/main/asciidocs/{docname}.adoc] |
| 12 | +icon:github-square[link=https://github.com/UnterrainerInformatik/documents] |
| 13 | +endif::backend-html5[] |
| 14 | + |
| 15 | +link:https://htl.unterrainer.info/index.html[BACK to Index] |
| 16 | + |
| 17 | +link:https://htl.unterrainer.info/android.html[BACK to Android - Course] |
| 18 | + |
| 19 | +== Grundlagen Android-Entwicklung |
| 20 | + |
| 21 | +image:android-1-0.png[align="center",width="100%"] |
| 22 | + |
| 23 | +=== Was ist Android? |
| 24 | +- OS- und Programmierplattform von Google für mobile Geräte entwickelt. |
| 25 | +- Basiert auf Linux-Kernel und Java |
| 26 | + |
| 27 | +image:android-1-1.png[align="center",width="100%"] |
| 28 | + |
| 29 | +=== Warum Android? |
| 30 | +- Populärste Plattform für mobile Apps |
| 31 | +- Einfach zu entwickelnde Apps |
| 32 | +- Viele Verteilungsmöglichkeiten |
| 33 | + |
| 34 | +=== Wie funktioniert Android? |
| 35 | +image:android-1-2.png[align="center",width="50%"] |
| 36 | + |
| 37 | +. Deine Apps leben hier zusammen mit den System-Apps (E-Mail, SMS, ...) |
| 38 | +. UI Komponenten, Ressourcen-Management, Lifecycle-Management. Stellt native Bibliotheken für die App zur Verfügung. |
| 39 | +. Jede App läuft in ihrer eigenen Instanz der Android Runtime. |
| 40 | +. Stellt Hardware-Abstraktionen zur Verfügung. Jede App hat Zugriff auf die Hardware, aber nur über die API. |
| 41 | +. Foundation. Kümmert sich um threading, low-level memory management, etc... |
| 42 | + |
| 43 | +== Android Studio IDE |
| 44 | +Installation unter: link:https://developer.android.com/studio/install[https://developer.android.com/studio/install] |
| 45 | + |
| 46 | +==== |
| 47 | +IMPORTANT: Hausübung: |
| 48 | +Installieren und auf die neueste Version updaten. |
| 49 | +==== |
| 50 | + |
| 51 | +== Kotlin Grundzüge |
| 52 | +=== Kotlin |
| 53 | +image:android-1-3.png[align="center",width="100%"] |
| 54 | + |
| 55 | +Seit 2019 ist Kotlin die bevorzugte Programmiersprache für Android-Apps bei Google |
| 56 | +Seitdem ist die Sprache sehr populär geworden |
| 57 | + |
| 58 | +=== Java vs. Kotlin |
| 59 | +==== Null Safety |
| 60 | +|=== |
| 61 | +|Java |Kotlin |
| 62 | + |
| 63 | +a|Jedes Objekt ist null by default |
| 64 | +[java] |
| 65 | +---- |
| 66 | +public Integer number; |
| 67 | +---- |
| 68 | + |
| 69 | +a|Kein Objekt kann null werden |
| 70 | +[source,kotlin] |
| 71 | +---- |
| 72 | +val number: Int |
| 73 | +---- |
| 74 | +...außer man gibt es so an: |
| 75 | +[source,kotlin] |
| 76 | +---- |
| 77 | +val number: Int? = null |
| 78 | +---- |
| 79 | +|=== |
| 80 | + |
| 81 | +==== Extension Functions |
| 82 | +|=== |
| 83 | +|Java |Kotlin |
| 84 | + |
| 85 | +a|Ohne Erweiterung (z.B. Project Lombok) nicht verfügbar. (Ev. noch über Vererbung... Aber nicht jedes zu erweiternde Projekt gehört auch euch.) |
| 86 | + |
| 87 | +a|Standardmäßig in die Sprache eingebaut. Einfach den Funktionsnamen in jedem beliebigen File mit dem jeweiligen Klassennamen prefixen. |
| 88 | +[source,kotlin] |
| 89 | +---- |
| 90 | +fun String.removeFirstLastChar(): String = this.substring(1, this.length - 1) |
| 91 | +
|
| 92 | +fun main(args: Array<String>) { |
| 93 | + val myString= "Hello Everyone" |
| 94 | + val result = myString.removeFirstLastChar() |
| 95 | + println("First character is: $result") |
| 96 | +} |
| 97 | +---- |
| 98 | +|=== |
| 99 | + |
| 100 | +==== Code |
| 101 | +|=== |
| 102 | +|Java |Kotlin |
| 103 | +a|* Eher ausführlich (getter, setter). |
| 104 | +* Gibts schon länger als so manches modernes Sprachkonstrukt (z.B. async). |
| 105 | +a|* Sehr kompakt. |
| 106 | +* Weniger Lines Of Code. |
| 107 | + |
| 108 | +=> Besser zu erstellen, lesen und zu warten. |
| 109 | +|=== |
| 110 | + |
| 111 | +==== Coroutines |
| 112 | +|=== |
| 113 | +|Java |Kotlin |
| 114 | + |
| 115 | +a|Background Threads. (z.B.: ExecutorService) |
| 116 | + |
| 117 | +a|* Eigener Threadpool |
| 118 | +* In Sprache fix eingebaut |
| 119 | + |
| 120 | +[source,kotlin] |
| 121 | +---- |
| 122 | +fun main() = runBlocking { // this: CoroutineScope |
| 123 | + launch { // launch a new coroutine and continue |
| 124 | + delay(1000L) // non-blocking delay for 1 second |
| 125 | + println("World!") // print after delay |
| 126 | + } |
| 127 | + println("Hello") // main coroutine continues |
| 128 | +} |
| 129 | +---- |
| 130 | + |
| 131 | +Output: |
| 132 | +Hello |
| 133 | +World! |
| 134 | + |
| 135 | +|=== |
| 136 | + |
| 137 | +==== Data Classes |
| 138 | +|=== |
| 139 | +|Java |Kotlin |
| 140 | + |
| 141 | +a|* Händisch (viel Code oder generiert) |
| 142 | +* Durch Verwendung von Project Lombok |
| 143 | + |
| 144 | +a|* Ein eingebautes Sprachkonstrukt |
| 145 | +* Getter, Setter, HashCode(), Equals(), toString()... werden automatisch implementiert. |
| 146 | +|=== |
| 147 | + |
| 148 | +==== Smart Casts |
| 149 | +|=== |
| 150 | +|Java |Kotlin |
| 151 | + |
| 152 | +a|Entwickler muss die Typen überprüfen und angeben. |
| 153 | +a|* Casting Checks werden automatisch durchgeführt (smart casts feature). |
| 154 | +* Redundante Checks werden entfernt. |
| 155 | +|=== |
| 156 | + |
| 157 | +==== No Checked Exceptions |
| 158 | +|=== |
| 159 | +|Java |Kotlin |
| 160 | + |
| 161 | +a|Es gibt checked Exceptions. |
| 162 | + |
| 163 | +(Meiner Meinung nach ist das eine gute Sache) |
| 164 | +a|Es gibt keine checked Exceptions. |
| 165 | + |
| 166 | +(Meiner Meinung nach eine schlechte Sache, weil ... nun ... exception handling ist wichtig und sollte nicht optional sein.) |
| 167 | +|=== |
| 168 | + |
| 169 | +==== Higher-Order Funcs und Lambdas |
| 170 | +|=== |
| 171 | +|Java |Kotlin |
| 172 | + |
| 173 | +a|In abgespeckter Form verfügbar oder mit alten Sprachkonstrukten nachgebaut. |
| 174 | +a|Inherent in Sprache enthalten. |
| 175 | + |
| 176 | +[source,kotlin] |
| 177 | +---- |
| 178 | +max(strings, { a, b -> a.length < b.length }) |
| 179 | +
|
| 180 | +/** |
| 181 | +The function max is a higher-order function, |
| 182 | +as it takes a function value as its second argument. |
| 183 | +This second argument is an expression that is itself a function, |
| 184 | +called a function literal, |
| 185 | +which is equivalent to the following named function: |
| 186 | +**/ |
| 187 | +
|
| 188 | +fun compare(a: String, b: String): Boolean = a.length < b.length |
| 189 | +---- |
| 190 | +|=== |
| 191 | + |
| 192 | + |
| 193 | +=== Übung |
| 194 | +Spielwiese unter: link:https://play.kotlinlang.org/koans/overview[https://play.kotlinlang.org/koans/overview] |
| 195 | + |
| 196 | +==== |
| 197 | +IMPORTANT: Hausübung: Alle Aufgaben auf dieser Seite links durchmachen. |
| 198 | +Android-Studio herunterladen: https://developer.android.com/studio/releases |
| 199 | +==== |
| 200 | + |
| 201 | +== Komponenten einer Android-App |
| 202 | + |
| 203 | +=== AndroidManifest.xml |
| 204 | +Jedes Android-App-Projekt muss dieses File im Root des Projekt-Source-Sets enthalten. |
| 205 | +Es enthält wichtige Informationen über die App für: |
| 206 | + |
| 207 | +- Build Tools |
| 208 | +- The Android Operating System |
| 209 | +- Google Play |
| 210 | + |
| 211 | +Ist eine XML-Datei, die die Struktur der App beschreibt. Ist XML, damit sie leichter von Menschen gelesen und ohne Editor geändert werden kann. |
| 212 | +Wird beim Kompilieren in ein binäres Format übersetzt (wegen Geschwindigkeit). |
| 213 | + |
| 214 | +Es enthält Informationen über die Applikation: |
| 215 | + |
| 216 | +* functions |
| 217 | +* services |
| 218 | +* broadcast receivers |
| 219 | +* content producers |
| 220 | +* components |
| 221 | +* The apps permissions |
| 222 | +* The apps rights (permissions, die andere Apps brauchen werden, damit sie von eurer App Daten bekommen können.) |
| 223 | + |
| 224 | +=== Application Components |
| 225 | +image:android-1-4.png[align="center",width="80%"] |
| 226 | + |
| 227 | +image:android-1-5.png[align="center",width="100%"] |
| 228 | + |
| 229 | +* Fragments |
| 230 | + |
| 231 | +Teile einer Maske, die innerhalb einer Activity verwendet werden können. |
| 232 | + |
| 233 | +* Views und ViewGroups |
| 234 | + |
| 235 | +Views sind GUI-Elemente. ViewGroups sind Container für Views. |
| 236 | + |
| 237 | +* Layouts |
| 238 | + |
| 239 | +XML Files, die die Struktur der Activities, Fragments und ViewGroups beschreiben. |
| 240 | + |
| 241 | +* Resources |
| 242 | + |
| 243 | +Images, Strings, UI Layouts... |
| 244 | + |
| 245 | +* Manifest |
| 246 | + |
| 247 | +Explained above. |
| 248 | + |
| 249 | +== Meine erste Android-App |
| 250 | +Erstmal Android Studio herunterladen und installieren, falls dies nicht schon erfolgt ist. https://developer.android.com/studio/releases |
| 251 | + |
| 252 | +== Jetpack Compose |
| 253 | + |
| 254 | +Modernes UI Toolkit für Android-Entwicklung. |
| 255 | +Reactive Programming Model. |
| 256 | +Verwendet Kotlin Sprachkonstrukte. |
| 257 | +Vollständig deklarativ wie flutter, Swift UI oder React Native (sag ihm WAS du willst, nicht WIE du es willst). |
| 258 | + |
| 259 | +...beschreibt die UI als Funktion, die Daten in eine UI-Hierarchie transformiert |
| 260 | +...wenn sich die Daten ändern, ruft das Framework diese Funktionen automatisch auf und aktualisiert so die UI |
| 261 | + |
| 262 | +image:android-1-7.png[align="center",width="100%"] |
| 263 | + |
| 264 | +=== Mein erster Knopf in Jetpack-Compose |
| 265 | +image:android-1-6.png[align="center",width="80%"] |
| 266 | + |
| 267 | +==== Neues Projekt anlegen |
| 268 | + |
| 269 | +In der Android Studio IDE, ist ein Projekt-Template eine Android-App, die alle notwendigen Teile hat, um eine Applikation zu erstellen. |
| 270 | +Es hilft dir, ein neues Projekt einzurichten. |
| 271 | + |
| 272 | +Schritt für Schritt werden wir unsere erste Android-App erstellen und sie auf dem Emulator starten: |
| 273 | + |
| 274 | +1. Android Studio starten, indem du auf das Android Studio Icon in deinem Dock oder wo auch immer du Android Studio gespeichert hast, klickst. |
| 275 | + |
| 276 | +2. Wenn Android Studio startet, klicke auf "Start a new Android Studio project" am Welcome-Screen. |
| 277 | +Alternativ kannst Du auch auf File und dann New Project klicken. |
| 278 | + |
| 279 | +3. Klicke auf "Empty Activity" und klicke dann auf Next. (Compose ist inzwischen Standard) |
| 280 | + |
| 281 | +image:android-1-8.png[align="center",width="100%"] |
| 282 | + |
| 283 | +Wenn der leere Compose Activity Screen geladen hat, wirst Du Felder sehen, wie 'Name', 'Package name', 'Save location', 'Language', und 'Minimum SDK'. |
| 284 | +Für dieses Kapitel nennen wir unser Projekt 'Android Community' und lassen die anderen Einstellung in Ruhe. |
| 285 | +Die Sprache ist per Voreinstellung auf Kotlin. |
| 286 | +Minimum SDK ist API 21: Android 5.0 (Lollipop). Das ist die minimale Version von Android, auf der unsere App laufen können wird. |
| 287 | +In diesem Fall wird unser Projekt auf ca. 98.8% aller Android-Geräte laufen können. |
| 288 | +Die Einstellungen im Bild unten, wie der Name und das Package, sind nur Beispiele. Du kannst Deine eigenen Werte eingeben oder es einfach so lassen, wie es voreingestellt ist. |
| 289 | + |
| 290 | +image:android-1-9.png[align="center",width="100%"] |
| 291 | + |
| 292 | +Jetzt auf 'Finish' klicken. |
| 293 | + |
| 294 | +Jetzt kannst Du Dich ein wenig in den Packages umsehen. Dir wird auffallen, dass es eine 'MainActivity' Klasse gibt, die von 'Activity' ableitet. |
| 295 | +Darin gibt es eine fun (Function) 'onCreate', die eine Methode in 'ComponentActivity' überlädt. |
| 296 | + |
| 297 | +Du wirst auch eine Funktion 'setContent' sehen, die den Inhalt einer Composable Funktion setzt. |
| 298 | +Sie nimmt einen Lambda-Ausdruck, die die Elemente enthält, die angezeigt werden sollen. In unserem Fall enthält er das Theme unserer Applikation. |
| 299 | + |
| 300 | +In der 'Greeting' Funktion werden wir jetzt unsere eigene Grußformel "Hello, Android |
| 301 | +Community" einsetzen und das Programm ausführen (run). |
| 302 | + |
| 303 | +[source,kotlin] |
| 304 | +---- |
| 305 | +class MainActivity : ComponentActivity() { |
| 306 | + override fun onCreate(savedInstanceState:Bundle?) { |
| 307 | + super.onCreate(savedInstanceState) |
| 308 | + setContent { |
| 309 | + AndroidCommunityTheme { |
| 310 | + Surface( |
| 311 | + modifier = Modifier.fillMaxSize(), |
| 312 | + color = MaterialTheme.colors.background |
| 313 | + ) { |
| 314 | + Greeting("Hello, Android Community") |
| 315 | + } |
| 316 | + } |
| 317 | + } |
| 318 | + } |
| 319 | +} |
| 320 | +---- |
| 321 | + |
| 322 | + |
| 323 | + |
| 324 | +== Android Project Structure |
| 325 | +image:android-1-10.png[align="center",width="50%"] |
| 326 | +Das ist das Projekt-Root-Verzeichnis. Es enthält alle Dateien, die für das Projekt wichtig sind. |
| 327 | + |
| 328 | +=== Manifest Ordner |
| 329 | +Der Manifest-Ordner ist die Quelle der Wahrheit für die Android-App; er enthält AndroidManifest.xml. |
| 330 | +Klicke auf AndroidManifest.xml, um es zu öffnen und Dir den Inhalt anzusehen. |
| 331 | + |
| 332 | +image:android-1-11.png[align="center",width="100%"] |
| 333 | +Das Java-Verzeichnis enthält alle Kotlin- (.kt) und Java-Dateien (.java), die wir erstellen, wenn wir unsere Android-Apps erstellen. |
| 334 | +Beispielsweise, im nächsten Bild, haben wir ein Package mit (androidTest) und (test), und hier fügen wir unsere Tests hinzu. |
| 335 | +Klicke einfach einmal alle Verzeichnisse durch um deren Inhalt zu sehen. |
| 336 | + |
| 337 | +image:android-1-12.png[align="center",width="100%"] |
| 338 | +Im AndroidTest-Verzeichnis haben wir unsere UI-Tests, und im Test-Verzeichnis haben wir unsere Unit-Tests. |
| 339 | +Unit-Tests testen kleine Teile unseres Codes, um sicherzustellen, dass das gewünschte Verhalten wie erwartet ist. |
| 340 | +Test-Driven Development (TDD) ist während der App-Entwicklung hervorragend und wertvoll. |
| 341 | +Einige Unternehmen folgen dieser Regel, andere nicht. Aber grundsätzlich ist es eine gute Praxis, den Code immer zu testen. |
| 342 | + |
| 343 | +Das res-Verzeichnis enthält XML-Layouts, UI-Strings, drawable-Images und Mipmap-Icons. |
| 344 | +Auf der anderen Seite enthält das values-Verzeichnis viele nützliche XML-Dateien wie Dimensionen, Farben und Themes. |
| 345 | +Klicke auf das res-Verzeichnis, um Dich mit dem vertraut zu machen, was dort ist, da wir es im nächsten Kapitel verwenden werden. |
| 346 | + |
| 347 | +image:android-1-13.png[align="center",width="100%"] |
| 348 | +Zuletzt, im Gradle-Scripts Verzeichnis, haben wir die build-Konfiguration, die die beschreiben auf welche Art unser Projekt gebaut werden soll für unser Projekt enthalten. |
| 349 | +Es ist in Module aufgeteilt und die Einträge in der obersten Datei gelten für alle Module. |
| 350 | + |
| 351 | +Ein Modul ist eine Sammlung von Source-Dateien und Build-Einstellungen, die es Dir ermöglichen, Dein Projekt in verschiedene Einheiten mit bestimmten Zwecken zu unterteilen. |
| 352 | + |
| 353 | +== Deine App mit Gradlew laufen lassen |
| 354 | + |
| 355 | +Zuerst mal die installierte Gradle-Version checken mit ./gradlew (GradleWrapper). |
| 356 | + |
| 357 | +Mit ./gradlew clean und ./gradlew build kannst Du Dein Projekt bauen. |
| 358 | + |
| 359 | +Ansonsten kannst Du auch einfach auf den grünen Pfeil in der IDE klicken. |
0 commit comments