Skip to content

Commit a8bb1e5

Browse files
committed
add files
1 parent 81441ce commit a8bb1e5

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

66 files changed

+2573
-42
lines changed

asciidocs/android-1.adoc

Lines changed: 359 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,359 @@
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

Comments
 (0)