Skip to content

Latest commit

 

History

History
346 lines (276 loc) · 8.31 KB

documentation.adoc

File metadata and controls

346 lines (276 loc) · 8.31 KB

Übung-Android Cao Anton

Aufgabe 1: Basisprojekt erstellen

  • Es wird ein neues Android-Projekt erstellt und das Tutorial vom Herr Professor Stütz (Android-Tutorial) gemacht

Projekt erstellen

  • Neues Projekt mithilfe von Android Studio erstellen

Dependencies hinzufügen und konfigurieren

build.gradle.kts
plugins {
    alias(libs.plugins.android.application)
    alias(libs.plugins.jetbrains.kotlin.android)
    alias(libs.plugins.kotlinAndroidKsp)
    alias(libs.plugins.hiltAndroid)
}

android {
    namespace = "at.htl.todo"
    compileSdk = 34

    defaultConfig {
        applicationId = "at.htl.todo"
        minSdk = 30
        targetSdk = 34
        versionCode = 1
        versionName = "1.0"

        testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner"
        vectorDrawables {
            useSupportLibrary = true
        }
    }

    buildTypes {
        release {
            isMinifyEnabled = false
            proguardFiles(
                getDefaultProguardFile("proguard-android-optimize.txt"),
                "proguard-rules.pro"
            )
        }
    }
    compileOptions {
        sourceCompatibility = JavaVersion.VERSION_17
        targetCompatibility = JavaVersion.VERSION_17
    }
    kotlinOptions {
        jvmTarget = "17"
    }
    buildFeatures {
        compose = true
    }
    composeOptions {
        kotlinCompilerExtensionVersion = "1.5.13"
    }
    packaging {
        resources {
            excludes += "/META-INF/{AL2.0,LGPL2.1}"
            excludes += "/META-INF/INDEX.LIST"
            excludes += "/META-INF/DEPENDENCIES"
            excludes += "/META-INF/LICENSE.md"
            excludes += "/META-INF/NOTICE.md"
        }
    }
}

dependencies {

    implementation(libs.androidx.core.ktx)
    implementation(libs.androidx.lifecycle.runtime.ktx)
    implementation(libs.androidx.activity.compose)
    implementation(platform(libs.androidx.compose.bom))
    implementation(libs.androidx.ui)
    implementation(libs.androidx.ui.graphics)
    implementation(libs.androidx.ui.tooling.preview)
    implementation(libs.androidx.material3)
    testImplementation(libs.junit)
    androidTestImplementation(libs.androidx.junit)
    androidTestImplementation(libs.androidx.espresso.core)
    androidTestImplementation(platform(libs.androidx.compose.bom))
    androidTestImplementation(libs.androidx.ui.test.junit4)
    debugImplementation(libs.androidx.ui.tooling)
    debugImplementation(libs.androidx.ui.test.manifest)

    // RxJava
    implementation (libs.rxjava)
    implementation(libs.rxandroid)
    implementation(libs.androidx.runtime.rxjava3)

    // Hilt
    implementation(libs.hilt.android)
    ksp(libs.hilt.compiler)

    // Jackson
    implementation(libs.jackson.databind)

    // Resteasy
    implementation(libs.resteasy.client)

    // SmallRye Config
    //implementation("org.eclipse.microprofile.config:microprofile-config-api:3.1") // for application.properties config loader
    implementation(libs.smallrye.config)

}
  • Die Java und Kotlin Versionen wurden auf 17 bzw. 1.5.13 erhöht

  • RxJava: reaktives Programmieren fürs Android

  • Hilt bzw. KSP: Dependency Injection

  • Jackson und Resteasy: für REST

  • Smallrye Config: wird für application.properties benötigt

bei libs.versions.toml werden die Versionen und Konfigurationen hinzugefügt

Starten der Applikation

  • Die Applikation beginnt bei TodoApplication

package at.htl.todo;

import android.app.Application;
import android.util.Log;

import javax.inject.Singleton;
import dagger.hilt.android.HiltAndroidApp;

@HiltAndroidApp // (1)
@Singleton
public class TodoApplication extends Application {
    static final String TAG = TodoApplication.class.getSimpleName();

    @Override
    public void onCreate() {
        super.onCreate();
        Log.i(TAG, "App started"); // (2)
    }
}
  1. Dependency Injection von Hilt

  2. dient zum Loggen, ob die App wirklich hier gestartet worden ist

Vor dem ersten Start muss die Zeile android:name=".TodoApplication" in AndroidManifest.xml hinzugefügt werden

Anzeigen in Android

  • Name der MainActivity geändert

  • MainView.kt in layout verschoben

package at.htl.todo.ui.layout

import androidx.activity.ComponentActivity
import androidx.activity.compose.setContent
import androidx.activity.enableEdgeToEdge
import androidx.compose.foundation.layout.fillMaxSize
import androidx.compose.foundation.layout.padding
import androidx.compose.material3.Scaffold
import androidx.compose.material3.Text
import androidx.compose.runtime.Composable
import androidx.compose.ui.Modifier
import androidx.compose.ui.platform.ComposeView
import androidx.compose.ui.tooling.preview.Preview
import at.htl.todo.ui.theme.TodoTheme
import javax.inject.Inject
import javax.inject.Singleton

@Singleton // (1)
class MainView {

    @Inject // (2)
    constructor(){}

    fun buildContent(activity: ComponentActivity) { // (3)
        activity.enableEdgeToEdge()
        activity.setContent {
            TodoTheme {
                Scaffold(modifier = Modifier.fillMaxSize()) { innerPadding ->
                    Greeting(
                        name = "Android",
                        modifier = Modifier.padding(innerPadding)
                    )
                }
            }
        }
    }
}

@Composable
fun Greeting(name: String, modifier: Modifier = Modifier) {
    Text(
        text = "Hello $name!",
        modifier = modifier
    )
}

@Preview(showBackground = true)
@Composable
fun GreetingPreview() {
    TodoTheme {
        Greeting("Android")
    }
}
  1. In Android die Dependency Injection

  2. Constructor Injection

  3. eine Methode, die den Content für Android baut → wird dann in der MainActivity aufgerufen

ℹ️
In der AndroidManifest.xml in <activity></activity> die android:name=".MainActivity" hinzufügen

Util

Begrifflichkeiten bzw. was ist der Zweck dieser Util:

  • Immer: Immer

  • Mapper:

    • Marshalling/Unmarshalling von Java-Objekten

    • Deep-Clones

  • resteasy: für REST

  • Store:

    • BehaviorSubject: speichert immer aktuellsten Wert, der dann an die Subscriber übermittelt

    • Immer

  • Config-Dateien: für Smallrye

application.properties

  • neuer Ordner assets erstellen

  • application.properties erstellen

application.properties
json.placeholder.baseurl=https://jsonplaceholder.typicode.com

Mit der URL holen wir die Beispielsdaten mittels REST her

Store und Model

  • Prinzip mit Single Source of Truth → beim Model werden die Daten hier verwaltet

Klasse Todo
link:todo/app/src/main/java/at/htl/todo/model/Todo.java[role=include]
Klasse Model
link:todo/app/src/main/java/at/htl/todo/model/Model.java[role=include]
Klasse ModelStore
link:todo/app/src/main/java/at/htl/todo/model/ModelStore.java[role=include]
  1. Vererbung von Store mit Model.

Klasse Store
link:todo/app/src/main/java/at/htl/todo/util/store/Store.java[role=include]

Todo anzeigen

MainView.kt
link:todo/app/src/main/java/at/htl/todo/ui/layout/MainView.kt[role=include]
  • Hier werden die Beispielsdaten in einer einfachen View gezeigt

Daten mittels REST holen

REST-Client
link:todo/app/src/main/java/at/htl/todo/model/TodoClient.java[role=include]
Server
link:todo/app/src/main/java/at/htl/todo/model/TodoService.java[role=include]
MainActivity.java
link:todo/app/src/main/java/at/htl/todo/MainActivity.java[role=include]
  • Mit todoService.getAll() werden die Daten geholt

in AndroidManifest.xml muss noch <uses-permission android:name="android.permission.INTERNET"/> hinzugefügt werden, sonst hat man keinen Zugriff aufs Internet mit Android
AndroidManifest.xml
link:todo/app/src/main/AndroidManifest.xml[role=include]