Android Project Structure and Activity

Project Layout

A new Android Studio project ("Empty Activity" template) uses Kotlin, Jetpack Compose and Gradle Kotlin DSL with a version catalog.

MyShop/
├─ settings.gradle.kts          modules list + repositories
├─ build.gradle.kts             root: plugin versions
├─ gradle/libs.versions.toml    version catalog (all library versions in one place)
└─ app/
   ├─ build.gradle.kts          app module: sdk versions, dependencies
   └─ src/
      ├─ main/
      │  ├─ AndroidManifest.xml  app name, permissions, activities
      │  ├─ java/com/example/myshop/
      │  │  ├─ MainActivity.kt
      │  │  ├─ ui/              screens, composables, theme
      │  │  ├─ data/            Room, Retrofit, repositories
      │  │  └─ domain/          models, use cases
      │  └─ res/                 strings, icons, themes (XML)
      ├─ test/                   local unit tests (JVM)
      └─ androidTest/            instrumented tests (device)

app/build.gradle.kts

plugins {
    alias(libs.plugins.android.application)
    alias(libs.plugins.kotlin.android)
    alias(libs.plugins.kotlin.compose)          // Compose compiler (Kotlin 2.0+)
    alias(libs.plugins.kotlin.serialization)
    alias(libs.plugins.ksp)                     // annotation processing for Room
}

android {
    namespace = "com.example.myshop"
    compileSdk = 35

    defaultConfig {
        applicationId = "com.example.myshop"
        minSdk = 24
        targetSdk = 35
        versionCode = 1
        versionName = "1.0"
    }
    buildFeatures { compose = true }
    compileOptions {
        sourceCompatibility = JavaVersion.VERSION_17
        targetCompatibility = JavaVersion.VERSION_17
    }
    kotlinOptions { jvmTarget = "17" }
}

dependencies {
    implementation(platform(libs.androidx.compose.bom))
    implementation(libs.androidx.material3)
    implementation(libs.androidx.activity.compose)
    implementation(libs.androidx.lifecycle.viewmodel.compose)
    implementation(libs.androidx.lifecycle.runtime.compose)
    implementation(libs.androidx.navigation.compose)
    implementation(libs.androidx.room.runtime)
    implementation(libs.androidx.room.ktx)
    ksp(libs.androidx.room.compiler)
    implementation(libs.retrofit)
    implementation(libs.retrofit.kotlinx.serialization)
    implementation(libs.okhttp.logging)
}

MainActivity

An Activity is one entry point with a window. With Compose, most apps have a single MainActivity and switch screens with Navigation.

class MainActivity : ComponentActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        enableEdgeToEdge()
        setContent {
            MyShopTheme {
                Scaffold(modifier = Modifier.fillMaxSize()) { innerPadding ->
                    ShopNavHost(modifier = Modifier.padding(innerPadding))
                }
            }
        }
    }
}
Lifecycle callbackCalled when
onCreateactivity is created (also after rotation): set content here
onStart / onStopbecomes visible / no longer visible
onResume / onPausegets / loses focus
onDestroyfinishing or being recreated (rotation, language change)

Note: On rotation the Activity is destroyed and recreated. Keep screen data in a ViewModel, which survives configuration changes.